arm linux記憶體分段的分析

2021-07-05 05:33:07 字數 1629 閱讀 1814

4gb的空間分段管理,每段1mb,共4k段,顯然每段需要一定記憶體開銷來描述該

段虛擬位址到實體地址的對映及該段的其他特性。

規定以4位元組來描述每段,則4k段需要4k*4=16kb位元組的開銷來描述整個記憶體分

段的特性.

我們把這連續的16kb位元組稱為頁表,如下圖所示.其中每行的4位元組稱為乙個頁

表項(根據上面的描述,我們知道每個頁表項描述了對應的1mb的記憶體空間).這

連續的16kb的首位址稱為頁表基位址,需要儲存在mcu的協處理器cp15的c2寄

存器中,cp15的c2暫存器稱為頁表基址暫存器.

假設我們的頁表基位址為0x30004000

|--------|--------|--------|--------| 0x30004000<----頁表基位址

|--------|--------|--------|--------| 0x30004004

|--------|--------|--------|--------| 0x30004008

|........|........|........|........| 0x3000400c<----pageindex

|--------|--------|--------|--------|

|--------|--------|--------|--------|   

|........|........|........|........|       

|--------|--------|--------|--------|

|--------|--------|--------|--------|

|--------|--------|--------|--------|

|--------|--------|--------|--------| 0x30007ffc  

不管虛擬位址還是實體地址,都是由32bit來表示,當只用到一級頁表時,這32bit

分成兩個部分:

基位址(12bit)+偏移位址(20bit)

因為我們每段為1mb所以這個偏移位址需要20bit來表示.相對於每乙個1mb的段

來說,其對應的關係就在於它們的基位址存在著對應關係,而這種對應關係就存

在於上述頁表中.

在mcu需要查每個虛擬位址對應的實體地址時,mcu把這個虛擬位址的高12bit取

出來,作為乙個12bit的數index1:

假設我們令虛擬位址為va,實體地址為pa,則index1 = va >> 20 ;

然後我們再把index1向左移動2位,得到index2: index2 = index1*(2^2)

即: index2 = (va >> 20)*4

然後,我們取這個pageindex位址所對應的資料,該資料就描述了虛擬位址和物理

位址的對應關係.我們以[pageindex]表示這個數.

由前面的分析我們知道,我們需要乙個實體地址所對應的12bit的基位址,其中:

[pageindex][31:20]即[pageindex]的第31~20位作為我們的pa[31:21],它和我們

的va[19:0]構成了乙個32位的實體地址.

其中[pageindex][19:0]用於描述該段1mb空間記憶體的讀寫許可權等其他屬性.

from:

ARM Linux 中斷分析

在具體的 arm 晶元中會有很多的中斷型別,每一種型別的中斷用以上結構來表示 struct irqdesc irq desc nr irqs nr irqs 根據不同的 mcu 會有所區別 在通過request irq 函式註冊中斷服務程式的時候,將會把中斷向量和中斷服務程式對應起來。我們來看一下 ...

Arm linux記憶體管理(4)

摘於毛德操 嵌入式系統 那麼,這些資料結構怎樣發揮作用的呢?特別是,arm linux核心怎樣根據這些資料結構建立起位址對映呢?1 從系統的初始化說起。系統引導以後,cpu進入核心的總入口,即 段的起點stext.在stext中,cpu首先從自身讀出cpu的型號及其所在的機型,把有關的資訊存放在pr...

c 程序記憶體分段以及分段的目的

棧區 int x 0 int p null 堆區 int p new int 20 全域性區 儲存全域性變數及靜態變數 常量區 儲存常量和字串 string str hello 區 儲存邏輯 的二進位制 記憶體分割槽 將資料和 分開的好處有三點 第一,可以為他們賦予不同的屬性。比如資料本身是需要修改...