Mer系統兼容Android系統(二)

在專心研究論文的同時,突然轉向工程的確不適應。不過言歸正傳,今天主要在OMAP平臺上解決了昨天編譯的內核崩潰問題。

上篇文章中編譯出了OMAP平臺上開啓各種LXC技術所需要的Android內核uImage,使用該內核來啓動Mer系統。SD卡已經寫入了Mer系統鏡像,上午因爲沒有SD卡讀卡器基本沒做啥工作,下午從同學處借了一讀卡器,開始測試了。

測試步驟如下:

1.    將uImage直接代替SD卡中boot分區中原始的內核,啓動系統內核崩潰。出錯信息如下:

[    2.204559] __alloc_from_pool: coherent poolnot initialised!

[    2.210662] [<c001b0c4>](unwind_backtrace+0x0/0xf8) from [<c001c5c8>] (__dma_alloc+0x3cc/0x3e4)

另外有一處omap_hwmod彈出警告,也出現了堆棧信息,不崩潰的話,先忽略。

在GOOGLE上查閱出錯的相關信息,如下網址給出解決辦法

http://ubuntu.5.n6.nabble.com/PATCH-0-2-P-omap4-Remove-the-CMA-td4335100.html

文中大意是OMAP中CMA的問題:

The contiguos memory allocator (CMA) was part of latest TILT but it's not part 
of mainline, nor it's a dependency for any of our drivers and it couldbe a 
source of problems in case it's not properly initialized atboot time 
(lp920511): remove it from our tree. 

沒有過多研究,大意是如果沒用到OMAP Camera(其驅動需要CMA),可以恢復CMA。文中給出解決辦法,一種是打PACTH,嫌麻煩。第二種取巧的辦法是在內核啓動參數中加入mem=456M@0x80000000mem=512M@0xA0000000,這個貌似是劃分內存,有人猜測CMA可能會在某段內存中生成,而使之不崩潰,BALABALA。

2.   測試下載的Android鏡像是否正常,偷懶下載了WINDOWS下的鏡像寫入工具,直接將SD卡寫成了Android鏡像。注意到SD卡劃成了6個分區,其中分區1爲boot分區,分區2爲 system分區,分區3爲data分區,分區4無,分區5爲cache分區,分區6爲SD卡掛載分區。檢查發現可以正常啓動android系統,換了自己編譯的內核也能啓動,具體細節沒有研究了。意識到是boot分區導致內核崩潰的區別,主要研究一下omap的boot系統。

3.    仔細查看了android鏡像的boot分區,果然從boot.txt中發現內核啓動參數變了,setenv bootargs "console=ttyO2,115200n8 rootwait ro earlyprintkfixrtc nocompcache vram=48M omapfb.vram=0:24M,1:24M mem=456M@0x80000000mem=512M@0xA0000000 init=/init androidboot.console=ttyO2。驗證了步驟1中的內存劃分參數應該是有效的,同時仔細研究發現實際上android的ROOTFS打進了uInitrd中,也就是ramdisk中(難怪之前發現在分區中找不到android的INIT可執行文件,只好複習了initramdisk,initramfs之類的東西,還下載了個文檔,本來想拆開uInitrd看看裏面的內容,無奈除了file uInitrd可以查看下文檔屬性外,用網上提供的cpio,mount loop的方法都沒打開此文件,留待以後需要使用LXC的時候整合Android的根文件系統時再去研究好了。)所以OMAP的啓動Android時加載uImage和uInitrd,並通過啓動參數引導去找rootfs中的init進程,這和以前在mips上通過NFS掛載根文件系統是一樣的。

4.    確認了啓動android正常後,將SD卡寫回Mer鏡像。寫入鏡像的方法:

bzcat xxx.raw.bz2 | ddb s=4096 of=/dev/mmcblk0p

5.    修改OMAP的啓動參數,參考嵌入式上開發的經驗,啓動的時候暫停進入uboot,printenv仔細查看環境參數,通過setenv修改bootargs參數加入mem=456M@0x80000000mem=512M@0xA0000000。不幸的是重啓後發現參數未起作用,又回到原來的參數值。

6.    仔細查看啓動參數發現,boot的時候會優先去讀boot.scr中的腳本。直接vi boot.scr是不行的,修改後系統認爲是bad data。查閱發現unbutu下有工具flash-kernel生成.scr文件,OPENSUSE下沒下載到。不過另外有生成的方法。將需要啓動的命令參數寫進boot.script,然後執行命令

mkimage -A arm -O linux -Tscript -C none -a 0 -e 0 -n MiniBoard -d boot.script boot.scr

其中 –n 後是名字,這樣生成了boot.scr拷入boot分區,重啓系統,OK。內核崩潰問題解決。

7.    雖然啓動了Mer系統,但是發現好像X11沒有成功啓動,這是後續的工作了。後續需要解決的問題有:

l  測試是否成功啓動Mer系統

l  組裝Android系統ROOTFS。

l  裝入LXC相關工具,檢查並啓動ANDROID.


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