關於uboot和kernel的一些理解


經過多次的修改和實驗,終於能夠在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的理解就越深刻,我自己就失敗了很多次,遇到過各種各樣的問題,每次查找資料解決后,都會將過程記錄在文本文件中,我覺得這是一個很好的學習方式.加油吧!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM