Written on 1:28 下午 by Yu Lai
引述自 Personal Fitness Training Theory & Practice 嗯,一般論都是運動後短時間內不應該吃東西,我來提一點不一樣的看法。 其實在運動之後,全身血液的分配會產生暫時性的變化,肌肉充血,而相對的流到脂肪細胞的血就少了。因為血量分配的改變,血中的養分對肌肉與脂肪細胞的分配也會改變,這樣的情況會在半小時內很快的恢復正常。 在有個動物實驗中,運動後的動物被分成兩組,一組在運動後立即給食物,另一組則在四小時候才餵食,十個星期後在體重上雖無顯著差異,但對動物身材卻有顯著影響。立即餵食的動物脂肪組織比延遲餵食的動物脂肪組織重量少24%,且肌肉組織重量增高。該研究的結論是運動後肌肉對養分的競爭力增高,對能源儲存的分配造成明顯的影響。 在人體實驗中也有相似的結果,運動後的肌肉組織對醣類的儲存能力,以及蛋白質的合成能力都暫時增加,但這樣的能力這會在兩小時內明顯減退。另外,肌肉對三酸甘油脂的吸收能力優勢可以維持六個小時。 站在這個立場,運動後的半小時內其實是攝取食物的黃金時段,身體在這時給了一個把脂肪組織打入冷宮的時間,不趁此時更待何時?此外,運動中身體裡的肝醣被大量消耗,因此身體會處在低血醣的狀態,不適時補充一些營養的話,等於為身體準備了一個適合分解肌肉的環境,還維持好幾個小時...你運動是練心酸的嗎?Orz 運動中是消耗,運動完當然要補充。惟補充的應該是一些好吸收消化的東西。另外,絕不可因為『太餓』而過量,這應該很多先賢提過了,所謂運動後馬上吃東西會胖都是因為吃太多...
Posted in
知識
|
Written on 12:44 下午 by Yu Lai
最近在幫同事debug所遇到的zombie process的問題,Survey了一些心得,就po上來囉。 自Advanced Programming in the Unix Environment這本書: The process that has terminated, but whose parent hasn't yet waited for it. 簡單的說,所謂zombie process(殭屍行程)的成因,在於某子行程已結束,但其父行程(parent process)並未取得該行程之結束狀態,則該行程就會變成zombie process,直到其父行程呼叫wait()取得該行程結束狀態。 Zombie process會造成kernel內部有多餘的一筆process資料儲存,佔了一筆資料量(process id, termination status, the amount of CPU time taken by the process等等資訊),但其卻已經結束了,若是系統load很高,造成的影響就更大了,譬如process數量到達上限,又發生有zombie process,可能就會產生無法執行程式的問題。因此我們必須避免zombie process的產生。 解決的方法之一就是利用Linux會在一個process的父行程結束時,自動把該行程的父行程變成init,也就是讓該process由init接管。因此,假設我們的父行程必須作自己的事情,並不想wait子行程結束而block時,我們可以利用兩次fork,讓第一次fork的process馬上結束,則第二次fork的grandchild將會自動變成init的子行程,這樣一來,最原先的行程將不必在作wait的動作,而該行程從此也跟第二次fork出來的行程毫無親屬關係了。兩者各作各的,誰先結束並不會影響對方。這就是fork兩次的用意:
if pid = fork() //parent waits for first child to exit waitpid(pid); parent does things here... else //child if fork() //child exit; else //granchild grandchild does things here...
Posted in
技術 ,
Linux
|
Written on 11:07 上午 by Yu Lai
就是我右邊E-mail那個圖示的產生器囉, 在寫了前三篇後才發現忘了把這個Tool寫個Note啦。http://services.nexodyne.com/email/
Posted in
工具
|
Written on 11:02 上午 by Yu Lai
PocketMod 網站提供了一項非常有趣且特殊的服務, 您可以在線上設計自己的口袋型記事本,包含封面、 封底一共八頁,僅需使用一張 A4 的紙就可以完成。http://www.pocketmod.com/app/index.html
Posted in
工具
|
Written on 11:00 上午 by Yu Lai
Stripe Generator 為一款很有趣的線上工具, 它能夠讓你在線上產生條紋樣式的背景。 可以設定的選項非常多,包含寬度、顏色、樣式、背景顏色、條紋方向等等。http://www.stripegenerator.com/
Posted in
工具
|
Written on 10:55 上午 by Yu Lai
就像我blogger右邊Link那邊E-mail的圖示一樣, 這個可以產生Domain Name的圖示。http://phorum.com.tw/Generator.aspx
Posted in
工具
|
Written on 10:20 上午 by Yu Lai
原文出處:http://blogs.myoops.org/lucifer.php/2007/04/04/p54
作者:朱學恆
你知道嗎?
請先看完這段影片吧!
2006年,位在科羅拉多州的一所默默無聞的公立高中Arapahoe剛結束暑假;新學期開始的時候,校長請該校科技中心的負責人Karl Fisch為老師們解說一下目前教育界的技術發展和趨勢。正好Arapahoe高中獲得了一筆基金會的贊助,幫學校換了兩百多台的電腦,於是Karl就決定以讓老師瞭解未來趨勢的角度來製作一套投影片,希望他們可以知道自己面對的是什麼樣的挑戰,並且進而能夠讓高中生們面對這樣的改變。Karl從書籍、網路、政府資料中整理出了一些數據,並且用淺顯易懂的比喻加入投影片中。(這些數據來自於「世界是平的」作者、教育界的知名人士、美國前教育部長、美國勞工部、麻省理工學院等等……)
在做好影片,配上音樂之後,他把這個影片取名為「Did you know?」;在校內老師面前第一次播放的時候,他還覺得忐忑不安,但幸好底下老師的反應很不錯,讓他覺得這影片似乎達成了他想要傳達的效果。
不過,他錯了。這達成的效果比他想像的還要大。
過了幾天之後,他把這段投影片放到自己的Blog上面供大家觀看。
立即有來自各地的使用者對這投影片感興趣,要求授權讓他們使用在不同的地方。熱心的使用者將檔案改編,重整,上傳到Youtube上和提供各種不同的格式。其他人則是轉寄、上課時播放給自己的學生看,研討會時拿來作引言……
到了現在,這個影片光是在Youtube上就有超過十種版本,將近兩千人把它加為最愛,三百多則對這個內容感到震撼的留言,全部瀏覽人次超過五十萬人以上。(這還不包括在網路以外的地方觀看的人數)
而我看到這影片的時候是在美國休士頓的Rice大學,現場聚集了全美知名學府的研究者,還有許多來自世界各地的學術界人士;掌握上億美金基金會教育經費的計畫負責人在會議一開始的時候一句話也不說的直接開始播放這個影片。
我們必須教導現在的學生,畢業後投入目前還不存在的工作... 使用根本還沒發明的科技... 解決我們從未想像過的問題。
影片播放完之後,現場一片寂靜,而她繼續接道:「轉變,正在發生。各位,我們所推廣的開放教育就是在為了這個趨勢作準備……」
當天,我就把這個影片重新翻譯成中文,請台灣的義工進行轉檔和影片製作,傳上了Youtube。http://www.youtube.com/watch?v=xj9Wt9G--JY
(來看看吧!)
這個影片之所以讓人感到震撼,並不是因為它使用了華麗的特效或擁有超級大明星的陣容。它的震撼之處在於其中所引述的都是事實。它讓現在是世界第一強國的美國中教育界的佼佼者感到震撼,更讓環境、資源遠遜於美國的我感到震撼,我更覺得「我們」(父母、師長、教育家、政策決定者、立法行政官員)都應該一樣感到震撼。
美國前教育部長Richard Riley認為... 2010年最迫切需要的十種工作,在2004年時根本不存在。
因為這世界演變的快速已經遠超過我們的想像,我們本來應該要引導、協助新的世代面對這個劇烈變動的世局。但我們武器配備落後、訓練薄弱,更有各種各樣的強大的敵人虎視眈眈……我們和這些新的世代真的做好準備了嗎?
任天堂光是在2002年就投資一億四千萬美金進行研發。 美國聯邦政府花在教育研發上的經費還不到一半。
確實,驚天動地,以十倍速爆炸成長的事件正在發生。傳統的學習與教育系統都面對了最嚴苛的挑戰,對企業的忠誠度降低、對科技的依賴度增加,科技的進步又讓不會使用科技的人更加弱勢和絕望……
根據估計,《紐約時報》一週所包含的資訊量... 比十八世紀一個人一生可能接觸到的資訊量還要多。
這是一段真實的故事:紐約時報在2007年4月2號的科技版用不小的篇幅報導了我們進行的開放式課程翻譯計畫。而這個記者是在Youtube上面看到台灣一家虛擬媒體製作公司對我們訪談的影片,因此而對我產生興趣,這才找上我的。
隨即,新聞登出第二天我收到一封請求我幫忙的信件,寄信者是在看到報導之後在網路上找到我的Email而寄信過來請我幫忙翻譯麻省理工的一個網路廣告相關計畫。
這個人叫做Andreas Ramos,他是矽谷一家新創公司Position2的執行長。這家公司的工作是網路廣告代理搜尋最佳化。(聽起來很繞口對吧!)他的工作是把客戶所購買的搜尋引擎廣告效果最佳化。Google贊助了麻省理工價值四十五萬美金的網路廣告,但關鍵字和必須由他們自行管理。所以,麻省理工找上了Andreas Ramos,而他額外替麻省理工編寫了48,548個額外的關鍵字,並且透過演算法和網路行銷的技巧進行全球化的推廣。
結果呢?這些廣告每天的點閱次數從52次增加到17,650次,每次點閱所花費的廣告費用降為十分之一……
這個故事完全是真實的,但不過三到四年前,這裡面的技術、工作和機會,幾乎是完全不存在的。
所以,如果你的孩子不想當醫生、不想當太空人,而告訴你他們想要當網路廣告搜尋最佳化工程師的時候,你該怎麼辦?
對於這樣劇烈的跳躍和變化,我認為,知識的自由分享和創意是最重要的解決方案。(也因此我才要投入自己的時間和金錢進行開放式課程的推廣與分享)
唯有知識可以自由分享,人類才能夠創造出更多的知識,解決更多的問題,作出更正確的選擇。想想看,如果這個社會上的階級區分成「有錢」接受教育和「沒錢」接受教育這兩種;這還有什麼平等可言?
唯有跳躍性思考的創意才能夠迎接十倍速變化的世界。孩子們擁有結合包容和遠見的創意,才能看穿下一個世代的循環。線性按部就班的思考模式已經趕不上整個世界局勢的變化,唯有跳躍、不受傳統規則束縛、激烈變革,直接得出結論的創意訓練才能夠及時提出解決方案。
在中國,智商排名前四分之一的人... 比北美洲的總人口還要多。 對全世界老師的意義:他們的優秀學生,比我們所有的學生還要多。
這些驚天動地的轉變正在發生,你已經知道了,然後呢?
(本文歡迎隨處轉貼、轉寄,僅需註明出處和作者即可)
Posted in
醒思
|
Written on 5:48 下午 by Yu Lai
http://script.aculo.us/ 這裡有許多現成的JavaScript Library,有需要的話還蠻實用的啦。
Posted in
技術 ,
JavaScript
|
Written on 11:05 上午 by Yu Lai
這是在 Hemidemi 看到的,原文在: Top 20 replies by Programmers to Testers when their programs don't work。翻譯如下: 第 20 名:這很奇怪喔。 第 19 名:以前從來不會這樣啊! 第 18 名:昨天明明會動的啊! 第 17 名:怎麼可能~ 第 16 名:這一定是機器的問題。 第 15 名:你到底是打了什麼才讓程式當掉的? 第 14 名:一定是你的資料有問題。 第 13 名:我已經好幾個禮拜沒碰那一段程式了。 第 12 名:你一定是用到舊版了。 第 11 名:一定是巧合!為什麼這種壞運氣只讓你碰上。 第 10 名:我不可能什麼功能都測試到吧,有 bug 是正常的! 第 9 名:這個不可能是那個的原始碼! 第 8 名:這程式應該是會動的,只是我寫好後還沒做測試。 第 7 名:可惡!一定有人改了我的程式。 第 6 名:你有檢查過你的電腦有沒有病毒嗎? 第 5 名:儘管這功能還不能動啦,你覺得他如何? 第 4 名:在你的系統不能用那一個版本的程式啦! 第 3 名:你幹嘛要那樣操作,都是你的問題。 第 2 名:程式發生問題時你在哪裡? 第 1 名:在我的機器明明就可以動啊! 所以說嘛!可以做人,幹嘛來寫程式呢?
Posted in
閒聊
|
Written on 7:16 下午 by Yu Lai
最近工作較忙,久久未更新內容。 今天剛好拿到公司發的新NB,是T60唷(爽~!)。 再來應該會比較常上來更新啦,希望希望(遠目)。
Posted in
閒聊
|
Written on 3:42 下午 by Yu Lai
今天Intel正式授權FreeBSD可以使用旗下Wireless Chipset的Firmware. 包含: Intel 2100, 2200BG, 2225BG, 2915ABG, and the 3945ABG devices 這是一大福音阿, 尤其嘉惠要在FreeBSD上面做無線網路研究的人, 以前notebook上面跑FreeBSD都得要望centrino興嘆 (不然就是得用 其他方式啟動, 而且不太穩定) 現在有了官方的直接support, 實在太棒了 :D 有網頁有真相: http://www.prweb.com/releases/2007/03/prweb509818.htm
Posted in
技術 ,
FreeBSD ,
Network
|
Written on 10:43 上午 by Yu Lai
在去年有一篇英文的數字單位 ,今天在整理時順便找到了中文的數字單位,以下就是參考wikipedia的內容所整理出來的。
十進位漢字對照表 100 一 101 十 102 百 103 千 104 萬 105 十萬 106 百萬 107 千萬 108 億 109 十億(吉) 1010 百億 1011 千億
1012 兆(萬億) 1013 十兆 1014 百兆 1015 千兆(拍) 1016 京 1017 十京 1018 百京(艾) 1019 千京 1020 垓 1021 十垓(澤) 1022 百垓 1023 千垓
1024 秭(堯) 1025 十秭 1026 百秭 1027 千秭 1028 穰 1029 十穰 1030 百穰 1031 千穰 1032 溝 1033 十溝 1034 百溝 1035 千溝
1036 澗 1037 十澗 1038 百澗 1039 千澗 1040 正 1041 十正 1042 百正 1043 千正 1044 載 1045 十載 1046 百載 1047 千載
1048 極 1049 十極 1050 百極 1051 千極 1052 恆河沙 1053 十恆河沙 1054 百恆河沙 1055 千恆河沙 1056 阿僧祇 1057 十阿僧祇 1058 百阿僧祇 1059 千阿僧祇
1060 那由他 1061 十那由他 1062 百那由他 1063 千那由他 1064 不可思議 1065 十不可思議 1066 百不可思議 1067 千不可思議 1068 無量大數 1069 十無量大數 1070 百無量大數 1071 千無量大數
1072 Espana 1073 十Espana 1074 百Espana 1075 千Espana 1076 1077 1078 1079 1080 1081 ...... ...... 10100 Googol
十退制漢字對照表 100 一 10-1 分 10-2 厘 10-3 毫 10-4 絲 10-5 忽 10-6 微 10-7 纖 10-8 沙 10-9 塵(納) 10-10 埃 10-11 渺
10-12 漠(皮) 10-13 模糊 10-14 逡巡 10-15 須臾(飛) 10-16 瞬息 10-17 彈指 10-18 剎那(阿) 10-19 六德 10-20 空虛 10-21 清靜(仄) 10-22 阿賴耶 10-23 阿摩羅
10-24 涅槃寂靜(攸) 10-25 10-26 10-27 10-28 10-29 10-30 10-31 10-32 10-33 10-34 10-35
10-36 10-37 10-38 10-39 10-40 10-41 10-42 10-43 10-44 10-45 10-46 10-47
10-48 10-49 10-50 10-51 10-52 10-53 10-54 10-55 10-56 10-57 10-58 10-59
10-60 10-61 10-62 10-63 10-64 10-65 10-66 10-67 10-68 10-69 10-70 10-71
10-72 10-73 10-74 10-75 10-76 10-77 10-78 10-79 10-80 10-81 10-82 10-83
註:
厘 亦作釐 。毫 亦作毛 。漠 是正確寫法,而莫 不是。比漠 微細的,是自天竺的佛經上的數字。而這些「佛經數字」已成為「古代用法」了。
Posted in
知識 ,
閒聊
|
Written on 9:15 上午 by Yu Lai
最近本來很低調的FTP因為流量越來越大導致不怎麼低調了。 所以只好去Survey了幾個低調的做法。考慮了許多effort因素 最後採用的就是使用Round Robin DNS技術將流量打散在許多 IP上,也是目前蠻常見的低成本負載平衡。至於成效目前還未知 ,但我想應該是還不錯的啦。 以下是在Bind上設定Round Robin DNS的一些notes:
;Dynamic FTP by Round Robin DNS dynftp 0 IN A 192.168.123.101 dynftp 0 IN A 192.168.123.102 dynftp 0 IN A 192.168.123.103 ...其中,dynftp的A-Records即為Round Robin設置,
0為TTL(Time to live),單位為秒。若DNS Server因此
Loading過重,可酌量提高TTL數值。
Posted in
技術 ,
Network
|
Written on 11:26 上午 by Yu Lai
今天臨時想到把template改成類似Mac的金屬面板 XD
Posted in
閒聊
|
Written on 5:37 下午 by Yu Lai
今天在搞net-snmp所提供的mib2c tool, 用起來說實在的實在有點難用。 大概是我對它還不太熟的關係吧。 以下是今天弄的一些心得: (因為開發需求,所以設定prefix為/opt/net-snmp。) 1. 首先,在安裝net-snmp時,需在configure時加入以下參數
$ ./configure --prefix=/opt/net-snmp/ --enable-embedded-perl --enable-shared --with-perl-modules $ make $ make test # make install (should be root)2.
在確定PATH設定好後,執行mib2c時,
通常會遇到訊息說沒有安裝Perl SNMP Module,
這是因為我們在configure時有設了prefix的關係,
導致perl找不到share library。
解決的方法是將net-snmp的lib目錄設定給ldconfig知道即可。
# echo /opt/net-snmp/lib > /etc/ld.so.conf.d/net-snmp.conf # ldconfig -v3.
最後就是mib2c操作方法,
據mib2c的manpage裡說明,
mib2c的功用是產生template code給agent來擴充功能使用。
Usage為
mib2c [-h] -c CONFIGFILE [-I PATH] [-f OUTNAME] [-i][q][-S VAR=VAL] MIBNODE 而mib2c的使用方法是以mib node為parameter來開始生成template code。
所以必須先將mib file放置在$HOME/.mibs/或/opt/net-snmp/share/snmp/mibs,
然後在環境變數中設定MIBS,
export MIBS=+NET-SNMP-TUTORIAL-MIB 接著麻煩的在這裡,
你必須依著你的的mib node來選定所產生的template code的CONFIGFILE。
下面是CONFIGFILE所支援的類型:
如果你要寫些scalars所需的code,請用:
mib2c -c mib2c.scalar.conf MIBNODE 如果你要用int scalars,請用:
mib2c -c mib2c.int_watch.conf MIBNODE 一般來講Table是建議採用MDF:
mib2c -c mib2c.mfd.conf MIBNODE 如果Table Data是在外部時:
mib2c -c mib2c.iterate.conf MIBNODE 如果Table Data是在agent裡:
mib2c -c mib2c.create-dataset.conf MIBNODE 承上,如果還需排序時:
mib2c -c mib2c.array-user.conf MIBNODE 如果是要產生Table上任一Column的header時:
mib2c -c mib2c.column_defines.conf MIBNODE 如果是要產生Column上任一Enum的header時:
mib2c -c mib2c.column_enums.conf MIBNODE 4.
結論,大概就是麻煩吧。
Net-SNMP不像其他商用的SNMP套件一樣提供簡易的開發擴充功能的環境,
像在EMANATE中打一個make就ok了,連型態都自動判斷。
不過也許是我對mib2c還不太熟的關係吧,Orz。
Posted in
技術 ,
Network
|
Written on 7:40 下午 by Yu Lai
本文出處: www.jollen.org 已取得原作者授權使用 《Jollen的Root Filesystem建置技術系列》 製作ARM9的Bootstrap Root Filesystem 作者/陳俊宏 http://www.jollen.org 更新日期:2007/1/23 在「完整註明出處」的前提下(註明方式說明),您能立即擁有轉貼與引用的授權,且毋需知會作者。 目的 製作 bootstrap root filesystem(base root filesystem)以提供一個最簡單、陽春且可開機的環境;製作完成的系統可開機到shell模式,並可使用 busybox 提供的指令。 準備工作 首先,您必須準備一台 host 開發環境,並安裝好 cross toolchain;接著,由於本文是做實機測試,因此,如果您沒有 ARM9 開發板,可以考慮使用 Qemu 來做模擬測試。 以下的操作示範,只節錄重點指令片段,您可能必須根據自己的整體實作流程,來微調指令的順序,或是參數等。 Step 1:建立工作目錄 建立一個專用的工作目錄,命名為 arm9.so-busybox/: # mkdir arm9.so-busybox/ # cd arm9.so-busybox/ 接著在 arm9.so-busybox/ 目錄下建立 4 個子目錄: # mkdir src/ install/ mnt/ pub/ build/ 實際進行 root filesystem 實作時,我們應該養成將檔案分類擺放的好習慣。以本專案為例,build/ 目錄用來編譯程式,src/ 目錄用來存放原始程式碼,install/ 目錄則用來擺放我們最後的 root filesystem。 Step 2:建立目錄架構 根據 FHS 的目錄架構標準,在 root filesystem 目錄下(install/)建立目錄階層架構: # cd install/ # mkdir bin/ dev/ etc/ mnt/ proc/ sbin/ usr/ 另外還有二個必要的目錄:/var 與 /tmp,由於這二個目錄都需要具備寫入權限,所以在這裡我們是以 ramdisk 的做法來 mount 這二個目錄。 Step 3:建立裝置檔 在 root filesystem 的 dev/ 目錄下建立必要的裝置檔: crw------- 1 root root 5, 1 1月 1 1970 console crw------- 1 root root 29, 0 1月 1 1970 fb0 crw------- 1 root root 1, 3 1月 1 1970 null brw------- 1 root root 1, 0 1月 1 1970 ram0 crw------- 1 root root 5, 0 1月 1 1970 tty crw------- 1 root root 4, 0 1月 1 1970 tty0 此階段使用 mknod 指令來完成。請先切換到 root filesystem 的 dev/ 目錄下,接著執行以下指令: # mknod console c 5 1 # mknod fb0 c 29 0 # mknod null c 1 3 # mknod ram0 1 0 # mknod tty c 5 0 # mknod tty0 c 4 0 對於需要產生大量 device file 的場合來說,可以改用 genext2fs 的 ‘-D’ 參數來製作。詳見 Jollen’s Blog:[使用 genext2fs 的 '-D'(device file table)來建立 root filesystem]。 Step 4:加入Busybox 編譯並安裝 Busybox(動態程式庫方式)。將取得的Busybox原始碼解壓縮至 project 目錄裡的 src/ 子目錄下,以下是幾個注意事項: 本教學文件使用 Busybox 1.3.1 Busybox 1.3.0 開始,使用 Linux Kernel 的 Makefile(因為開始支援 CONFIG_DESKTOP)。Cross compile 時,需要修改 Makefile 如下: ARCH ?= arm CROSS_COMPILE ?= /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu- CROSS_COMPILE 的設定是 cross toolchain 的「PREFIX」,視您的 toolchain 而定。您可由 http://www.jollen.org/kit/ 下載本文所使用的 GCC 3.4.1 ARM9 toolchain,以使用與本文完全相同的修改。 Busybox 整合了常用的指令與工具,我們可以設定 Busybox,以勾選我們需要的功能選項。進入 Busybox 的設定選單: # make menuconfig 請注意,init 與 shell 是必選的項目,請檢查是否有勾選這二個功能。同時,也別忘了設定 Busybox 的安裝路徑,將安裝路徑指到我們 root filesystem 目錄下。 接著直接進行編譯(cross compile): # make 編譯完成後,將 Busybox 安裝至我們的 root filesystem 目錄(即 Step 2 的 install/ 目錄): # make install 此時,您應該可以在 root filesystem 目錄下看到 Busybox 所安裝的檔案。 Step 5:加入動態程式庫 編譯完成的 Busybox 已經是給 ARM9 執行的格式了,但我們的編譯設定是將Busybox 編譯成 shared library 架構,因此 Busybox 執行時需要以下的檔案: ˙ libc.so.6:C library標準程式庫。 ˙ ld-linux.so.2:Native dynamic loader。 請由 toolchain 將以上二個檔案複製至 root filesystem 的 lib/ 目錄下: # cd ../../install (切換至root filesystem根目錄) # cp /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/ld-linux.so.2 lib/ (複制native dynamic loader。以上命令請勿斷行) # cp /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libc.so.6 lib/ (複製C library。以上命令請勿斷行) Busybox 會因版本與功能選項設定的差異,而需要更多的程式庫。請使用 cross toolchain 的 objdump 指令來檢查 Busybox 的程式庫相依問題(無法使用 ldd 指令),並將所需的程式庫由 toolchain 複製到 root filesystem 的 lib/ 目錄下。 Step 6:加入系統檔案 加入2個重要的系統檔案於 etc/ 目錄下: ˙ fstab:mount table。 ˙ inittab:系統初始表(init table)。 etc/fstab內容如下: /dev/ram0 / ext2 defaults 1 1 none /proc proc defaults 0 0 /dev/ram1 /tmp ramfs defaults 0 0 /dev/ram2 /var ramfs defaults 0 0 fstab 第一行設定,目的在將 /dev/ram0 重新附掛成 ‘/’(root),此動作用意在於重新指定 ‘/’ 的檔案系統為 ext2。最後二行的目的是為了以 ramfs 來 mount 重要的二個目錄:/var 與 /tmp;如此一來,就算開機沒做 remount root(詳見後文說明),也能對 /tmp 與 /var 目錄做寫入的動作 etc/inittab內容如下: :0:sysinit:/etc/rc.d/rc.init :0:respawn:/bin/sh 根據這個 inittab 設定,當系統開機後便會進入 run level 0,在 run level 0 模式下,init process會執行2個動作:(1) 執行 /etc/rc.d/rc.init,此即「init script」;(2) 執行 /bin/sh,即進入 shell 模式。 在此我們並沒有參照 LSB 的標準來設定 run level,而且也沒有使用 getty 來讓使用者登入(多使用者模式)。 Step 7:編寫 Initial Script 根據 inittab 的設定,我們 root filesystem 的 init script 位於 /etc/rc.d/rc.init。以下提供一個供 Embedded Linux 使用的 init script 範本: #!/bin/sh # automount (/etc/fstab) mount -a # remount root mount -o remount rw / # mkdir /var/lock mkdir /var/lock/subsys mkdir /var/run # start other applications (Running application automatically during # booting up. # eg. /bin/thttpd –p 80 –d /var/www 當我們執行「mount –a」後,mount 便會去讀取前一步驟所設定的 fstab,並根據此表格的內容來做 mount 的動作。另外,這裡有一個 remount 的動作: # mount -o remount rw / 此動作的目的是將 root(’/’)重新 mount 成可讀寫,此動作是選擇性的,若省略不做,請務必保持 /var 與 /tmp 目錄是能寫入的(建議以 ramdisk 方式實作為佳)。 若 root filesystem 未包含 inittab 設定檔,則 Busybox 會使用以下的內建設定: ::sysinit:/etc/init.d/rcS ::askfirst:/bin/sh ::ctrlaltdel:/sbin/reboot ::shutdown:/sbin/swapoff -a ::shutdown:/bin/umount -a -r ::restart:/sbin/init 不過,還是建議編寫自己的 inittab 設定檔。 Step 8:製作 Root Filesystem 映像檔(Image File) 截至目前為止,我們的檔案系統已經擁有基本的系統指令與工具。接下來,我們即可將建置完成的 root filesystem 製作成 ext2 格式的映像檔。 以下提供二種 ext2fs image file 的製作方式:(1) 土方法;(2) 使用 genext2fs 工具。 先說明傳統的土方法。首先,先利用dd指令做出一個空白的檔案,大小為 4M(bytes): # dd if=/dev/zero of=ext2fs bs=1k count=4096 我們將檔案命名為 ext2fs,接著再將 ext2fs 製作成 ext2 格式的檔案系統: # mkfs.ext2 ext2fs mke2fs 1.32(09-Nov-2002) ext2fs is not a block special device. Proceed anyway?(y,n)y 選擇y後出現以下畫面: Filesystem label= OS type: Linux Block size=1024(log=0) Fragment size=1024(log=0) 128 inodes, 1024 blocks 51 blocks(4.98%)reserved for the super user First data block=1 1 block group 8192 blocks per group, 8192 fragments per group 128 inodes per group Writing inode tables: done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 26 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. 到這裡我們已經做好一個檔案格式為 ext2 的空白映像檔,再來只要將先前做好的 root filesystem 全部複製到 ext2fs 映像檔「裡面」即可。 先將 ext2fs 附掛至任一空目錄,例如 mnt/: # mkdir mnt/ # mount -t ext2 -o loop ext2fs mnt/ (指定檔案系統為 ext2) 複製檔案系統時,我們不使用 cp 指令,而是利用 tar 來完成: # cd install/ # tar cz * > ../install.tar.gz (將檔案系統做成tarball,同時也備份 root filesystem。) # cd .. # cd mnt/ # tar zxvf ../install.tar.gz (再將tarball解至映像檔) 接著將映像檔 umount 並壓縮即可: # cd .. # umount mnt/ # gzip -9c ext2fs > pub/ext2fs.gz 最後得到的 ext2fs.gz 即是完成品。請注意,若不使用 tar 來說,也應該使用 cpio 來複製檔案,避免使用 cp 指令。 使用 genext2fs genext2fs 是一個 ext2 filesystem image file 的製作工具,可以讓我們很方便地將 root filesystem 製作成 image 檔。請由 genext2fs 的官方網站下載原始碼套件: http://genext2fs.sourceforge.net/ 編譯後可以取得 genext2fs 檔案,以下是將 install/ 目錄製作成 ext2fs image 檔的指令: # genext2fs -b 8192 -i 1024 -d install/ ext2fs 執行後,會得到檔名為 ext2fs 的 image 檔,大小為 8 MB(透過 ‘-b’ 參數指定 image file 大小);接著同樣再用 gzip 將 ext2fs 檔壓縮即可。 Step 9:在 Target 端做測試 本步驟以 Jollen-Kit! 為例,Jollen-Kit! 是由 www.jollen.org 所推出的 ARM9 training board,詳細介紹請參考 [http://www.jollen.org/kit/]。請注意,本階段的操作,視 target device 的不同而不同,因此以下示範只適用於 Jollen-Kit! 或是其他的 SMDK2410 平臺。 步驟 8 所得到的 ext2.gz 必須再包裝成 U-Boot 的格式,才能透過 U-Boot 載入到 RAM,以成為 kernel 的 initial ramdisk(initrd): # mkimage -A arm -O linux -T ramdisk -C none -a 0x30800000 -e 0x30800000 -n ramdisk -d ext2fs.gz urootfs.img 執行後可得到 urootfs.img 檔案,在測試階段為了方便起見,我們可以直接將 urootfs.img 載到 RAM 做測試;U-Boot 指令如下: jollen.org # tftpboot 32000000 urootfs.img; tftpboot 30F00000 uimage.img; bootm 30F00000 32000000 urootfs.img 是我們製作的 root filesystem,uimage.img 則是給 Jollen-Kit! 使用的 Linux kernel(pre-built)。
Posted in
技術 ,
Embedded ,
Linux
|
Written on 9:08 上午 by Yu Lai
[轉自Experiences of Code (http://blog.csdn.net/zblue78)] 學習使用SkyEye仿真 -------------------------------------------------------------------------------- SkyEye是一個可以運行嵌入式操作系統的硬件仿真工具,這樣就可以在沒有硬件條件下來進行嵌入式系統的開發。 以下操作均在Fedora Core 1.0里通過。 Skyeye項目資源列表 http://gro.clinux.org/projects/skyeye/ 文檔摘要: 1、什麼是SkyEye? 2、SkyEye可以做什麼事情? 3、安裝SkyEye 4、安裝arm-elf交叉編譯器 5、測試你的arm-elf-gcc編譯器 6、執行你的hello程序 7、編譯並運行uClinux-dist-20030909.tar.gz 8、加入網絡功能 9、安裝完成SkyEye後,下一步將做什麼? 1、什麼是SkyEye? SkyEye是開源軟件的一個項目,SkyEye的目標是在Linux和Windows操作系統裡提供一個完全的仿真環境。SkyEye仿真環境相當於一個嵌入式計算機系統,你可以在SkyEye裡運行一些嵌入式Linux操作系統,如ARMLinux,uClinux,uc/OS-II(ucos-ii)等,並能分析和調試它們的源代碼。 如果你想知道關於SkyEye和嵌入式系統更詳細的信息,請訪問下面的站點: www.SkyEye.org http://www.skyeye.org/index_cn.html 通過SkyEye能仿真下面的硬件: CPU核心:ARM7TDMI, ARM720T, ARM9, StrongARM, XScale CPU: Atmel AT91/X40, Cirrus CIRRUS LOGIC EP7312, Intel SA1100/SA1110, Intel XScale PXA 250/255, CS89712, samsung 4510B, samsung 44B0(還不全) 內存: RAM, ROM, Flash 周邊設備: Timer, UART, ne2k網絡芯片, LCD, 觸摸屏等 目前能在SkyEye上運行下面的操作系統和系統軟件: uC/OSII-2.5.x(支持網絡) uClinux(基於Linux2.4.x內核, 支持網絡) ARM Linux 2.4.x/2.6.x lwIP on uC/OSII 基於uC/OSII, uClinux, ARM Linux的應用程序 2.SkyEye可以做什麼事情? 1. 通過SkyEye可以幫助促進嵌入式系統的學習,在不需要額外硬件的情況下學習和分析uclinux操作系統和其它嵌入式操作系統,如ucosII等。 2. SkyEye可用於嵌入式系統的教學。 3. 希望通過skyeye促進操作系統的研究,如ucosII,uclinux+RTAI,uclinux2.5.x等。 4. 可以基於SkyEye進行仿真特定硬件模塊的研究。 5. SkyEye可以作為嵌入式集成開發環境開發嵌入式系統(當然需要對SkyEye做大量的工作)。 註:引自陳渝《SkyEye Project FAQ》 3、安裝SkyEye 到http://gro.clinux.org/projects/skyeye/下載skyeye-0.7.0.tar.bz2包: tar jxvf skyeye-v0.7.0.tar.bz2 進入解壓後的skyeye目錄,如果SkyEye的版本低於0.6.0,則運行下面的命令: ./configure --target=arm-elf --prefix=/usr/local --without-gtk-prefix --without-gtk-exec-prefix --disable-gtktest 如果SkyEye的版本高於0.6.0,則運行下面的命令: ./configure --target=arm-elf --prefix=/usr/local 接下來執行: make make install 安裝完成後執行skyeye 注意: a.如果你使用的是Mandrake Linux發行版,那麼你在編譯SkyEye時遇到錯誤,並且錯誤與readline, ncurse, termcap等有關,你可以試試下面的方法: ln -s /usr/include/ncurses/termcap.h /usr/local/include/termcap.h 接著再make和make install看能否成功! b.如果你的Linux發行版是Debian Linux,那麼不要使用gcc 2.95或是gcc 3.0,請使用gcc 3.2+ c.gcc的版本要在2.96或以上 d.如果SkyEye的版本大於0.6.0,那麼使用LCD仿真需要在Linux系統裡安裝GTK軟件。 4、安裝arm-elf交叉編譯器 下載arm-elf-tools-20030314.sh ftp://166.111.68.183/pub/embed/uclinux/soft/tools/arm 或到 ftp://166.111.8.229/OS/Embeded 執行: chmod a+x arm-elf-tools-20030314.sh 然後: ./arm-elf-tools-20030314.sh ls /usr/local/bin/ 你應能看到以arm-elf開頭的可執行文件,其中arm-elf-gcc就是用來編譯你目標平台的編譯器的,當然還有一些小工具,後面將一一講來。 5、測試你的arm-elf-gcc編譯器 先寫一個小程序hello.c
#include int main(void) { int i; for(i = 0; i < 6; i++){ printf("i = %d ",i); printf("Hello, embedded linux!\n"); } return 0; } 然後執行:
arm-elf-gcc -Wl,-elf2flt -o hello hello.c
-elf2flt參數是將elf文件格式轉為flat文件格式,這個工具是在你安裝交叉編譯器產生的。
或者你可以寫個Makefile文件,執行:
make
這裡是我的Makefile文件,僅供參考:
# begin CC = arm-elf-gcc CFLAGS = -D__PIC__ -fpic -msingle-pic-base -O2 -pipe -Wall -g LDFLAGS = -Wl,-elf2flt LIBS = OBJS = hello.o all: hello hello: $(OBJS) $(CC) $(CFLAGS) $(LDFLAGS) -o hello $(OBJS) $(LIBS) clean: rm -rf *.o *.elf *.gdb hello # end 如果編譯通過,就會產生hello可執行文件。用下面的命令:
file hello
你會發現,它是BFLT(binary FLAT),你目標平台所支持的文件格式。
6、執行你的hello程序
這裡,我們將借助genromfs這個小工具來完成測試,這個工具就是你在安裝交叉編譯器時產生的,你可以直接使用它。
到http://gro.clinux.org/projects/skye...0.4.tar.bz2包:
tar jxvf skyeye-binary-testutils-1.0.4.tar.bz2
cd testsuits/at91/uclinux2(當然你還可以用別的)
mkdir romfs(建一個目錄,後面用)
mount -o loop boot.rom /mnt/xxx
cp -r /mnt/xxx/* romfs
另外,把你編譯好的可執行程序拷貝到/romfs/bin目錄裡,這裡就是hello了!
genromfs -f boot.rom -d romfs/
註:可以用genromf -h來獲得幫助!
OK!執行下面的命令:
skyeye linux
(skyeye)target sim
(skyeye)load
(skyeye)run
kernel start.....
很熟悉了吧。。。
cd /bin
hello
可以看到結果了嗎?
其實到了這一步,你就可以開發自己的程序了!
7、編譯並運行uClinux-dist-20030909.tar.gz
到ftp://166.111.68.183/pub/embed/uclinux/soft/
或到ftp://166.111.8.229/OS/Embeded/uclinux/pub/uClinux/dist下載
uClinux-dist-20030909.tar.gz
假設把它下載到/usr/src/目錄下,然後依次執行下面的命令:
tar zxvf uClinux-dist-20030909.tar.gz
cd uClinux-dist/
在圖形方式下可用命令make xconfig
或
在命令行方式下用命令make menuconfig
vendor/product中選擇GDB/ARMulator
kernel版本選擇2.4
然後save and exit
運行下面這兩條命:
make dep
make
此時在/usr/src/uClinux-dist/linux-2.4.x目錄下會生成可執行文件linux
在/usr/src/uClinux-dist/images/會生成romfs.img等文件
在uClinux-dist目錄下建立仿真AT91的skyeye配置文件skyeye.conf,內容如下:
cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=images/romfs.img
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
這個時候就可以用skyeye來調試運行kernel了,在/usr/src/uClinux-dist執行如下命令:
skyeye linux-2.4.x/linux
(skyeye)target sim
(skyeye)load
(skyeye)run
kernel start.....
注意:
要在skyeye.conf所在目錄下執行skyeye linux-2.4.x/linux
8、加入網絡功能
a.用root用戶進行操作。
b.你要看你的/lib/modules/'uname -r'/kernel/drivers/net/目錄裡有沒有tun.o
如果沒有的話你就需要編譯你的linux內核來獲得tun.o了。
c.(1)運行tun設備模塊:
#insmod /lib/modules/'uname -r'/kernel/drivers/net/tun.o
如果你沒有該設備,那你就要用下面的命令來創建它:
#mkdir /dev/net
#mknod /dev/net/tun c 10 200
(2)運行vnet(虛擬集線器)設備模塊(這一步不是必需的):
獲取vnet的源碼,然後創建設備:
#mknod /dev/net/vnet c 10 201
#chmod 666 /dev/net/vnet
創建vnet.o
#make vnet.o
插入模塊vnet.o
#insmod vnet.o
進入test目錄,用test來測度vnet.o
#cd test
#make
#./testvnet1
d.配置skyeye.conf文件
cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=images/romfs.img
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
# format: state=on/off mac=xx:xx:xx:xx:xx:xx ethmod=tuntap/vnet hostip=dd.dd.dd.dd
net: state=on, mac=0:4:3:2:1:f, ethmod=tun, hostip=10.0.0.1
下面將對上面的一些參數作下說明:
state=on/off意思是仿真的NIC(網絡接口板)是有線的還是無線的;
mac=仿真適配器的MAC地址;
ethmod=tuntap/vnet在主機環境裡使用的虛擬設備;
hostip=意思是主機環境與keyeye交互用的IP
格式: state=on/off mac=xx:xx:xx:xx:xx:xx ethmod=tuntap/vnet hostip=dd.dd.dd.dd
For example:
#set nic info state=on/off mac=xx:xx:xx:xx:xx:xx ethmod=tuntap/vnet hostip=dd.dd.dd.dd
net: state=on, mac=0:4:3:2:1:f, ethmod=tun, hostip=10.0.0.1
或
net: state=on, mac=0:4:3:2:1:f, ethmod=vnet, hostip=10.0.0.1
注意:
如果你想在同一時刻運行兩個或更多的skyeye,那麼請為每一個skyeye使用不同的skyeye.conf
e.運行skyeye linux-2.4.x/linux
9、安裝完成SkyEye後,下一步將做什麼?
1、對於嵌入式操作系統的初學者和入門者和入門的學生而言,他們可以先看一些有關操作系統和嵌入式操作系統方面的教材和書籍,如與uC/OS、Minix、uClinux、Linux相關的書籍等。然後可以在Skyeye上開發一些簡單的應用程序例子(如進程間通信、進程優先級、死鎖情況、網絡應用等),對某些操作系統功能(如進程調度、內存管理、網絡子系統、文件子系統等)進行簡單的修改和擴展,並通過Skyeye進行運行和調試,看看會發生什麼情況。
2、對於有一定經驗的軟件工程師而言,在SkyEye上完成一定的應用系統原型開發是值得一做的事情。比如移植或開發一個文件子系統或網絡子系統到一個特定的操作系統中,相信比在一個真實的開發板上開發要容易一些。在Skyeye上進行一些操作系統的移植和開發(如移植RTLinux、RTAI等其它操作系統到Skyeye上)也是很有挑戰性的工作。
3、對於硬件工程師而言,對Skyeye進行擴充,設計新的硬件仿真(如USB、IDE硬盤等)使得Skyeye的硬件仿真功能更加強大,支持更多功能的軟件,是很有意義的事情。
參考:
SkyEye項目站點裡的一篇中文文檔;
陳渝《SkyEye Project FAQ》;
skyeye-0.7.0中的README文檔。
後記:
為了讓大家能快速上手,進行實際的開發工作,我趕湊了一篇文檔,很粗糙。但我堅信隨著更多的有經驗的人的加入;隨著我們自己水平的提高,一定會出現更多、更好的文章來。就讓我們快點行動起來吧!
最後,我再次建議大家看一下《嵌入式Linux技術與應用》這本書。
可以到http://www.skyeye.org/document.htm或是
ftp://166.111.68.183/pub/embed/skyeye/document/或是
http://www.huihoo.org/mirrors/skyeye/
下載文檔,可以獲得更多有關skyeye和嵌入式Linux開發的知識和經驗。
Posted in
技術 ,
Embedded ,
Linux
|
Written on 9:00 上午 by Yu Lai
[轉自Experiences of Code (http://blog.csdn.net/zblue78)] 一步一步教你在skyeye上運行uboot by faif 1. 簡介 skyeye是一個很好的,基於各種ARM系列CPU的,SOC和主板級的模擬器。uboot是一個可以在各種cpu(arm,mips,powerpc)的主板上運行的引導程序,相當於PC機的BIOS但是又遠遠的強於普通的BIOS,比如支持網絡引導,引導各種內核,甚至一個簡單的shell,等等。他們兩個都是基於GPL的開源自由軟件。 這篇文章教你怎樣在最少量的修改代碼的情況下,用skyeye模擬EP7312並在上面運行uboot,給接觸嵌入系統的新手一個感性的認識。 2. 建立開發環境 2.1 skyeye模擬器的安裝 開發環境是建立在Linux上的。首先下載安裝skyeyes-0.8.5.1的源代碼包,解壓,按照裡面的readme安裝,注意你的linux要有gtk的支持。安裝的時候要以root的身份。在各種linux發行版下的安裝注意事項參照論壇的相關帖子。安裝成功以後,把skyeye的目標目錄加入你的路徑,這樣你就可以在任何目錄下執行skyeye模擬器了。 2.2 交叉編譯器的安裝 交叉編譯器是運行在主機上編譯另外一種體系結構的編譯器。比如,我的主機是linux在x86上,我現在要編譯基於ARM的代碼,所以我就不能用普通的編譯器而需要交叉編譯器。我曾經試過自己從gcc的源代碼構建交叉編譯器,很麻煩和耗時。uboot的作者同樣也開發了一個很好的交叉編譯器叫ELDK(Embedded linux development kit)。我就使用這個,當然你也可以使用其他嵌入式公司提供的。你可以從以下的網址查看提供ELDK的鏡像: ELDK Availability: http://www.denx.de/twiki/bin/view/DULG/ELDKAvailability ELDK有三個版本分別編譯MIPS,PPC和ARM。我從下面的鏡像下載了基於ARM的交叉編譯器: http://sunsite.utk.edu/ftp/pub/linux/eldk/3.1/arm-linux-x86/iso/ 文件為"arm-2004-11-09.iso",它支持ARM7, ARM9, XScale, AT91RM9200 and other ARM based systems。 安裝交叉編譯器,我將交叉編譯器安裝到自己的目錄「/opt/x86-arm/」裡面: /mnt/cdrom/install -d /opt/x86-arm/ 等待安裝結束以後設置好用戶環境:
export PATH="${PATH}:/opt/x86-arm/usr/bin:/opt/x86-arm/bin" export CROSS_COMPILE=arm-linux-這樣你在任何目錄也可以訪問交叉編譯器了。
測試:
arm-linux-gcc -o testarm test.c file testarm testarm: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), not stripped.說明你編譯好的文件是ARM上的代碼了。你可以用arm-linux-gcc來編譯你的文件了。
3. 修改Uboot
從uboot的網站上可以下載到最新的uboot源代碼,你可以從以下的網址下載
http://u-boot.sourceforge.net/
ftp://ftp.denx.de/pub/u-boot/
uboot的源碼結構清晰,註釋詳細,是學習嵌入系統的很好的例子。我下載的是最新的U-Boot-1.1.2。因為我們要模擬EP7312的芯片,而uboot已經支持一個基於EP7312的板子了,所以我們只要對uboot裡面有關EP7312的板子的配置略作修改就可以了。uboot裡面有關主板的配置文件都在"include/configs/.h"下,所以我們找到include/configs/ep7312.h,對它進行修改。
找到 #define CONFIG_DRIVER_CS8900 1 改為 #define CONFIG_DRIVER_CS8900 0 找到 #define CONFIG_COMMANDS (CONFIG_CMD_DFL | CFG_CMD_JFFS2) 改為 #define CONFIG_COMMANDS (CONFIG_CMD_DFL) /*Skyeye doesn't have jffs2*/然後回到uboot的根目錄下,配置,編譯:
make ep7312_config make all等待結束以後我們會發現u-boot.bin和u-boot兩個文件,其中u-boot.bin是raw的二進制文件。u-boot是ELF格式的。
4. 配置skyeye,並運行uboot
首先,新建一個目錄代表你的EP7312的主板。這樣也可以保持文件的清潔和有序。
mkdir board01將你剛才編譯成功的u-boot.bin拷貝到這個目錄下來。skyeye支持raw binary和ELF的格式,這裡我們用raw binary的格式。
編輯skyeye.conf,這個文件是用來配置主板的,詳細說明見skyeye的相關文檔。我的skyeye.conf如下:
#skyeye config file for uboot cpu: arm720t mach: ep7312 mem_bank: map=I, type=RW, addr=0x80000000, size=0x00010000 #skyeye for uboot flash 16M bank 1 mem_bank: map=M, type=RW, addr=0x00000000, size=0x01000000, file=./u-boot.bin,boot=yes #skyeye for uboot sdram 16m bank 1 mem_bank: map=M, type=RW, addr=0xc0000000, size=0x01000000注意這裡的內存的地址和容量的分配都是根據uboot裡面的ep7312的配置文件調整的。這樣也可以是我們對uboot的代碼修改做到最小。
這時候你的skyeye-ep7312主板就配置好了。你可以試著運行了。在你現在的目錄下打入:
skyeye
然後在skyeye的界面下打入:
target sim run這時候你可以看到uboot的啟動界面,和提示符,如果你鍵入「hlep」,可以查看所有uboot支持的命令,鍵入「version」可以查看當前uboot的版本,等等。
5. 進一步的工作
由於本文是最基本的介紹性的一步一步的指導。有很多工作還要去嘗試。比如:
× 由於現在skyeye還不支持flash內存,所以我們是不是可以修改uboot上ep7312相對flash的代碼來臨時滿足我們的需要,不然的話,對於在uboot上面的環境參數的設置,我們只能去修改源碼裡面的缺省參數。
× Uboot支持8019AS的以太網控制器,skyeye也支持了這個硬件的模擬,我們要進一步的使uboot的網絡也在skyeye上用起來?
× 對於模擬flash的開發也可以用uboot來測試。uboot裡面各種板子有大量的flash驅動程序。
還望各位高手指教,我進一步修改和提高。
Posted in
技術 ,
Embedded
|
Written on 8:53 上午 by Yu Lai
[轉自Experiences of Code (http://blog.csdn.net/zblue78)] 為大家學習的方便,我把這篇文章從基礎版貼過來了。裡面的東西滿有趣的,大家可以試試! 以下是我初次學習嵌入式linux的筆記和體會,製作了軟盤minicom應用,在此基礎上也清楚了軟盤Linux的實現,並利用busybox實際製作了軟盤上的Linux系統。希望能給新手一些幫助和啟發,同時也請高手批評指正。 yihui, eazi@163.com 2004年2月12日 一個典型的桌面Linux系統包括3個主要的軟件層---linux內核、C庫和應用程序代碼。 內核是唯一可以完全控制硬件的層,內核驅動程序代表應用程序與硬件之間進行會話。內核之上是C庫,負責把POSIX API轉換為內核可以識別的形式,然後調用內核,從應用程序向內核傳遞參數。應用程序依靠驅動內核來完成特定的任務。 在設計嵌入式應用的時候,可以不按照這種層次,應用程序越過C庫直接和內核會話,或者把應用和內核捆綁在一起,甚至可以把應用寫為內核的一個線程,在內核中運行,雖然這樣在移植上帶來了困難,但考慮嵌入式系統對尺寸要求小的特點,是完全可行的。不過我們使用三層軟件結構的模式來學習嵌入式linux將會是我們認識更清晰,簡單可行並使應用具有彈性。 快速入門,最簡單的建立嵌入式Linux應用的方法就是從我們使用的桌面Linux入手,安裝一個喜愛的版本,把我們的某個應用作為初始化的一部分,框架就算完成了。當然,嵌入式linux應用遠比我們的桌面版本功能簡單專一,它也許就是一個用於足彩的終端機,或是一個數碼音頻播放器,這些系統除了使用嵌入式CPU外,僅僅再需要一個串口,網口等少量的輸入輸出接口就可以完成它們特定的應用了。在軟件上,它可以按照三層的概念由內核裝載器,定制的內核和較少的為特定任務設計的靜態連接的應用程序組成。之所以使用靜態連接的應用程序,是因為少量的靜態連接程序所要的存儲空間,比同樣數量的動態連接的程序所佔的空間小,這個平衡點需要我們在實際開發中去獲取。也許你正在設計的是個PDA,它的應用程序較多,那麼你很可能就要使用動態連接程序來減少存儲空間。在你的/bin或者/sbin目錄下,用廠列表看看bash,ifconfig,vi...,也許只用幾十K,當你運行 ldd /bin/bash 時,你會看到它們都和好幾個庫文件相連。好了,這樣看來,我們得把PC想像成一個嵌入式硬件平台,再重新製作一個特定功能的嵌入式linux。 再進行實際操作之前,先來搞清楚幾個基礎知識。 內核裝載器Loader,它的作用是把內核從外部存儲器,移動到內存中。它只作這個事情,一旦完成了調入內核的工作,Loader就跳轉到內核位置開始執行。不同架構有不同的Loader,在x86結構的PC上,通常使用的loader有LILO,GRUB,syslinux,syslinux在嵌入式linux中也同樣工作。其他非x86架構的應用中,你必須使用專門的loader,或者自己編寫loader來裝入內核。也有不使用loader的情況,系統加電以後,內核直接從燒錄有映像的Flash上開始執行。 內核,一旦內核開始執行,它將通過驅動程序初始化所有硬件,這可以從我們的pc機監視器的輸出看出來,每個驅動程序都打印一些有關它的信息。初始化完成後,計算機就準備運行嵌入式應用。也許一個,也許是多個應用程序組成了嵌入式應用,但通常首先調用的是init(通過loader 向核心傳入init=/program 可以定制首先運行的程序)。桌面linux中,init會讀取/etc/inittab文件,來決定執行級別和哪些腳本和命令。嵌入式應用中,可以根據實際的情況決定是否使用標準的init執行方式,也許這個init是個靜態程序,它能夠完成我們的嵌入應用的特定任務,那完全不用考慮inittab了。 initrd文件系統,initrd以一種把內核從存儲介質裝入到內存的相同的機制來裝入一個小型文件系統。這個文件系統最好是以壓縮的方式存儲在介質上的,解壓縮到RAM盤上。通過使用initrd,包含有核心驅動和啟動腳本的小文件系統,就可以直接從介質上和內核一起啟動起來,內核屆壓縮這個文件系統,並執行這個文件系統上叫做/linuxrc的腳本文件,這個腳本通常會把啟動過程中所需要的驅動程序裝入。腳本退出以後,initrd文件系統也卸下了,啟動過程進入真正初始化過程。對於嵌入式來講,可以將需要的應用軟件都運行在這個initrd文件系統上,只要/linxrc文件不結束,內核啟動過程的其他部分就不會繼續。 做個試驗:
cp /boot/initrd-2.4.20.img /tmp cd /tmp mv initrd-2.4.2-.img initrd.img.gz gunzip initrd.img.gz mount -o loop initrd.img /mnt cd /mnt ls cat linuxrc可以看到裡面執行了加載了兩個模塊的操作,你在啟動linxu的時候會看見屏幕打印信息。
入門試驗,製作一個簡單的應用:我們使用一張軟盤啟動一台假象的只有一個串口,鍵盤輸入,顯示輸出的x86架構的linux系統,執行的特定應用就是運行minicom,通過串口撥號。需要軟件: minicom-xx.src.tar.gz 和 syslinux-xx.tar.gz,xx代表版本號 ,開始之前,在主目錄建立一個目錄,來釋放這兩個軟件包:
cd mkdir -p project/minilinux cd project/minilinux tar zxvf minicom-xx.src.tar.gz tar zxvf syslinux-xx.tar.gz1、裁減linux內核(需要系統安裝內核文件包)
配置內核的時候,我們需要選擇這些:摸塊編入內核,386處理器、物理內存off、支持ELF、標準PC軟盤、支持RAM盤(4096)、支持initial RAM disk (initrd)、虛你終端、虛擬終端控制台、標準串口、ext2文件系統、控制台驅動,VGA text console、DOS FAT、MSDOS文件系統,其他的都可以不要,這樣內核編出來較小。
步驟:
cd /usr/src/linux make mrproper make xconfig make dep && make bzImage得到 /usr/src/linux/arch/i386/boot/目錄的內核文件bzIamge。
2、編譯一個靜態的minicom ,把它作為將來的linuxrc
cd minicom-xx/src vi Makefile 修改下面這行 minicom: $(minicom_OBJECTS) $(minicom_DEPENDENCIES) rm -f minicom 下面的行加上 -static,連接為靜態程序 (LINK) -static $(minicom_LDFLAGS) $(minicom_OBJECTS) $(minicom_LDADD) $(LIBS) vi minicom.c 找到 if (real_uid==0 && dosetup==0 ) 刪除這個判斷條件語句,主要是用於權限判斷的,因為這個嵌入應用不關注權限問題,否則會出錯。 make 得到可執行程序,用ldd 檢查一下是不是靜態程序。3、準備initrd壓縮文件image.gz
dd if=/dev/zero of=image bs=1k count=4096 losetup /dev/loop0 image mke2fs -m 0 /dev/loop0 mounmt -t ext2 /dev/loop0 /mnt/ mkdir -p /mnt/dev mkdir -p /mnt/usr/share/terminfo/l/ cd /dev cp -a consle null tty tty0 zero mem /mnt/dev cp -P /usr/share/terminfo/l/linux /mnt/usr/share/terminfo/l/linux cp ~/project/minilinux/mincom/src/minicom /mnt/linuxrc umount /mnt losetup -d /dev/loop0 sync gzip -9 image4、製作軟盤引導,並拷貝文件 bzimage image.gz 到軟盤
A.使用grub
fdformat /dev/fd0 mke2fs /dev/fd0 mount /mnt/fd0 /mnt/floppy mkdir -p /mnt/floppy/boot/grub cp /boot/grub/stage1 /boot/grub/stage2 /mnt/floppy/boot/grub 執行 grub,在軟盤上創建引導 grub > root (fd0) grub > setup (fd0) grub > quit cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy cp ~/porject/minilinux/image.gz /mnt/floppy 編輯 /mnt/floppy/boot/grub/grub.conf default =0 timeout-=10 title minilinux root (fd0) kernel /bzImage initrd /image.gz 卸下軟盤 umount /mnt/floppyB. 使用syslinux
fdformat /dev/fd0 mkfs.msdos /dev/fd0 mount -t msdos /dev/fd0 /mnt/floppy cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy cp ~/porject/minilinux/image.gz /mnt/floppy cp syslinux-xx/ldlinxu.sys /mnt/floppy cat > /mnt/floppy/syslinux.cfg LABEL linux KERNEL bzimage APPEND initrd=image.gz umont /mnt/floppy syslinux-xx/syslinux /dev/fd0 sync5、用軟盤啟動計算機,如果幸運,minicom的運行畫面出現在屏幕上。
到此,我們的單應用嵌入式linux做好了,但它還很簡陋,沒有什麼實際用途,但通過這個實驗,可以瞭解嵌入式系統的大致結構和開發過程。在進行實際的嵌入式開發時,通常要在PC機上借助嵌入式linux開發工具包,如:uclinux,bluecat等,對相應的硬件平台(目標機)進行軟件編寫編譯,調試成功後,將內核及應用程序寫入到目標機的存儲器中,從而完成整個應用。
Posted in
技術 ,
Embedded ,
Linux
|