1. 程式人生 > >核心kernel、根檔案系統rootfs如何對映到對應的nand flash

核心kernel、根檔案系統rootfs如何對映到對應的nand flash

核心kernel以及根檔案系統rootfs是如何對映到對應的nand flash的地址的
【解答】核心kernel以及根檔案系統rootfs是如何對映到對應的nand flash的地址的

【某人問題 核心在啟動的過程中,是如何完成將本地的flash裝置對映成檔案系統的? 】
我用的是ramdisk.image.gz,燒寫在flash的0x10140000處
我不太明白核心在啟動過程中式如何將這個檔案對映成/目錄及各子目錄的?
如果ramdisk.image.gz在flash中的位置發生了變化,應該如何修改核心啊?

【解答】
沒理解錯的話,ramdisk.image.gz應該是你的核心的壓縮映象。

你的問題,要分2方面和你解釋:

1.將這個檔案對映成/目錄及各子目錄的
不是將這個檔案對映根目錄成及各子目錄的,
而是對應的根檔案系統,簡稱rootfs(root file system),
對應著/根目錄及其各個子目錄和檔案。

發現要解釋清楚,要簡單說清楚整個系統啟動的過程:
【系統啟動過程簡介】
初始化程式碼讀取uboot到記憶體裡面,然後跳轉到uboot那裡去執行uboot,
uboot初始化必要的硬體,載入一些驅動,其中包括nand flash的驅動,
然後根據你的uboot裡面設定的一個啟動命令:

nand read 0x30007FC0 0x100000 0x200000;bootm 0x30007FC0
意思就是,先去讀取nand flash,從0x100000開始,長度為0x200000的資料到memory的0x30007FC0處,
然後bootm表示從memory的0x30007FC0開始執行。
也就是去執行你的核心映象了。
此處也就是你的ramdisk.image.gz。
而你的地址是0x10140000,所以,上面中的啟動命令,至少0x100000要改成你的地址0x10140000。
然後,核心會自己解壓縮,然後執行,
初始化硬體,
載入驅動模組,
最後去掛載rootfs,
而此檔案系統是什麼格式的,是從uboot裡面定義的:
#define CONFIG_BOOTARGS   "root=/dev/mtdblock2 rw init=/linuxrc console=ttyS0,115200 mem=16M rootfstype=yafffs2"
並在從uboot掉轉到核心執行時候,傳遞給核心的,
這樣核心在載入rootfs的時候,才知道,要以什麼格式,比如上面的yaffs2格式,
去載入此檔案系統。
此檔案系統,也是你實現自己用相應的檔案系統製作工具,製作的,然後燒寫到對應的位置的。
上面中root=/dev/mtdblock2,表示,要去/dev/mtdblock2,也就是你的mtd的第3個分割槽,去載入。
而這裡的mtd的第3個分割槽具體對應的nand flash中的的地址,
是你在核心中,一般是在core.c自己定義的的nand flash的分割槽。
一般是uboot是第一個分割槽,核心kernel是第二個,然後就是rootfs是第三個分割槽,也就是/dev/mtdblock2。
隨便網上給你找個別人的分割槽:
static struct mtd_partition rm9200_partitions[3] =
{
        {        /* uboot 256K */
                .name = "uboot",
                .size = 0x40000,
                .offset = 0
        },
        {        /* kernel 1.768M */
                .name = "kernel",
                .size = 0x1C0000,
                .offset = 0x40000
        },
        {        /* rootfs 2M */
                .name = "rootfs",
                .size = 0x200000,
                .offset = 0x200000
        },
};

如果按照上面分割槽,定義的/dev/mtdblock2的起始地址是0x200000,還算成大小是2M的位置,
然後,核心啟動掛載rootfs的時候,就是,以上面從uboot傳過來的引數中yaffs2格式,
到nand flash 的2M的地址讀取並載入rootfs,
載入完成後,這樣,裡面對應的,你說的根目錄,以及所有的檔案,資料夾就都可以識別了。
然後才會去讀取並執行初始化指令碼相關的東西,
最後初始化console控制檯,然後你才能看到那個常見的#,才可以輸入命令,比如ls,才可以和系統互動。

所以,你說的位置或地址如何對映成/根目錄的,實際就是這個rootfs,對應著mtdblock2,
對應的某個nand flash上的地址,比如此處的2M的地方。而不是核心kernel這個檔案對映的。

核心kernel,對應著是分割槽裡面的mtdblock1,比如上面的地址0x40000。

2.
如果ramdisk.image.gz在flash中的位置發生了變化,應該如何修改核心啊?
如果地址變化了,那麼
uboot中定義的啟動引數:
nand read 0x30007FC0 0x100000 0x200000;bootm 0x30007FC0
中的0x100000就要換成你的新的地址就可以了。