初始化代碼讀取uboot到內存里面,然后跳轉到uboot那里去執行uboot,uboot初始化必要的硬件,加載一些驅動,其中包括nand flash的驅動,然后根據uboot里面設置的一個啟動命令
TAG: NAND??rootfs??Flash??
【系統啟動過程簡介】 初始化代碼讀取uboot到內存里面,然后跳轉到uboot那里去執行uboot,uboot初始化必要的硬件,加載一些驅動,其中包括nand flash的驅動,然后根據uboot里面設置的一個啟動命令: nand read 0x30007FC0 0x100000 0x200000;bootm 0x30007FC0 意思就是,先去讀取nand flash,從0x100000開始,長度為0x200000的數據到memory的0x30007FC0處,然后bootm表示從memory的0x30007FC0開始運行。 也就是去運行內核鏡像了。 然后,內核會自己解壓縮,然后執行, 初始化硬件, 加載驅動模塊, 最后去掛載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這個文件映射的。 (hainei_) |