經過多次的修改和實驗,終於能夠在mini2440開發板上進行各種uboot和kernel的掛載實驗了,在此期間學習到了很多知識,也理解了一些知識
1->分區
uboot和kernel的分區表要一致
uboot分區位置:include/configs/mini2440.h
#define MTDIDS_DEFAULT "nand0=nandflash0" #define MTDPARTS_DEFAULT "mtdparts=nandflash0:256k(bootloader)," \ "128k(params)," \ "5m(kernel)," \ "-(root)"
kernel分區位置:arch/arm/mach-s3c2440/mach-mini2440.c
static struct mtd_partition friendly_arm_default_nand_part[] = {
[0] = {
.name = "supervivi",
.size = 0x00040000, /* 256k */
.offset = 0,
},
[1] = {
.name = "param",
.offset = 0x00040000,
.size = 0x00020000, /* 128k */
},
[2] = {
.name = "Kernel",
.offset = 0x00060000, /* 512k */
.size = 0x00500000,
},
[3] = {
.name = "root",
.offset = 0x00560000,
.size = 1024 * 1024 * 1024, //
},
[4] = {
.name = "nand",
.offset = 0x00000000,
.size = 1024 * 1024 * 1024, //
}
};
uboot和kernel的分區size一定要相吻合(當然可以隨意設置,只要相符即可),不然,在starting kernel時會導致啟動不了的錯誤.
2->內核參數的偏移量
#define CONFIG_ENV_OFFSET 0X60000 /* uboot參數偏移 */ #define CONFIG_ENV_SIZE 0x20000 /* 大小128k,Total Size of Environment Sector */
這個地方很容易被忽略掉,如果此處的設置與uboot以及kernel的分區不一致,也會導致內核啟動不了(多數是參數被uboot或kernel覆蓋了),一定要注意!!!
3->nfs服務
服務端:防火牆關閉<service iptables stop>,重新綁定rpc服務<service rpcbind restart>,mount nfs服務,最后重啟nfs<service nfs restart>
客戶端:<mount -t nfs -o nolock 服務端地址:/服務端目錄 /開發板掛載目錄>
kernel:make menuconfig時要選中開發板支持nfs client
4->nfs掛載kernel和rootfs
將uboot燒寫好后,直接用<nfs 30008000 服務端ip:/uImage服務端目錄>掛載內核,然后<bootm>啟動;啟動成功后,可以用nand命令將內核寫入到nand中;也可以通過修改bootargs參數來自動掛載根文件系統;參數設置如下:<setenv bootargs "noinitrd console=ttySAC0,115200 init=/init root=/dev/nfs rw nfsroot=服務端ip:rootfs目錄 ip=開發板ip:服務端ip:網關:掩碼::eth0:off">
5->kernel的入口和裝載地址
大家知道可以使用<mkimage -n 'mini2440' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage>來制作uImage(因為uboot只能識別用mkimage制作好的內核鏡像,只因為該鏡像頭部多了64字節的內核信息),網上流傳了很多關於mini2440的入口地址和裝載地址的區別,但貌似我沒遇到過這樣的問題,直接在30008000裝載30008040地址的內核鏡像,所以流傳歸流傳,正確與否還是要依靠自己去多多做實驗,否則就只能是鏡中花水中月.
6->小結
調試uboot和kernel不可能一次就成功,失敗的越多,那么你就距離成功越近,對arm-linux的理解就越深刻,我自己就失敗了很多次,遇到過各種各樣的問題,每次查找資料解決后,都會將過程記錄在文本文件中,我覺得這是一個很好的學習方式.加油吧!!!
