利用U-Boot實(shí)現(xiàn)uClinux向S3C44B0的移植
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)上,所以我們還需要從http://www.kernel.org上下載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=/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)試修改。
評(píng)論