u-boot
分析(十一)
通過前面十篇博文,我們已經完成了對bl1階段的分析,通過這些分析相信我們對u-boot已經有了乙個比較深入的認識,在bl2階段大部分是對外設的初始化,並且有的我們已經分析過,在這篇博文我打算對bl1階段沒有分析到的重要外設進行簡單分析,並結束對u-boot的分析,同時對後面自己的博文進行簡單的規劃,希望有興趣的朋友跟我一塊學習和研究嵌入式。
今天我們會分析到以下內容:
1. mmu分析(內容出自我以前的部落格)
2. 裸機開發總結
3. 後期學習規劃
lmmu分析
1. mmu作用
mmu就是負責虛擬位址(virtual address)轉化成實體地址(physical address)。
2. 基本概念
下面我來說一下arm cpu上的位址轉換過程涉及三個概念:虛擬位址(va)(cpu核心對外發出va),變換後的虛擬位址(mva)(va被轉換為mva供cache和mmu使用,在此將mva轉換為pa),實體地址(pa)(最後使用pa讀寫實際裝置)。
1. cpu看到的用到的只是va,cpu不管va最終是怎樣到pa的。
2. cache、mmu也是看不到va的,它們使用的是mva(va到mva的轉換是由硬體自動完成的)。
3. 實際裝置看不到va、mva,讀寫裝置使用的是pa實體地址。
3. 如何位址轉換
在此過程中要用到以下兩個必備的東西:
1. cp15協處理器的c2暫存器(這個裡面的東西需要程式設計師自己裝載)
2. 虛擬位址mva。
接下來我說以下
mmu對虛擬位址到實體地址的轉化過程。
1.
無論進行那種有效轉換都必須進行一級頁表的轉換,所以我們先去產生一級頁表。產生一級頁表經過以下步驟
a) 由協處理器cp15中的暫存器c2(高18位,即[31:14]為轉換表基位址,低14位為0)為一級轉換表基位址,即ttb該位址指向了乙個2^14=16kb大小的儲存區,即一級轉換表。
b) 將mva的高12位,即位[31:20]作為一級轉換表的位址索引,因此一級轉換表具有2^12=4096項,這4096項的位址為32位,最高的18位[31:14]為暫存器c2的高18位,中間12位為mva的高12位[31:20],最低2位為0b00。這4096項中的內容稱為一級描述符。至此一級頁表產生完畢。
2.
mmu拿到
一級描述符
首先看它的後兩位也就是
bits[1:0]
,根據這兩位的取值
mmu會進入不同的轉換模式,這兩位會出現下面四種取值。其中這四種取值分別對應四種模式,下面我一一解釋。
a) 00 無效不進行轉換
b) 01 進行粗頁式轉換
c) 10 進行段式轉換
d) 11 進行細頁式轉換
3.
接下來對於不同的轉換模式,就要進行不同的轉換。我下面將對三種轉換模式進行一一分析。
a) 0b10(段式轉換),把段式轉換放在第乙個說的原因是在arm中大量用到了段式和細頁式轉換。
段式轉換是最簡單的一種轉換方式,它是將我們剛才產生的一級描述符(即4096項中的內容)的高12位作為段的基位址,用mva的低20位作為每個段的偏移量,由此我們可以輕鬆的推出每個段的大小為2^20=1mb,至此我們就得到了乙個實體地址pa。
b) 0b11(細頁式轉換)
細頁式轉換,它是將我們剛才產生的一級描述符的高20位bits[31:12],再加上mva的bits[19:10](第二級表索引)合體,bits[1:0]補0,獲取第二級描述符的位址,至此其一級轉換結束,因為其二級轉換方式和粗頁式的二級轉換方式相同所以我下面一塊分析。
c) 0b01(粗頁式轉換)
粗頁式轉換,它是將我們剛才產生的一級描述符的高22位bits[31:10],再加上mva的bits[19:12](第二級表索引)合體,最後兩位補0,獲取第二級描述符的位址(32位),至此其一級轉換結束。
4.
下面我們將進入二級轉換,對於二級轉換只針對
細頁式和粗頁式
,沒有段式轉換。
a) 經過一級轉換我們得到了二級描述符的位址,我們通過此位址可以得到二級描述符,我們根據二級描述符的低兩位bits[1:0]同樣可以分為四種轉換模式:
i. 00 無效不進行轉換
ii. 01 大頁描述符
iii. 10 小頁描述符
iv. 11 極小頁描述符
b) 接下來我將對各個模式進行分析。
i. 01(大頁描述符)
此時我們取出二級描述符中的bits[31:16]——大頁基址,它和mva的bits[15:0]組成乙個32位的實體地址,這就是mva對應的pa。
ii. 10(小頁描述符)
此時我們取出二級描述符中的bits[31:12]與mva的bits[11:0]組成乙個32位的位址,這就是mva對應的pa。
iii. 11(極小頁描述符)
此時我們取出二級描述符中的bits[31:10]與mva的bits[9:0]組成乙個32位的位址,這就是mva對應的pa。
l裸機開發總結
在前十篇博文中我們分析了整個u-boot的工作流程,並對其中重要的**和外設進行了分析,對於嵌入式的外設是相當多的,我們要全部分析的話是不太現實的,所以我們應該在學習中總結方法,下面我將自己對於裸機的方法跟大家進行分享,不足之處還望大家互相交流。
1) 熟悉外設大體工作原理,比如我們在前幾篇博文中首先分析的就是該外設的工作原理,這些工作原理以及運作方式大部分都可以在該外設的手冊中找到相應的說明。
2) 從該外設的晶元手冊中找到其控制方法,比如時序圖,通訊方式等等可控制資訊。
3) 從我們使用的控制晶元中找到有沒有專門為此外設提供的控制介面,比如我們以前說到的記憶體控制器、串列埠控制器、nand控制器等。
4) 從控制晶元手冊中找到其對該外設提供的控制方式,比如控制流程等資訊。
5) 檢查硬體連線方式,確定管腳等資訊
6) 根據從外設晶元得到的所需要的控制資訊,配置我們控制晶元所提供的控制資訊,得到所需資料。
7) 根據6)得到的內容進行**的編寫。
8) 編譯除錯(這個過程可以用到串列埠、示波器、萬用表、j-link等進行除錯)
以上就是自己簡單總結的外設裸機開發步驟,有很多不足之處,希望各位提寶貴意見。
l後期學習規劃
通過對u-boot的分析,我們對arm裸機的開發有了一定認識,在接下來我會去分析linux中的各種子系統、驅動模型等內容,整個過程必然很困難,自己只是進行簡單的分析,有不足之處還請各位大神及時指導,讓我們向核心進軍。
uboot分析 uboot啟動核心
u boot啟動核心概述 u boot啟動完成後,最終進入到main loop 迴圈中。若在bootdelay倒計時為0之前,u boot控制台有輸入,則進入命令解析 執行的迴圈 若控制台無輸入,u boot將啟動核心。u boot啟動核心可歸結為以下四個步驟 1 將核心搬移至ddr中 2 校驗核心...
u boot鏈結分析
乙個典型的嵌入式系統中,bootloader 放在nor flash或nand flash裡面,系統加電或復位後,首先執行這段 通常把bootloader 放在nor flash裡面,nand flash由於硬體原因不能隨機訪問,需要特殊的硬體支援機制。bootloader 除了初始化以外就是搬運程...
u boot鏈結分析
華清遠見嵌入式培訓中心 講師。乙個典型的嵌入式系統中,bootloader 放在nor flash或nand flash裡面,系統加電或復位後,首先執行這段 通常把bootloader 放在nor flash裡面,nand flash由於硬體原因不能隨機訪問,需要特殊的硬體支援機制。bootload...