您好,登錄后才能下訂單哦!
1、拿到三星官方移植過的內核
2、在Linux下解壓一份在共享目錄下,解壓一份在Linux的源生目錄下。一份編輯,一份編譯
3、建立SI工程,添加kernel源代碼
4、在Linux下先看makefile中的CROSS_COMPINE交叉編譯工具鏈和ARCH的架構對不對
5、在arch/arm/configs這個目錄下找到和我們開發板最接近的一個配置,用這個配置文件,我們在kernel根目錄下,make xx_defconfig這個配置文件,得到一個將這個配置文件的內容復制到.config的這個文件,在make menuconfig,退出后,在make -j2 我的Ubuntu是2個處理器,所以可以用2線程加速編譯,編譯好后,在uboot下用tftp命令下載到內存中,啟動一下這個內核看下情況。
5、
(1)我們啟動后發現,內核無法啟動,并且第一句話都沒有打印出來,就是那句解壓代碼運行的時候打印的信息都沒有打印出來,
(2)所以問題就是出在了這里,但是解壓代碼是不可能出現問題的,因為解壓代碼是和架構無關的。
(3)所以問題出在內核配置中,配置解壓代碼將內核解壓后,將內核放在哪里了,可能是解壓代碼解壓后將內核放的內存位置不對導致的,這個是在內核配置中可以配置的
(4)內核配置的解壓地址應該和內核的鏈接地址一樣,否則自解壓后內核是無法運行的。
所以要看內核的鏈接地址等于多少?內核配置的解壓后的內核地址是多少
(5)但是這里面有個問題,就是,我們內核鏈接的地址是虛擬地址,而我們解壓代碼解壓內核的時候需要的是物理地址,所以上面說的內核配置的解壓后的地址的等于,應該是等于內核鏈接處虛擬地址對應的物理地址。
(6)所以我們要看我們的物理地址和虛擬地址分別是多少,內核鏈接的時候
在head.S中,虛擬地址找到 虛擬地址是 0XC0008000 物理地址是0X20008000。所以可以知道我們內核配置的自解壓地址應該是0X30008000,
(7)自解壓地址在mach/Makefile.boot中可以找到,但是這個文件中沒有對應的我們開發板的宏中的地址,因為我們的物理地址是根據SMDKV210這個宏找的,所以我們要在這個文件中添加一個配置,配置信息如下:
# override for SMDKV210
zreladdr-$(CONFIG_MACH_SMDKV210) := 0x30008000
params_phys-$(CONFIG_MACH_SMDKV210) := 0x30000100
這里面還有內核參數的地址,都不對,解壓地址需要弄成30008000,參數地址要弄成30000100,雖然這個文件中默認配置的解壓地址是20008000,內核參數地址是20000100,并且內核物理鏈接地址在這個kernel中配置的也是20008000,但是因為我們DDR在uboot階段初始化配置的時候,我們的DDR是從0X30000000-0X3FFFFFFF這段空間的,所以沒有2開頭的物理內存來用,在下載內核的時候我們也不能將內核下載到這個20008000地址去運行,所以是不行的,多以需要改成30008000,內核鏈接的物理地址,和解壓的物理地址都要改成30008000
1、6、老朱插播的一節課,內核中機器碼的確定
1、MACHINE_START宏
(1)這個宏是用來定義一個機器碼的數據結構的
(2)在每一個mach-xxx.c的文件中,最后的位置都有一個這個宏,這個宏定義了這個開發板對應的機器碼對應的數據結構,這個宏帶的參數一個是tpye,一個是name,如果我們將這個宏解析開后,會發現一個是將MACH_TYPE_XXX(這個XXX用tpye這個參數替代了)的機器碼,和對應的開發板的名字,并且這個宏將定義的這一個結構體變量放在了一個特定的段中,將我們通過和我們uboot中傳遞過來的機器碼來在這個段中進行機器碼的匹配,匹配到了就將這個機器碼對應的結構體數據結構取出來準備進行使用。
(3)經過對arch/arm/mach-s5pv210/Makefile的分析,我們發現我們用的是mach-smdkc110.c這個開發板。所以這個文件才是我們值得關注的文件,
2、硬件驅動的加載和初始化函數執行
(4)這個宏中定義的那個結構體變量中,.init_machine = smdkc110_machine_init這個很重要,這個函數就是將來我們內核啟動的時候,加載硬件驅動時的初始化函數,如果一旦找到了對應的機器碼對應的結構體變量,就會把這個結構體變量拿出來使用,這個變量中的這個.init_machine = smdkc110_machine_init成員,在使用的時候,就會對硬件驅動加載。所以這個函數非常的重要。
分析:由于我們在這個文件machine-smdkc110.c中用那個宏定義了一個結構體變量,放在了特定段中,包含了開發板的機器碼。開發板的名字。開發板對應的硬件驅動加載初始化函數的函數指針,這個函數是我們內核啟動時初始化所有硬件,內核初始化硬件時打印的相關信息也是從這里打印出來的。
在我們的start_kernel這函數中,將uboot的bootargs參數分割成一個一個的項目,然后又將uboot中傳過來的機器碼在自己的那個特定段中進行匹配所對應的那個數據結構,這個循環匹配是最終搜索是在.S文件中用__loop去尋找的,并且返回了一個這個類型的結構體指針給一個結構體指針,在后來這個結構體中的那個關于初始化硬件,硬件驅動加載的那個函數就被調用了。所以對硬件驅動進行了加載。所以我們才能在內核啟動的時候看到那么多的硬件信息
1、7、之前我們啟動內核的時候,內核會重新啟動,解決內核啟動時的錯誤
1、認識內核啟動OOPS
(1)內核啟動時的致命信息就叫OOPS,內核死的原因就在這附近
(2)經過分析這兩個錯誤信息提供了有效信息
PC is at dev_driver_string+0xc/0x44
LR is at max8698_pmic_probe+0x150/0x32c
(3)因為我們的x210開發板,沒有這個max8698電源管理IC,而我們的內核中卻配置了這個電源IC的驅動,所以會找不到硬件,所以會錯誤,我們只要在內核配置信息中,將這個配置信息去掉就行,利用make menuconfig,用/搜索max8698,將這項配置取消就行。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。