溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

S5PV210-kernel-從三星官方的內核開始移植

發(fā)布時間:2020-10-25 12:40:47 來源:網(wǎng)絡 閱讀:1255 作者:小溢 欄目:開發(fā)技術







1、拿到三星官方移植過的內核

2、在Linux下解壓一份在共享目錄下,解壓一份在Linux的源生目錄下。一份編輯,一份編譯

3、建立SI工程,添加kernel源代碼

4、在Linux下先看makefile中的CROSS_COMPINE交叉編譯工具鏈和ARCH的架構對不對

5、在arch/arm/configs這個目錄下找到和我們開發(fā)板最接近的一個配置,用這個配置文件,我們在kernel根目錄下,make xx_defconfig這個配置文件,得到一個將這個配置文件的內容復制到.config的這個文件,在make menuconfig,退出后,在make -j2 我的Ubuntu是2個處理器,所以可以用2線程加速編譯,編譯好后,在uboot下用tftp命令下載到內存中,啟動一下這個內核看下情況。


5、

(1)我們啟動后發(fā)現(xiàn),內核無法啟動,并且第一句話都沒有打印出來,就是那句解壓代碼運行的時候打印的信息都沒有打印出來,

(2)所以問題就是出在了這里,但是解壓代碼是不可能出現(xiàn)問題的,因為解壓代碼是和架構無關的。

(3)所以問題出在內核配置中,配置解壓代碼將內核解壓后,將內核放在哪里了,可能是解壓代碼解壓后將內核放的內存位置不對導致的,這個是在內核配置中可以配置的

(4)內核配置的解壓地址應該和內核的鏈接地址一樣,否則自解壓后內核是無法運行的。

所以要看內核的鏈接地址等于多少?內核配置的解壓后的內核地址是多少

(5)但是這里面有個問題,就是,我們內核鏈接的地址是虛擬地址,而我們解壓代碼解壓內核的時候需要的是物理地址,所以上面說的內核配置的解壓后的地址的等于,應該是等于內核鏈接處虛擬地址對應的物理地址。

(6)所以我們要看我們的物理地址和虛擬地址分別是多少,內核鏈接的時候

在head.S中,虛擬地址找到 虛擬地址是 0XC0008000 物理地址是0X20008000。所以可以知道我們內核配置的自解壓地址應該是0X30008000,

(7)自解壓地址在mach/Makefile.boot中可以找到,但是這個文件中沒有對應的我們開發(fā)板的宏中的地址,因為我們的物理地址是根據(jù)SMDKV210這個宏找的,所以我們要在這個文件中添加一個配置,配置信息如下:

# override for SMDKV210

zreladdr-$(CONFIG_MACH_SMDKV210) := 0x30008000

params_phys-$(CONFIG_MACH_SMDKV210) := 0x30000100

這里面還有內核參數(shù)的地址,都不對,解壓地址需要弄成30008000,參數(shù)地址要弄成30000100,雖然這個文件中默認配置的解壓地址是20008000,內核參數(shù)地址是20000100,并且內核物理鏈接地址在這個kernel中配置的也是20008000,但是因為我們DDR在uboot階段初始化配置的時候,我們的DDR是從0X30000000-0X3FFFFFFF這段空間的,所以沒有2開頭的物理內存來用,在下載內核的時候我們也不能將內核下載到這個20008000地址去運行,所以是不行的,多以需要改成30008000,內核鏈接的物理地址,和解壓的物理地址都要改成30008000



1、6、老朱插播的一節(jié)課,內核中機器碼的確定

1、MACHINE_START宏

(1)這個宏是用來定義一個機器碼的數(shù)據(jù)結構的

(2)在每一個mach-xxx.c的文件中,最后的位置都有一個這個宏,這個宏定義了這個開發(fā)板對應的機器碼對應的數(shù)據(jù)結構,這個宏帶的參數(shù)一個是tpye,一個是name,如果我們將這個宏解析開后,會發(fā)現(xiàn)一個是將MACH_TYPE_XXX(這個XXX用tpye這個參數(shù)替代了)的機器碼,和對應的開發(fā)板的名字,并且這個宏將定義的這一個結構體變量放在了一個特定的段中,將我們通過和我們uboot中傳遞過來的機器碼來在這個段中進行機器碼的匹配,匹配到了就將這個機器碼對應的結構體數(shù)據(jù)結構取出來準備進行使用。

(3)經(jīng)過對arch/arm/mach-s5pv210/Makefile的分析,我們發(fā)現(xiàn)我們用的是mach-smdkc110.c這個開發(fā)板。所以這個文件才是我們值得關注的文件,

2、硬件驅動的加載和初始化函數(shù)執(zhí)行

(4)這個宏中定義的那個結構體變量中,.init_machine = smdkc110_machine_init這個很重要,這個函數(shù)就是將來我們內核啟動的時候,加載硬件驅動時的初始化函數(shù),如果一旦找到了對應的機器碼對應的結構體變量,就會把這個結構體變量拿出來使用,這個變量中的這個.init_machine = smdkc110_machine_init成員,在使用的時候,就會對硬件驅動加載。所以這個函數(shù)非常的重要。


分析:由于我們在這個文件machine-smdkc110.c中用那個宏定義了一個結構體變量,放在了特定段中,包含了開發(fā)板的機器碼。開發(fā)板的名字。開發(fā)板對應的硬件驅動加載初始化函數(shù)的函數(shù)指針,這個函數(shù)是我們內核啟動時初始化所有硬件,內核初始化硬件時打印的相關信息也是從這里打印出來的。

在我們的start_kernel這函數(shù)中,將uboot的bootargs參數(shù)分割成一個一個的項目,然后又將uboot中傳過來的機器碼在自己的那個特定段中進行匹配所對應的那個數(shù)據(jù)結構,這個循環(huán)匹配是最終搜索是在.S文件中用__loop去尋找的,并且返回了一個這個類型的結構體指針給一個結構體指針,在后來這個結構體中的那個關于初始化硬件,硬件驅動加載的那個函數(shù)就被調用了。所以對硬件驅動進行了加載。所以我們才能在內核啟動的時候看到那么多的硬件信息




1、7、之前我們啟動內核的時候,內核會重新啟動,解決內核啟動時的錯誤

1、認識內核啟動OOPS

(1)內核啟動時的致命信息就叫OOPS,內核死的原因就在這附近

(2)經(jīng)過分析這兩個錯誤信息提供了有效信息

PC is at dev_driver_string+0xc/0x44

LR is at max8698_pmic_probe+0x150/0x32c

(3)因為我們的x210開發(fā)板,沒有這個max8698電源管理IC,而我們的內核中卻配置了這個電源IC的驅動,所以會找不到硬件,所以會錯誤,我們只要在內核配置信息中,將這個配置信息去掉就行,利用make menuconfig,用/搜索max8698,將這項配置取消就行。












向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI