在這裏總結一下我在移植Linux2.6.22.6內核過程時的步驟。移植成功後最終能掛接作好的根文件系統,而且啓動第一個init程序。移植的步驟以下:linux
一、將網上下載的內核源碼文件linux-2.6.22.6.tar.bz2放入/work/system路徑下。數組
二、切換到/work/system,使用tar xjf linux-2.6.22.6.tar.bz2解壓縮內核源碼文件獲得一個名爲linux-2.6.22.6的文件夾函數
三、cd linux-2.6.22.6切換到內核文件夾spa
四、修改頂層Makefile文件使得 ARCH ?= arm;CROSS_COMPILE ?= arm-linux-code
五、執行make s3c2410_defconfig修改內核配置,最終會生成一個.confg文件blog
六、執行make menuconfig配置內核,會讀取.confg文件而後根據這個文件的基礎上更改配置,這裏配置先不用更改,直接退出源碼
七、make uImage以後,將產生的uImage文件經過UBOOT的usb下載功能下載到指定地址,內核分區flash
八、在uboot界面執行boot啓動內核,能夠看到內核啓動以後出現一片亂碼it
九、更改CPU的時鐘晶振,找到 (arch\arm\mach-s3c2440\Mach-smdk2440.c)文件,將327行的s3c24xx_init_clocks函數裏的16934400改成12000000,表明12M晶振io
324 static void __init smdk2440_map_io(void) 325 { 326 s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc)); 327 s3c24xx_init_clocks(12000000);//將16934400改成12000000 328 s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs)); 329 }
十、將更改過的代碼繼續編譯make uImage,重複第7步驟。
十一、發現亂碼消失了,可是仍是不能啓動位於nand flash上的第四分區的根文件系統
十二、更改MTD分區,找到 (arch\arm\plat-s3c24xx\Common-smdk.c)文件,將smdk_default_nand_part數組改成以下的形式,這表示將nandflash分爲四個區:bootloader區、params區、kernel區、root區。
118 static struct mtd_partition smdk_default_nand_part[] = { 119 [0] = { 120 .name = "bootloader", 121 .size = 0x00040000, 122 .offset = 0, 123 }, 124 [1] = { 125 .name = "params", 126 .offset = 0x00040000, 127 .size = 0x00020000, 128 }, 129 [2] = { 130 .name = "kernel", 131 .offset = 0x00060000, 132 .size = 0x00200000, 133 }, 134 [3] = { 135 .name = "root", 136 .offset = 0x00260000, 137 .size = 0x0fda0000, 138 } 139 };
1三、將更改過的代碼繼續編譯make uImage,重複第7步驟。
1四、發現內核仍是不能掛接根文件系統,出現No filesystem could mount root, tried: ext3 ext2 cramfs msdos vfat romfs字樣。
1五、增長yaffs2文件系統支持nandfalsh
a、從網上下載的yaffs_source.tar.gz放到/work/system目錄下
b、tar xzf yaffs_source.tar.gz解壓獲得Development目錄下分別有yaffs2和yaffs兩個文件夾,其中yaffs2是比較新的文件系統
c、進入yaffs2文件夾後,./patch-ker.sh c /work/system/linux-2.6.22.6打補丁到內核所在目錄
上述命令完成如下三件事情
1)、修改內核fs/Kconfig文件,增長source "fs/yaffs2/Kconfig",表示讀入fs/yaffs2/Kconfig這個Kconfig文件。
2)、修改內核fs/Makefile文件,增長obj-$(CONFIG_YAFFS_FS) += yaffs2/,表示增長yaffs2/目錄編譯
3)、將yaffs2源碼目錄下的Makefile.kernel文件複製爲內核fs/yaffs2/Makefile
將yaffs2源碼目錄下的Kconfig文件複製到內核fs/yaffs2/目錄下
將yaffs2源碼目錄下的*.c、*.h文件(不包括子目錄下的文件)複製到內核fs/yaffs2/目錄下
d、make menuconfig配置內核支持yaffs2文件系統
File systems
Miscellaneous filesystems
<*>YAFFS file system support
1六、將更改過的代碼繼續編譯make uImage,重複第7步驟。
1七、發現內核能夠啓動位於root分區的根文件系統了,移植成功