omapl138移植uboot系列之啓動TI官方移植的Linux內核(啓動內核第一篇)

 啓動TI官方移植的Linux內核

和編譯uboot一樣,Linux內核的編譯也是三板斧,首先修改Makefile中的ARCH和CROSS_COMPILE,然後找到你要編譯的板卡執行make xx_defconfig配置,最後執行make menuconfig進行檢查並修改,三板斧操作完就可以直接make編譯啦!

我們還是和移植uboot一樣,先編譯TI 移植過的omapl138開發板的內核鏡像,並試着在639A板卡上啓動該內核鏡像,以驗證uboot是否能成功啓動內核,然後根據639A板卡的特性,修改Linux內核。

3.1.1 關於Linux內核鏡像

linux內核經過編譯後也會生成一個elf格式的可執行程序,叫vmlinux或vmlinuz,這個就是原始的未經任何處理加工的原版內核elf文件;嵌入式系統部署時燒錄的一般不是這個vmlinuz/vmlinux,而是要用objcopy工具去製作成燒錄鏡像格式,經過製作加工成燒錄鏡像的文件就叫Image(製作把幾十兆大的精簡成了幾兆,因此這個製作燒錄鏡像主要目的就是縮減大小,節省磁盤)。

原則上Image就可以直接被燒錄到Flash上進行啓動執行,但是實際上並不是這麼簡單。實際上linux的作者們覺得Image還是太大了所以對Image進行了壓縮,並且在image壓縮後的文件的前端附加了一部分解壓縮代碼。構成了一個壓縮格式的鏡像就叫zImage。

uboot爲了啓動linux內核,還發明瞭一種內核格式叫uImage。uImage是由zImage加工得到的,uboot中有一個工具,可以將zImage加工生成uImage。注意:uImage不關linux內核的事,linux內核只管生成zImage即可,然後uboot中的mkimage工具再去由zImage加工生成uImage來給uboot啓動。這個加工過程其實就是在zImage前面加上64字節的uImage的頭信息即可。

我們選擇uImage作爲內核鏡像。

3.1.2 編譯內核

1. 修改Makefile

2. make tisdk_omapl138-lcdk_defconfig 配置

3. make 編譯內核

4. make uImage LOADADDR=0xc0008000生成kernel的uImage鏡像

3.1.3 加載uImage鏡像

    uboot要啓動內核,分爲2個步驟:第一步是將內核鏡像從啓動介質中加載到DDR中,第二步是去DDR中啓動內核鏡像。(uboot一定要將內核鏡像加載至內核鏈接地址處,否則有可能出錯)

    啓動時各種鏡像都在SPI Flash中,因此uboot只需要從SPI Flash的kernel分區去讀取內核鏡像到DDR中即可。讀取要使用uboot的命令來讀取,讀取命令前面已經提過了,正是uboot用於訪問SPIFlash的sf命令集,使用命令:sf read c0008000 kernel(知道爲什麼要在uboot中添加mtd分區了吧?)。

    uboot還支持遠程啓動,也就是內核鏡像不燒錄到SPIFlash中,而是放在主機的服務器中,然後需要啓動時uboot通過網絡從服務器中下載鏡像到板卡DDR中,而且這種方式很適合調試內核和應用程序,uImage鏡像大小在2M左右,調試階段將其一遍又一遍的燒錄到SPIFlash是很費時間和芯片壽命的,使用tftp加載的方式很大程度上省去了這種不必要的麻煩,遺憾的是我們的639A板卡上並無網卡,因此強大的tftp加載我們是使用不了了。網口沒有咱還有串口啊!咱可是串口打天下啊!接下來我們就通過串口將內核鏡像加載到DDR,雖然比不上網口的速度,但這也是沒有辦法的事啊!

    爲了加快串口加載內核鏡像的速率,在加載之前,我先將串口控制檯的波特率設置爲460800,uboot命令行下執行

    然後將我們的超級終端串口波特率設置爲460800後,繼續輸入命令

    還是通過使用我們前面所用過的Kermit協議,完成uImage至DDR的加載。

    加載完成後,我們再將串口控制檯波特率重新設置爲115200。

 

注:實踐證明,將控制檯波特率設置爲460800後,超級終端可能會出現亂碼,這是422轉接頭的原因,換一個好點的422轉接頭即可。

3.1.4 bootm啓動內核

經過前面的操作我們已經將uImage鏡像加載到DDR它的鏈接地址處了,接下來我們將從DDR啓動內核,這就不得不使用uboot的“bootm”命令。

uboot命令行下輸入命名 bootm c0008000,啓動內核。

由uboot打印信息可以看出linux內核鏡像加載成功了,但是內核好像並沒有啓動,uboot最後一條打印信息“Starting Kernel”,表明uboot的使命已經完成了,接下來我們從內核的角度去解決這個問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章