1. 程式人生 > >關於uboot如何找核心,核心如何找根檔案系統的個人見解

關於uboot如何找核心,核心如何找根檔案系統的個人見解

關於uboot如何找核心,核心如何找根檔案系統的個人見解

這幾天真算是讓這個辰漢給搞趴下了,唉。也沒有資料可以參考。一點資訊也不說,弄不弄就把Freescale的東東拿出來。而你的東東又跟原廠的不一樣。我真CAO了。

為了將這些映像搞進NAND中,哥我徹夜未眠啊。還有,那個網絡卡驅動現在都不好用。網路不行啊。

還是以i.mx53處理器為例吧。我估計別的也差不多。i.mx53根據GPIO引腳的高低電平決定從哪個外設引導。手冊上有說明的,就是幾個撥碼開關,通過上拉、下拉電阻搞個高低電平,讓處理器在復位時取樣,決定如何引導。

當從NAND引導後,應該uboot燒寫在Nand Flash0x0起始地址處,所以起初先執行uboot

uboot會以兩種格式進行互動。一是開機的時候直接任意按一個鍵,進入命令互動模式,類似於linux下的shell。另一種是直接預設使用bootcmd進行載入。而我們進入命令互動模式就是為了定製bootcmd命令,實現開機載入uboot,通過uboot載入核心,通過核心載入rootfs

uboot中有幾條重要的命令,如下:

1mmc read 1 ${loadaddr} 0x800 0x1800;bootm

      Mmc read 這條命令相對於nand read,而在i.mx53平臺下Nand Flash是通過MMC介面訪問的,在uboot中通過MMC實現了Nand Flash的訪問。

這條命令的作用是:讀取1

MMC裝置(即Nand Flash)中,從0x800地址開始,大小為0x1800的核心資料至記憶體${loadaddr}地址處。

不過我就一直沒有搞明白0x1800/1024=6KB,核心不可能這麼小????

Bootm就是直接跳至記憶體${loadaddr}地址去執行了。

這個預設的${loadaddr}我在uboot-imx/include/configs/mx53_smd.h檔案中找到了,定義如下:

#define CONFIG_LOADADDR           0x70800000

查看了別的檔案mx53_arm2_ddr3.hmx53_ard.h也是這個值。可能是官方定義的預設值。

還有一個地方不明白,不是說使用mkimage

zImage加上64個位元組的uboot頭部嗎?而加了之後真正的核心入口地址應該是偏移64個位元組?這裡怎麼沒有體現出來啊????

2setenv bootargs ‘console=ttymxc0,115200 root=/dev/mmcblk0p1 rootwaitrw ‘

這一條就是uboot傳輸給核心的引數,這些引數會存放在NAND Flash提前協商分割槽好的扇區上,核心啟動的時候會去特定的地址去讀取這些核心引數。

而這裡最最主要的也是 root=/dev/mmcblk0p1 ,這就是根檔案系統的掛載點。為什麼要這樣寫呢?這樣寫核心能找到根檔案系統嗎?為什麼不直接寫根檔案系統在NAND Flash的起始地址呢?

哈哈,問題就在這裡,我們都寫過LDD3中的hello world,都知道在linux一切都是檔案,只要是裝置,肯定就對應一個裝置檔案。而核心對檔案系統也不例外。核心把檔案系統也當成一個裝置,通過特定的裝置節點進行訪問。

那檔案系統都沒有掛載,光有一個裝置節點有什麼用?

哈哈,這個問題問得好。我都思考好長時間了,這裡告訴大家。還記得NANDFlash的分割槽嗎?我們將其劃分為好幾個區,bootloaderkernelrootfsuserfs等。這些分割槽都對應於Nand Flash上的物理空間,核心掛載檔案系統是通過核心中的NAND Flash分割槽表進行的。當讀取完畢後,再通過核心引數root=/dev/mmcblk0p1裝置節點進行互動。

當然,這些只是理論上的,也是這幾天鼓搗i.mx53總結下來的,還是要奉勸幾位,買評估板一定得買原廠原貨,資料多,有技術支援。不要貪圖小便宜,買個仿造的,唉。IT屌絲男,傷不起啊。

晚上,繼續加班,搞網絡卡驅動。唉,怎麼就不好使呢。。。。。。。