3.3 uClinux內(nèi)核的移植
3.3.1 uClinux-dist源碼包的準(zhǔn)備
從uClinux的官方網(wǎng)站下載uclinux-dist源碼包。源碼包中包含了uClinux內(nèi)核、uClibc庫(kù)和busybox等 uClinux下的用戶(hù)應(yīng)用程序,本文中下載的是uClinux-dist-20041215.tar.gz,在linux系統(tǒng)下解壓后會(huì)生成一個(gè) uClinux-dist目錄,該目錄包含了編譯uClinux內(nèi)核需要的所有文件。在uClinux-dist目錄中包含有l(wèi)inux-2.2.x、 linux-2.4.x、linux-.2.6.x三個(gè)子目錄,就是三種版本的uClinux內(nèi)核的源碼,我們的目的是把uClinux-2.6.9版本移植到目標(biāo)平臺(tái)上,所以我們還需要從上下載linux-2.6.9.tar.bz2,從http: //www.uClinux.org上下載linux-2.6.9-uc0.patch,從Samsung的網(wǎng)站http: //www.oprenSRC.sec.samsung.com上下載補(bǔ)丁文件linux-2.6.9-uc0.hsc0.patch。在Linux系統(tǒng)下解壓內(nèi)核Linux-2.6.9.tar.bz2并打上補(bǔ)丁文件linux-2.6.9-uc0.patch和linux-2.6.9-uc0- hsc0.patch,將打上補(bǔ)丁的2.6.9內(nèi)核改名為linux-2.6.x并替換在uClinux-dist包中的linux-2.6.x,完成移植前的準(zhǔn)備工作。
3.3.2 uClinux-dist源碼的修改
按照如下步驟添加S3C44B0的相關(guān)文件:
# cp uClinux-dist/vendors/Samsung/4510b –r? uClinux-dist/vendors/Samsung/44b0,將源代碼包中已經(jīng)有的Samsung的4510b的文件復(fù)制一份并改名為44b0 ,這一過(guò)程也可以直接用鼠標(biāo)完成;
# cp linux-2.6.x/arch/armnommu/configs/s3c44b0x_defconfig
vendors/Samsung/44b0/config.linux-2.6.x,該步驟是將s3c44b0x_defconfig文件復(fù)制到44b0目錄下,該步驟同樣可以復(fù)制、粘貼完成;
雖然已經(jīng)給linux-2.6.9內(nèi)核打了補(bǔ)丁文件,但是我們依然需要對(duì)源代碼進(jìn)行修改才能順理的編譯通過(guò),文件的修改如下:
(1) 修改linux-2.6.x/arch/armnommu/arch/kernel/vmlinux.lds.S,添加以下內(nèi)容:
(.got)?Global offset table */
romfs_start = .;
romfs.o
romfs_end = .;
這樣修改的目的是把romfs文件系統(tǒng)連接到內(nèi)核映象中。
(2) 修改linux-2.6.x/arch/armnommu/kernel/setup.c, 添加變量romfs_start,romfs_end及修改
其設(shè)置如下:
default_command_line?
extern int _stext, _text, _etext, _EDAta, _end;?
extern int romfs_start,romfs_end;?
char *from = default_command_line;?
sprintf(default_command_line, "root=http://www.eeworld.com.cn/dev/ram0 initrd=0x%08lx,%ldk keePINitrd", (unsigned?
long)&romfs_start,((unsigned long)&romfs_end - (unsigned long)&romfs_start)>>10);
(3) 修改vendors/MICetek/44b0/rc文件中 /bin/expand /etc/ramfs.img /dev/ram1;
(4) 添加串口驅(qū)動(dòng)程序,添加文件linux-2.6.x/drivers/serial/serial_s3c44b0.c和linux-2.6.x /include/asm-armnommu/arch-s3c44b0/UART.h,因?yàn)樵趌inux-2.6.9內(nèi)核中對(duì)S3C44B0的支持并不是很好,系統(tǒng)只是提供了一個(gè)簡(jiǎn)易的串口驅(qū)動(dòng),所以需要添加串口驅(qū)動(dòng)。
3.3.3 內(nèi)核的配置與編譯
在編譯內(nèi)核之前需要進(jìn)行配置,可以通過(guò)三種方式對(duì)內(nèi)核進(jìn)行配置:在uClinux-dist目錄下運(yùn)行make config/make menuconfig/make xconfig,其中make config是在字符界面下,make menuconfig是在字符界面下實(shí)現(xiàn)的菜單界面,make xconfig為圖形界面,三種配置方式是一致的,xconfig界面比較友好,容易掌握,但它卻沒(méi)有menuconfig菜單穩(wěn)定,而且在有些機(jī)器上運(yùn)行不起來(lái),本文是使用make menuconfig完成的。運(yùn)行make menuconfig時(shí), 程序會(huì)依次出現(xiàn)開(kāi)發(fā)平臺(tái)、內(nèi)核、文件系統(tǒng)、應(yīng)用程序的配置界面, 可以根據(jù)自己的需要進(jìn)行配置。配置時(shí)大部分選項(xiàng)可以使用其缺省值,只有小部分需要用戶(hù)根據(jù)需求進(jìn)行選擇,進(jìn)行內(nèi)核配置時(shí),有3種選擇,它們分別代表的含義如下:
“Y” - 將該功能編譯進(jìn)內(nèi)核;
“N” -不將該功能編譯進(jìn)內(nèi)核;
“M” -將該功能編譯成可以在需要時(shí)動(dòng)態(tài)插入到內(nèi)核中的模塊;
將與核心其它部分關(guān)系較遠(yuǎn)且不經(jīng)常使用的部分功能代碼編譯成為可加載模塊,有利于減小內(nèi)核的長(zhǎng)度,減小內(nèi)核消耗的內(nèi)存,簡(jiǎn)化該功能相應(yīng)的環(huán)境改變時(shí)對(duì)內(nèi)核的影響,許多功能都可以這樣處理,例如網(wǎng)卡的支持、對(duì)FAT等文件系統(tǒng)的支持等。
在配置好內(nèi)核后依次執(zhí)行以下命令:
make dep; make clean; make lib_ only; make user_ only; make romfs; make image; make編譯完成之后,會(huì)在uClinux-dist/linux-2.6.x/下會(huì)生linux.bin,在uClinux-dist/images /下會(huì)生成linux.data、linux.text、image.bin等目標(biāo)文件。在編譯中可能會(huì)產(chǎn)生錯(cuò)誤,需要根據(jù)錯(cuò)誤信息進(jìn)行調(diào)試修改。
3.4 內(nèi)核的下載運(yùn)行
?。?) 我們將開(kāi)始移植好的U-Boot的目標(biāo)文件u-boot.bin通過(guò)JTAG燒寫(xiě)到目標(biāo)硬件平臺(tái)上,燒寫(xiě)時(shí)開(kāi)始地址要從0開(kāi)始,目標(biāo)板上電后從0地址處運(yùn)行就開(kāi)始運(yùn)行移植好的bootloader了,我們可以在windows下通過(guò)超級(jí)終端或者在linux下的minicom檢測(cè)目標(biāo)板的串口輸出;
?。?) 通過(guò)U-Boot的命令tftpboot來(lái)下載我們移植好的內(nèi)核,tftpboot c008000 linux.bin;go c008000,通過(guò)以上兩個(gè)步驟就實(shí)現(xiàn)了uClinux的下載運(yùn)行。
系統(tǒng)啟動(dòng)后,首先執(zhí)行了bootloader,完成了硬件設(shè)備的初始化任務(wù),然后將運(yùn)行的控制權(quán)交給了uClinux內(nèi)核,uClinux系統(tǒng)就開(kāi)始運(yùn)行了。
4 結(jié)束語(yǔ)
由于Linux操作系統(tǒng)的源碼開(kāi)放性及ARM微處理器的良好性能,如何將Linux系統(tǒng)移植到ARM平臺(tái)上得到越來(lái)越多的關(guān)注。操作系統(tǒng)的移植是構(gòu)建基于ARM微處理器的嵌入式系統(tǒng)的前題,將bootloader與系統(tǒng)內(nèi)核分開(kāi)進(jìn)行設(shè)計(jì)能夠使軟件結(jié)構(gòu)更加清晰,而且可以利用前者的功能,靈活的實(shí)現(xiàn)多種引導(dǎo)系統(tǒng)的方式。
本論文的創(chuàng)新點(diǎn):本文采用移植U-Boot作為系統(tǒng)bootloader,從而實(shí)現(xiàn)了uClinux-2.6內(nèi)核移植。U-Boot作為一種功能強(qiáng)大的bootloader,適合多種平臺(tái)并可以引導(dǎo)多種操作系統(tǒng),利用其強(qiáng)大功能可以實(shí)現(xiàn)系統(tǒng)內(nèi)核的多種下載和引導(dǎo)方式,掌握其移植方法很有必要,uClinux2.6內(nèi)核對(duì)硬件平臺(tái)的支持更好,移植過(guò)程中要注意不同硬件平臺(tái)間的差別。
電子發(fā)燒友App












評(píng)論