最新花了些時間進行Linux內核的移植。因爲項目使用的Evb原生支持的是Linux-3.8,但項目需求要求咱們在Linux-3.0.27上進行相關驗證,因此進行內核版本的相關移植變得頗有必要。android
先來介紹下Evb的硬件配資:omap5432, cortex-A15 Dual-CPU,支持USB3.0,支持JTAG調試。git
下面的咱們移植的一些思路供你們參考: 首先,尋找到一個與Linux-3.0.27相近的內核版本,Linux-3.8仍是太新,具備不少新的內核特性,其中針對arm架構主要是使用了全新的Device Tree的概念去替換以前不少的硬件資源硬編碼工做(從Linux-3.5開始就不多看見非FDT方式的了),DTB(Device Tree Blob)的存在致使Linux和bootloader都有了很大的改變,u-boot爲了支持DTB的啓動方式,再也不須要像傳統方式那樣傳遞給kernel atag結構體,直接給個DTB文件的內存地址就能夠了。基於Linux-3.8到Linux-3.0的移植,咱們開展了2個星期便放棄了,主要仍是變化太大,OF接口的移植花費了太多的精力,而且各個方面的差距太大,致使最後改不下去。因而開始從omap的git tree上看看有沒有不須要DTB的Linux版本,最終停留在omap的android Linux版本上,一個基於Linux-3.4的版本,而且提供了fastboot,一個比uboot輕量級的bootloader。因而基於Linux-3.4,咱們開始向Linux-3.0的內核進行移植。架構
移植的通常步驟: 1.將Linux-3.4 arch/arm/mach-omap2和arch/arm/plat-omap替換Linux-3.0下相應目錄,進行編譯,通常花費半周到一週的時間應該能編譯成功,生成zImae便可,能夠適當減小相應的外設driver 2.JTAG調試,咱們使用的是DS-5,先經過fastboot將zImage load到memory,而後掛上JTAG看下kernel在哪邊掛掉,若是出現PC指針跑飛的狀況,就用panic函數,掛在可能出錯的地方,通常在arch/arm/kernel/setup.c 中的setup_arch()函數中,paging_init iomap這類關於io,mmu部分最容易致使上述狀況了 3.使用Kernel early debug,在make menuconfig: kernel hacking-->Kernel debugging-->Kernel low-level debugging functions,它會用到arch/arm/kernel/debug.S中的printascii函數,以後就可使用printk,printhex8...之類的函數插樁調試各個函數函數
函數調試的大致流程: init/main.c: start_kernel | | | arch/arm/kernel/setup.c: setup_arch | | | arch/arm/mm/mmu.c: paging_init | | | arch/arm/mach-omap2/board-xxx.c: xxx_init_early | | | init/main.c: rest_init | | init/main.c: kernel_init編碼
上述函數是咱們調試過程當中出現問題的最多的幾個地方。debug
其實內核的移植並不是是高深的技術,須要的是耐心和細心,經過不斷的對比和調試,我一向認爲內核的移植是入門Linux內核的最好的手段,後續還會不斷更新相關心得 ToBeContinue指針