程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 制作嵌入式芯片s3c2410板卡的NetBSD啟動鏡像

制作嵌入式芯片s3c2410板卡的NetBSD啟動鏡像

編輯:關於VC++

最近事很多,抽時間在arm9的s3c2410a上跑了一把NetBSD3.0。參考了網上一些資料,尤 其是一個韓國的網站(看不懂啊,蝌蚪文),我把過程詳細記錄下來,以滋同好。

整個 過程十分簡單!我認為原因在於NetBSD是一個完整的OS。

下面是過程的詳細描述(由 於NetBSD本身優秀的生成框架,所以步驟不多,我能做的只有把說明說詳細些,說羅嗦些, 呵~)

制作的host環境,隨便,既:可以是NetBSD自己,也可以是FreeBSD,Linux都可 以,方法都一樣。

目標運行環境s3c2410芯片的開發版(我試驗了兩塊,但並不保證所 有板子都可以無修改的運行)

引用:在ftp://ftp.netbsd.org/pub/NetBSD/NetBSD- 3.0.1/source/sets/下載netbsd的源代碼,包括src.tgz, syssrc.tgz, gnusrc.tgz, share.tgz

% foreach file (*.tgz)

?  tar -xzf $file -C /

? end             #解壓縮所有元碼文件到/usr/src目錄

src.tgz是/usr/bin, /usr/sbin, /bin, /sbin下工具,/lib /libexec庫文件等等的源代碼

syssrc.tgz是 NetBSD系統的內核源代碼

gnusrc.tgz是gnu社區的軟件的源代碼,包括gcc編譯器,gdb 調試器,binutils等等工具,以及這些Gnu工具所需要的庫

share.tgz包含了makefile 所需要的編譯控制文件,在/usr/share/mk下也有一份

引用:交叉編譯器

cd /usr/src

mkdir ../obj

./build.sh -mevbarm tools

交叉編譯arm交叉 編譯器(見補充:1),-m選項是告訴build.sh我們需要的是arm的編譯器。

這步之後在 /usr/src下生成一個tooldir.xx文件夾。

我是在FreeBSD6.1下編譯的,所以該文件夾 名為tooldir.FreeBSD-6.1-RELEASE-i386。

在Zenwalk Linux下的名字是 tooldir.Linux-2.6.16-unknow-i386 

默認生成的是4.1.2,如果需要使用3.3.3的編 譯器,可以在/etc/mk.conf(可能需要手動建立)中添加HAVE_GCC=3

在~/.cshrc中set path最後添加:/usr/src/tooldir.FreeBSD-6.1-RELEASE-i386/bin,這樣,一個完整的交叉 編譯環境就已經搭建好了。不要忘了tcsh需要rehash

引用:編譯內核(一些詳細的說 明過一會說明,這裡僅僅是步驟)

由於NetBSD已經移植了三星s3c2410芯片的smdk2410 開發版的代碼,所以我們的過程就十分簡單。

cd /usr/src

vi sys/arch/evbarm/conf/SMDK2410

#我自己的並沒有怎麼調整,只是打開了一些調試 開關。注意一定要保留options COMPAT_30選項(如果有的話)

./build.sh -mevbarm -u kernel=SMDK2410_INSTALL #注意這裡是_INSTALL

這樣, 在/usr/obj/sys/arch/evbarm/compile/SMDK2410_INSTALL目錄下的netbsd就是我們的內核

制作ramdisk

該步十分簡單,但是十分繁瑣。

十分偷懶的一個方法了 ,呵呵。(如果你有興趣知道麻煩的制作方法,歡迎與我聯系探討)

引用:在 ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-3.0.1/evbarm/binary/sets/ 下載base.tgz和 etc.tgz兩個包,如果你需要編譯工具也可以下載comp.tgz 別人已經幫我們編譯完了,我們 麻煩的自己編譯干什麼:)

(接下來假設這些包已經放在我們的home裡面)

cd ~

tar -zxf *.tgz 到 ~/sets目錄(目錄名任意)

在~/sets裡刪除不需要的東西 (附件裡我貼出一份我自己的文件列表,包括vi編輯器,gcc編譯器和最基本的頭文件)

cd ~

nbmakefs -s 3m -t ffs image ~/sets

#-s(ize) 3m; -t(ype) ffs 。從sets目錄生成一個3m的名為image的文件。首先需要保證sets下的文件總共小於等於 3m(用du察看)。制作大文件後面再說。

這樣,我們也做好了一份ramdisk。

引 用:把ramdisk和內核拼到一起

cd ~

cp /usr/src/sys/arch/evbarm/compi..../netbsd . #把你在第三步編譯的內核考到home裡, 便於我們操作

arm--netbsdelf-mdsetimage -sv netbsd image  #把第四步制作的 image拷貝到內核裡面(見補充:2)

arm--netbsdelf-objcopy -S -O binary netbsd netbsd.bin #去掉一些不必要的信息,生成一個可以直接執行的二進制鏡像

ok,至此 ,我們的工作全部完成。把netbsd.bin download到你的板子上試試。

補充:1 關於 交叉編譯器。

這個編譯器是一個完整的交叉編譯環境。把執行目錄放到path裡面就可 以直接使用。比如,在FreeBSD6.1下面編譯Linux2.6.16的內核,只需要:

