uClinux 2.6 porting s
荊瀟影 2006.9.28
(E-mail:huazjxy@126.com)
目錄:
1.檢查linux 各編譯工具版本
2.立宇泰2.4內(nèi)核編譯
3.
4.
5.結(jié)語
開發(fā)板:FSIIsc344b0 board ,CPU:SC344B0 RAM:
1. 檢查linux 各編譯工具版本
以root登陸linux,打開終端,使用命令gcc –v 檢查下gcc的版本及是否存在.,如果不存在(我裝的Redhat 9.0就遇到了這樣的情況),則需要重新安裝gcc.對于新手而言,去下個(gè)gcc版本再重新安裝,并不簡單,至少我這樣的菜鳥就不會.(linux 才剛剛接觸).網(wǎng)上搜索了下搜到篇好文章:
http:/bbs.chinaunix.net/viewthread.php?tid=596499
上面提到了一種方法: (2)更好的方法就是在X-window下選“主菜單”──>;“系統(tǒng)設(shè)置”──>;“添加/刪除應(yīng)用程序”──>;“開發(fā)工具”中的gcc并安裝它.
安裝過程中毫無懸念,電腦會自動提醒你插入相應(yīng)的安裝盤.
2.立宇泰2.4內(nèi)核編譯
準(zhǔn)備好uClinux-armsys-050101.tar.gz和arm-elf-tools-20030314.sh
將uClinux-armsys-050101.tar.gz解壓縮,
運(yùn)行解壓命令:
#tar xvzf uClinux-armsys-050101.tar.gz
解壓結(jié)束將會在/root下生成uClinux-dist目錄.
2.1.安裝編譯環(huán)境
下面開始配置編譯環(huán)境,將arm-elf-tools-20030314.sh拷貝到/root下,運(yùn)行安裝:
#sh arm-elf-tools-20030314.sh
2.2.配置和裁剪uClinux
#cd uClinux-dist
#make menuconfig
此時(shí)將出現(xiàn)圖象界面,可以對其相應(yīng)的配置和裁減.進(jìn)入uClinux配置(uClinux v
[*]Customize Kernel Settings
[*]Customize Vendor/User Settings
選中這兩項(xiàng),按下ESC鍵退出,在詢問是否保存時(shí),選擇yes并回車.
終端將進(jìn)入內(nèi)核配置選單.我們在配置uClinux可以根據(jù)自己的需要,對相應(yīng)的選項(xiàng)進(jìn)行自由選擇.
2.3.編譯uClinux
按下面步驟對uClinux源碼包進(jìn)行編譯:
make dep ……………………建立依賴關(guān)系
make clean……………………清除舊的編譯結(jié)果
make lib_only………………編譯庫
make user_only………………編譯用戶程序
make romfs……………………產(chǎn)生romfs
make image……………………產(chǎn)生映象文件
make………………………………編譯內(nèi)核
注意事項(xiàng):在上面六個(gè)步驟的編譯中,不建議在 make dep后就直接make了,一般建議一步步來,make clean下可以避免網(wǎng)上有些朋友出現(xiàn)的死機(jī)現(xiàn)象。 在make image的過程中會出現(xiàn)兩個(gè)錯(cuò)誤,這個(gè)兩個(gè)錯(cuò)誤大概是交叉編譯工具的某個(gè)庫被復(fù)制時(shí)出的錯(cuò)誤,沒有什么大的影響,不用去管。繼續(xù)下一步make編譯內(nèi)核。
這樣就在uClinux-dist 目錄下將生成三個(gè)文件:image.ram、image.rom和romfs.img就是我們用來下載和燒錄的映象文件。下載燒錄這些映象文件,啟動和運(yùn)行uClinux就OK了。因?yàn)?/font>linux環(huán)境下對中文支持很差,只能夠換到windows環(huán)境下寫這篇東西,不能夠?qū)⒁恍┫鄳?yīng)指令的運(yùn)行情況給Copy下來,請見諒。但我這樣記憶書寫的,基本沒有問題。
3.
因?yàn)?/font>2.4內(nèi)核的編譯,因?yàn)榱⒂钐┑?/font>uClinux-armsys-050101.tar.gz補(bǔ)丁做的很好,基本不會出現(xiàn)問題,對于新學(xué)者來說,起個(gè)了解整個(gè)過程的作用這將是無比重要的。接著我們來探討下2.6內(nèi)核的移植問題。
S
http:/opensrc.sec.samsung.com/document/Getting_Familiar_with_uClinuxARM2_6.html
最新內(nèi)核編譯
/下載補(bǔ)丁linux-
下載linux-
[root@jingxiaoying]# tar zxvf linux-
[root@jingxiaoying ]# cd linux-
[root@jingxiaoyinglinux-
[root@jingxiaoyinglinux-
[root@jingxiaoyinglinux-
CC arch/arm/kernel/asm-offsets.s
In file included from arch/arm/kernel/asm-offsets.c:13:
include/linux/sched.h: In function `arch_pick_mmap_layout‘:
include/linux/sched.h:1174: `TASK_UNMAPPED_BASE‘ undeclared (first use in this function)
include/linux/sched.h:1174: (Each undeclared identifier is reported only once
include/linux/sched.h:1174: for each function it appears in.)
make[1]: *** [arch/arm/kernel/asm-offsets.s] Error 1
make: *** [arch/arm/kernel/asm-offsets.s] Error 2
include/asm/arch/memory.h中增加TASK_UNMAPPED_BASE定義
[root@jingxiaoyinglinux-
usr/initramfs_data.S: Assembler messages:
usr/initramfs_data.S:29: Error: Unknown pseudo-op: `.incbin‘
make[1]: *** [usr/initramfs_data.o] Error 1
make: *** [usr] Error 2
這個(gè)編譯器不支持.incbin的緣故, 下載新的編譯器
我現(xiàn)在使用的是arm-elf-tools-20030314.sh.下載新的編譯器:
http:/opensrc.sec.samsung.com/download/arm-elf-tools-20040427.sh
并安裝后,重新編譯:
[root@jingxiaoyinglinux-
arch/arm/mach-s
arch/arm/mach-s
arch/arm/mach-s
arch/arm/mach-s
arch/arm/mach-s
arch/arm/mach-s
make[1]: *** [arch/arm/mach-s
make: *** [arch/arm/mach-s
[root@jingxiaoyinglinux-
現(xiàn)在注釋掉gettimeoffset = s
[root@jingxiaoyinglinux-
CC arch/arm/mach-s
arch/arm/mach-s
arch/arm/mach-s
arch/arm/mach-s
arch/arm/mach-s
arch/arm/mach-s
arch/arm/mach-s
arch/arm/mach-s
arch/arm/mach-s
arch/arm/mach-s
make[2]: *** [arch/arm/mach-s
make[1]: *** [arch/arm/mach-s
make: *** [arch/arm/mach-s
[root@jingxiaoyinglinux-
注釋掉MOD_DEC_USE_COUNT和MOD_INC_USE_COUNT
GEN .version
CHK include/linux/compile.h
UPD include/linux/compile.h
CC init/version.o
LD init/built-in.o
LD .tmp_vmlinux1
arch/arm/mach-s
: multiple definition of `v3_flush_user_cache_range‘
arch/arm/mm/built-in.o(.text+0x1480): first defined here
arch/arm/mach-s
: multiple definition of `v3_flush_user_cache_all‘
arch/arm/mm/built-in.o(.text+0x1480): first defined here
arch/arm/mach-s
: multiple definition of `v3_coherent_kern_range‘
arch/arm/mm/built-in.o(.text+0x
arch/arm/mach-s
arch/arm/mm/built-in.o(.init.data+0x70): first defined here
/usr/local/bin/arm-elf-ld.real: Warning: size of symbol `v3_cache_fns‘ changed from
arch/arm/mach-s
: multiple definition of `v3_dma_flush_range‘
arch/arm/mm/built-in.o(.text+0x1490): first defined here
arch/arm/mach-s
: multiple definition of `v3_flush_kern_cache_all‘
arch/arm/mm/built-in.o(.text+0x1480): first defined here
arch/arm/mach-s
: multiple definition of `v3_flush_kern_dcache_page‘
arch/arm/mm/built-in.o(.text+0x1490): first defined here
arch/arm/mach-s
: multiple definition of `v3_dma_inv_range‘
arch/arm/mm/built-in.o(.text+0x1490): first defined here
arch/arm/mach-s
: multiple definition of `v3_dma_clean_range‘
arch/arm/mm/built-in.o(.text+0x1498): first defined here
kernel/built-in.o(.text+0x1cfb4): In function `kallsyms_expand_symbol‘:
: undefined reference to `kallsyms_names‘
kernel/built-in.o(.text+0x1cfb8): In function `kallsyms_expand_symbol‘:
: undefined reference to `kallsyms_token_index‘
kernel/built-in.o(.text+0x1cfbc): In function `kallsyms_expand_symbol‘:
: undefined reference to `kallsyms_token_table‘
kernel/built-in.o(.text+0x1d020): In function `kallsyms_get_symbol_type‘:
: undefined reference to `kallsyms_names‘
kernel/built-in.o(.text+0x1d024): In function `kallsyms_get_symbol_type‘:
: undefined reference to `kallsyms_token_index‘
kernel/built-in.o(.text+0x1d028): In function `kallsyms_get_symbol_type‘:
: undefined reference to `kallsyms_token_table‘
kernel/built-in.o(.text+0x1d
: undefined reference to `kallsyms_markers‘
kernel/built-in.o(.text+0x1d080): In function `get_symbol_offset‘:
: undefined reference to `kallsyms_names‘
kernel/built-in.o(.text+0x1d0fc): In function `kallsyms_lookup_name‘:
: undefined reference to `kallsyms_num_syms‘
kernel/built-in.o(.text+0x1d100): In function `kallsyms_lookup_name‘:
: undefined reference to `kallsyms_addresses‘
kernel/built-in.o(.text+0x1d300): In function `kallsyms_lookup‘:
: undefined reference to `kallsyms_addresses‘
kernel/built-in.o(.text+0x1d318): In function `kallsyms_lookup‘:
: undefined reference to `kallsyms_num_syms‘
kernel/built-in.o(.text+0x1d450): In function `get_ksymbol_mod‘:
: undefined reference to `kallsyms_num_syms‘
kernel/built-in.o(.text+0x1d
: undefined reference to `kallsyms_addresses‘
kernel/built-in.o(.text+0x1d570): In function `update_iter‘:
: undefined reference to `kallsyms_num_syms‘
make: *** [.tmp_vmlinux1] Error 1
[root@jingxiaoyinglinux-
一直不太明白上面的錯(cuò)誤,實(shí)在搞不定了.而且后面試了其他的方法,但都有不定的錯(cuò)誤.實(shí)在不行,于是另尋辦法.
3.2.
經(jīng)過網(wǎng)上資料的查詢和閱讀,還是覺得
http:/opensrc.sec.samsung.com/download/linux-2.6.9-uc0-hsc0.patch.gz
因此我們從www.kernel.org
上下載了linux-
上下載了linux-
-rw-r--r-- 1 root root 36261440 2004-10-19 linux-
-rw-r--r-- 1 root root 357214 2004-11-23 linux-
-rw-r--r-- 1 root root 1231190 2004-10-28 linux-
然后我們從頭開始做. 另一個(gè)需要的就是uclinux-dist包,我們使用uClinux-armsys-050101.tar.gz,因?yàn)槲覀冇眠@個(gè)版本已經(jīng)可以跑2.4內(nèi)核了.
4.
開始行動,將下載的補(bǔ)丁和
#cp uClinux-dist uC44B0
#cd uC44B0
#rm rf linux-2.6.x/此指令的作用是在uClinux下建一個(gè)linux-2.6.x 的文件夾。也可以手動實(shí)現(xiàn)。
#mv linux-
#cd linux-2.6.x
#patch –p1 <.../../linux-
#patch –p1 <.../../linux-
按照2.4內(nèi)核的編譯方法,增加Vendor 的文件:
#cd ../回到uC44B0目錄
#cp inux-2.6.x/arch/armnommu/configs/s
這樣前面的準(zhǔn)備工作也做的差不多了,開始make menuconfig,進(jìn)入配置界面,這時(shí)做法和2.4內(nèi)核編譯時(shí)相同。
后面的步驟也一致。
按下面步驟對uClinux源碼包進(jìn)行編譯:
make dep ……………………建立依賴關(guān)系
make clean……………………清除舊的編譯結(jié)果
make lib_only………………編譯庫
make user_only………………編譯用戶程序
make romfs……………………產(chǎn)生romfs
make image……………………產(chǎn)生映象文件
make………………………………編譯內(nèi)核
注意事項(xiàng)也相同,在上面六個(gè)步驟的編譯中,不建議在 make dep后就直接make了,一般建議一步步來,make clean下可以避免網(wǎng)上有些朋友出現(xiàn)的死機(jī)現(xiàn)象。 在make image的過程中會出現(xiàn)兩個(gè)錯(cuò)誤,這個(gè)兩個(gè)錯(cuò)誤大概是交叉編譯工具的某個(gè)庫被復(fù)制時(shí)出的錯(cuò)誤,沒有什么大的影響,不用去管。繼續(xù)下一步make編譯內(nèi)核。
最終將在uClinux-dist/images/下出現(xiàn)三個(gè)文件:image.ram、image.rom和romfs.img就是我們用來下載和燒錄的映象文件。下載燒錄這些映象文件,啟動和運(yùn)行uClinux就OK了。
5.結(jié)語
當(dāng)然這僅僅只做出了第一步,我這個(gè)移植步驟也是參考了網(wǎng)上的一篇文章弄的,但那位大蝦用的是Micetek EV44B0-II board的uClinux 軟件包,他后來走了一些彎路,但也解決了,當(dāng)然鍛煉了能力。我這樣一下子編譯成功,不能夠不說是運(yùn)氣,當(dāng)然立宇泰的補(bǔ)丁做的好也是很重要的因素。當(dāng)然針對那些想要鍛煉自身的高手,建議自己找個(gè)沒有別人打過補(bǔ)丁的包,自己重新開發(fā)。對于新手來說,按照我的方法將少走一些彎路。當(dāng)然下面的工作就是進(jìn)行深入的一些開發(fā)了,相應(yīng)大家會成功的。我們一起努力吧。
參考文獻(xiàn):
[1] S
[2] uclinux在ARMSYS上的使用說明書.pdf 杭州立宇泰公司
huazjxy