u-boot分析(十一)----MMU簡單分析|u-boot分析大結局|學習規劃

u-boot分析(十一)linux

  經過前面十篇博文,咱們已經完成了對BL1階段的分析,經過這些分析相信咱們對u-boot已經有了一個比較深刻的認識,在BL2階段大部分是對外設的初始化,而且有的咱們已經分析過,在這篇博文我打算對BL1階段沒有分析到的重要外設進行簡單分析,並結束對u-boot的分析,同時對後面本身的博文進行簡單的規劃,但願有興趣的朋友跟我一塊學習和研究嵌入式。程序員

 

今天咱們會分析到如下內容:學習

1.      MMU分析(內容出自我之前的博客)spa

2.      裸機開發總結調試

3.      後期學習規劃orm

 

l  MMU分析索引

1.       MMU做用接口

MMU就是負責虛擬地址(virtual address)轉化成物理地址(physical address)。內存

2.       基本概念ci

下面我來講一下ARM CPU上的地址轉換過程涉及三個概念:虛擬地址(VA)(CPU內核對外發出VA),變換後的虛擬地址(MVA)(VA被轉換爲MVAcacheMMU使用,在此將MVA轉換爲PA),物理地址(PA)(最後使用PA讀寫實際設備)。

1.      CPU看到的用到的只是VACPU無論VA最終是怎樣到PA的。

2.      cacheMMU也是看不到VA的,它們使用的是MVAVAMVA的轉換是由硬件自動完成的)。

3.      實際設備看不到VAMVA,讀寫設備使用的是PA物理地址。

3.       如何地址轉換

在此過程當中要用到如下兩個必備的東西:

1.      cp15協處理器的c2寄存器(這個裏面的東西須要程序員本身裝載)

2.      虛擬地址MVA

接下來我說如下mmu對虛擬地址到物理地址的轉化過程。

1.        不管進行那種有效轉換都必須進行一級頁表的轉換,因此咱們先去產生一級頁表。產生一級頁表通過如下步驟

a)        由協處理器CP15中的寄存器C2(高18位,即[3114]爲轉換表基地址,低14位爲0)爲一級轉換表基地址,即TTB該地址指向了一個2^14=16KB大小的存儲區,即一級轉換表。

b)        MVA的高12位,即位[31:20]做爲一級轉換表的地址索引,所以一級轉換表具備2^12=4096項,這4096項的地址32位,最高的18[3114]爲寄存器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(細頁式轉換)

細頁式轉換,它是將咱們剛纔產生的一級描述符的高20bits[31:12],再加上MVAbits[19:10](第二級表索引)合體,bits[1:0]0,獲取第二級描述符的地址,至此其一級轉換結束,由於其二級轉換方式和粗頁式的二級轉換方式相同因此我下面一塊分析。

c)        0b01(粗頁式轉換)

粗頁式轉換,它是將咱們剛纔產生的一級描述符的高22bits[31:10],再加上MVAbits[19:12](第二級表索引)合體,最後兩位補0,獲取第二級描述符的地址(32位),至此其一級轉換結束。

4.        下面咱們將進入二級轉換,對於二級轉換隻針對細頁式和粗頁式,沒有段式轉換。

a)        通過一級轉換咱們獲得了二級描述符的地址,咱們經過此地址能夠獲得二級描述符,咱們根據二級描述符的低兩位bits[1:0]一樣能夠分爲四種轉換模式:

                                                                            i.              00            無效不進行轉換

                                                                          ii.              01            大頁描述符

                                                                        iii.              10            小頁描述符

                                                                         iv.              11            極小頁描述符

b)        接下來我將對各個模式進行分析。

                                                                             i.              01(大頁描述符)

此時咱們取出二級描述符中的bits[31:16]——大頁基址,它和MVAbits[15:0]組成一個32位的物理地址,這就是MVA對應的PA

                                                                           ii.              10(小頁描述符)

此時咱們取出二級描述符中的bits[31:12]MVAbits[11:0]組成一個32位的地址,這就是MVA對應的PA

                                                                         iii.              11(極小頁描述符)

此時咱們取出二級描述符中的bits[31:10]MVAbits[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中的各類子系統、驅動模型等內容,整個過程必然很困難,本身只是進行簡單的分析,有不足之處還請各位大神及時指導,讓咱們向內核進軍。

相關文章
相關標籤/搜索