gmake ARCH=arm CROSS_COMPILE=arm--netbsdelf- menuconfig

gmake ARCH=arm CROSS_COMPILE=arm--netbsdelf-

....

既可(我可以在FreeBSD6.1和Zenwalk Linux2.6.16編譯出Linux內核,但是在編譯boot的時候出現問題,但是問題與編譯環境無 關)

-m參數所支持的平台,全部可以在build.sh腳本裡的getarch()函數裡找到。

不過它的make使用的是bmake,正確的方法是用nbmake-evbarm:

如:

引用:cd /usr/src/sys/arch/evbarm/conf

nbconfig SMDK2410_INSTALL

cd ../compile/SMDK2410_INSTALL

nbmake-evbarm depend

nbmake-evbarm

這樣和第3步一樣,也是編譯交叉內核。nbmake-evbarm是一個wapper文件,可以用vim等編輯 器在/usr/src/tooldir.xxx/bin下面察看。

而編譯Gnu的一些軟件時需要使用gmake, 如上面的Linux內核編譯。

如果新入門的朋友對於制作交叉編譯器覺得很麻煩,或是 出現惱火的問題,不妨用NetBSD的代碼和build.sh來做。除了 arm--netbsdelf- 和 arm-- linux- 名字不同外,其余方面在我所使用的地方還沒見到不同。

補充:2 關於 ramdisk的~/sets目錄的制作

這個東西要深入的講的話涉及的東西也不少,我這裡就 不打算寫的太麻煩。

引用:1) 其實就是用ldd看動態庫,但是這玩意比較麻煩,因為 i386 host上不能執行arm的ldd。(附件裡面給出我自己的文件列表)

我的方法比較笨 ,把我需要的命令,不管能不能運行,先做成一個image運行,然後在arm自己的運行環境裡 用ldd一個一個找。如果你有好方法請告訴我。

反正我用的命令不多,所以笨點也無 所謂了,嘿嘿

引用:2) ramdisk的大小是嚴格要求的,在conf/INSTALL文件(該文件 由SMDK2410_INSTALL包含進去)中有一句MEMORY_DISK_ROOT_SIZE=6150,它是以512字節的快 形式給出,具體的換算是6150*512/1024 = 6150/2 =3075k 稍微大於3m(所以我們在第4步的 nbmakefs 的時候 -s參數給的是3m),這裡內核本身預留的空間至少要大於後等於nbmakefs產 生的ramdisk大小。

所以,如果預留的空間比ramdisk大,可以在arm--netbsdelf- mdsetimage的時候使用-s參數,使內核中的記錄MEMORY_DISK_ROOT_SIZE的常量得到修改。

另外,在保留了MEMORY_DISK_ROOT_SIZE的時候,我們可以看到內核的大小。

ls -lh /usr/src/...../SMDK2410_INSTAll/netbsd

我的大小是5.8M,其中 ramdisk占3m,內核本身占2.8m。gzip -9壓縮後內核總大小是2.2m

這是沒有精簡的內 核,我無聊的時候做過一個最精簡內核,大概500k左右。

這個ramdisk只有3m,如果 要制作更大的ramdisk,放更多的東西進去,需要修改2行內核代碼,有興趣咱們再另外 說:em06:

引用:3) 可能需要根據你的需要修改~/sets/etc下的文件內容

總結 :

用NetBSD做開發的優勢:

1) 搭建交叉編譯環境異常輕松,不僅僅在NetBSD 下,甚至Linux,FreeBSD下都可以。Linux下的交叉環境,對新入門朋友來說,自己搭建的話 困難重重

2) 制作鏡像十分輕松。又過接觸的應該知道:一般來說,Linux的內核, ramdisk,文件系統 這些東西都是分開的,放在Flash的不同區塊裡。新入門的朋友可能有很 大一部分會阻礙在這個地方。而NetBSD的內核和ramdisk是結合在一起的。(當然,你也可以 分開做,存放在Flash的不同區塊。具體方法請在google上找)。你也可以認為它就是一個內 核,其中自包含了所有運行需要的東西,你只要照顧好bootloader即可。

3) 支持的 計算機體系多,同一體系的不同平台多,平台越多越易於用戶移植

4) 每個體系自帶 bootloader,都在sys/arch/xxx/stand下,對於研究相關boot(loader)的朋友來說,是個絕 好的例子。這個東西可以獨立編譯,除了gzip的解壓縮過程之外,代碼只分布在3-5個簡短的 文件中。

5) NetBSD內核是獨立的,與bootloader無關,不需要接收bootloader來的 任何參數。相比較,Linux的初始條件會受到bootloader的影響,如某些寄存器。簡單說來, bootloader只需要將內核拷貝到預期地址distination,然後執行一個直接跳轉jmp *distination 即可

6) 歡迎補充

劣勢:

1) 沒有Nand Flash文件系統 ,如Yaffs等

2) 某些驅動或設施沒有Linux多,比如LCD 的 FrameBuffer

3) 沒有實時性,相比Linux提供的軟實時性來講,現階段NetBSD沒有提供實時性

4) 歡迎 補充

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved