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 區 儲存邏輯 的二進位制 記憶體分割槽 將資料和 分開的好處有三點 第一,可以為他們賦予不同的屬性。比如資料本身是需要修改...