http://blog.csdn.net/forever_2015/article/details/50285955
版權聲明:未經博主允許不得轉載,請尊重原創, 謝謝!
第1章 分級存儲架構
1.1基礎認識
通常為了保證計算機的整體性能,內存和CPU之間的通信需保證很高的傳輸速率,然而這受限制於內存的大小和昂貴的硬件實現,傳輸速率和內存容量大小的關系遵循“Smaller is faster”原則,使用更大容量的內存勢必會增加傳輸延遲降低性能。為優化計算機整體性能,ARMv8存儲系統中提供了多級Cache用於達到內存容量大小和傳輸延遲之間的平衡。可以從以下兩個方面來描述典型的分級存儲架構 。
1.1.1 從數據通路描述
。PE發出虛擬地址VA轉換需求 |
。虛擬地址VA經過Address translation的TTW機制試圖得到物理地址PA. |
。物理地址PA有可能在Level1 Cache、Level2 Cache或者Main Memroy中. |
。若PA既不在Cache 也不在Main Memroy,將出現Page fault,然后由OS實現重新加載. |
。若順利找到PA,則給回PE繼續執行. |
1.1.2 從數據交換單位描述
寄存器 <=> Cache |
程序猿/編譯器 |
Cache <=> Main Memroy |
Cache 控制器,由HW實現 |
Main Memroy <=> Disk |
OS 操作系統 |
Disk <=> Tape |
用戶 |
1.1.3 Cache數據一致性拓撲結構
PoU |
指當前CPU的指令Cache、數據Cache、TTW所共享一個存儲點,每個CPU在Cache L1都有獨立的IC和DC,Cache L2對於同一個CPU集群是共享的,POU一般值的是L2范圍內的內存. |
PoC |
指所有CPU的指令Cache、數據Cache、TTW所共享一個存儲點,不同的CPU集群有對於不同的Cache L2,所以對於不同的CPU集群而言,他們共同的存儲點是內存,這就是POC拓撲結構. |
1.2 系統層內存模型
1.2.1 內存屬性
屬性 |
Note |
Normal (普通) |
。讀寫經過Cache 。支持亂序,內存訪問順序同編程順序可能不一致 。支持預讀取? 。支持內存非對齊訪問 |
(設備) |
。讀寫不經過Cache 。不支持亂序內存訪問 。不支持預讀取 。不支持內存非對齊訪問 |
(可共享性) |
指當前內存頁表項的數據是否可以同步到其它CPU上,多核CPU調用帶有該屬性頁表項的數據,一旦某個CPU修改了數據,那么系統將自動更新到其它CPU的數據拷貝,實現內存數據一致性. |
Cacheability (可緩存性) |
指當前內存頁表項對於的數據是否可以加載到Cache當中. |
1.2.2 地址空間
地址類型 |
最大支持位寬 |
寄存器配置 |
PA(Physical address) |
ID_AA64MMFR0_ELx.PARange |
|
OA(Output address) |
48 bit |
TCR_ELx.IPS |
IA(Input address) |
48 bit |
TCR_ELx.T0SZ、TCR_ELx.T0SZ |
IPA(Intermediate Physical address) |
48 bit |
VTTBR_EL2.T0SZ |
1.2.3 字節編碼支持
• 兩種存儲類型
big-endianness (大端存儲) |
|
little-endianness (小端存儲) |
指字數據或者半字數據的最高字節存放在內存最高字節地址上,而字數據或者半字數據低字節則存放在內存地址的最低地址中.和大端存儲相反. |
• 寄存器配置
異常等級 |
精確數據訪問 |
Stage 1 TTW |
Stage 2 TTW |
EL0 |
SCTLR_EL1.E0E |
SCTLR_EL1.EE |
SCTLR_EL2.EE |
EL1 |
SCTLR_EL1.EE |
SCTLR_EL1.EE |
SCTLR_EL2.EE |
EL2 |
SCTLR_EL2EE |
SCTLR_EL2.EE |
N/A |
EL3 |
SCTLR_EL3.EE |
SCTLR_EL3.EE |
N/A |
第2章 虛擬內存系統架構(VMSA)
2.1 VMSAv8-64
• VMSA的基本思想是程序、數據、堆棧的總和內存大小可以超過物理存儲器的大小,OS把當前使用的部分送入到內存中,而把其他未被使用的部分保存在磁盤上。例如,對一個16MB的程序和一個內存只有4MB的機器,OS通過調度,可以決定各個時刻將哪4M的內容送入內存中,並在需要時在內存和磁盤間交換程序片段,這樣就可以把這個16M的程序運行在一個只具有4M內存機器上了。
• VMSA 提供MMU(Memory Management Unit)用於實現PE訪問內存的VA->PA地址轉換和控制、訪問權限、內存屬性決定和檢查等。
• 相關命名解析
描述ARMv8地址轉換方案,包括Stage 1 和 Stage 2兩個階段. |
|
VMSAv8-32 |
|
VMSAv8-64 |
描述AArch64 地址轉換方案,包括單一階段的地址轉換 |
2.1.1 地址轉換系統
• 地址類型
VA(虛擬地址) |
我們可看到的地址都是虛擬地址,最大寬度支持48bit,AArch64下VA地址空間分為頂部VA和底部VA兩個子區域,每個VA子區域最大支持256TB. 。底部VA:0x0000_0000_0000_0000 =>0x0000_FFFF_FFFF_FFFF 。頂部VA:0xFFFF_0000_0000_0000 =>0xFFFF_FFFF_FFFF_FFFF 。VA[55]決定使用top VA還是bottom VA |
IPA(中間物理地址) |
如果不支持Stage 2轉換,那么IPA == PA。如果支持Stage2,那么IPA: 。 Stage 1 的OA (Output address) 。 Stage 2 的IA (Input address) 。 最大支持48bit |
PA(物理地址) |
物理內存單元映射中的地址,可以看做是PE到內存系統的輸出地址(OA),PA最大支持48bit |
• 地址轉換規則(EL3 use AArch64)
。Secure狀態下只支持Stage 1地址轉換 |
。Non-secure EL1/EL0既支持Stage 1 也支持Stage 2地址轉換. |
。只有EL2才支持Stage 2,所以Stage 2只為EL2服務的 |
• 轉換表格式支持
。使用64bit descriptor entries(描述符實例) |
。最高支持4個Level的地址查找 |
。Input address (IA)最高支持48bit |
。Output address (OA)最高支持48bit |
。轉換顆粒尺寸支持三種大小:4KB\16KB\64KB (和Page size概念類似) |
2.1.2 內存轉換粒度
• 三種轉換粒度解析
屬性 |
4KB granule |
16KB granule |
64KB granule |
轉換表中有最大條目數 (項) |
512 |
2048 |
8192 |
每級lookup最大可解析地址位 |
9-bit |
11-bit |
13-bit |
Page Offset |
VA[11,0]=PA[11,0] |
VA[13,0]=PA[13,0] |
VA[15,0]=PA[15,0] |
寄存器配置 (x = 0,1,2,3) |
TCR_ELx.TG0 =’10’ |
TCR_ELx.TG0 =’01’ |
• 4KB轉換粒度圖解
。IA[38:30]對應Linux中的PGD,IA[29:20] =>PMD,IA[20:12] => PUD, IA[11:0] => PTE |
。Translation Table 所需內存Size較大 |
• 16KB轉換粒度圖解
。最大支持4個Level 的Lookup ,Level1~Level3每個層級的查找最大可以解析11-bit數據 |
。Level 0 是IA[47],只有1個bit寬,比較特殊. |
。Page Offset IA[13:0] == OA[13:0] |
。Translation Table 所需內存Size中等 |
• 64KB轉換粒度圖解
。Level 1 是IA[47:42],只有6個bit寬,只能解析2^6 個條目 |
。Page Offset IA[15:0] == OA[15:0] |
。Translation Table 所需內存Size最小 |
2.1.3 Address Translation Stage
• Stage 1(一階地址轉換)圖解
。Level 2基地址結合IA[29:21]=> 查找到Level3 的基地址 |
。Level 3基地址結合IA[20:12]=> 查找物理頁框所在地址OA |
。最后得到需要的物理地址PA[47:0] <= OA[47:12] + IA[11:0] |
• Stage 2 (二階地址轉換)圖解
。所謂級聯就是假如有IA[40:0],而Level1解析地址段為IA[38:30],超過了2個bit,而2^40 = 2^2*2^38,所以相當於要2^2個這樣的translation table來實現級聯解析。ARMv8規定,Stage 2最多支持4-bit級聯,也就是最大級聯2^4 == 16個translation table級聯解析.以達到減少查找level的目的. |
。VTTBR_EL2寄存器提供初始Level查找基地址,Stage 2只為EL2服務 |
。同Stage 1,Level 1支持1GB的內存block,Level 2支持2MB的內存block |
2.1.4 描述符格式(descriptor format)
• Level 0~Level 2描述符類型圖解
Bit[1:0] |
Note |
|
Invalid |
X0 |
表明無效描述符,出現Page fault |
Block |
01 |
表明是匹配到一塊Block內存范圍基地址 |
Table |
11 |
表明是匹配到下一級Translation Table基地址 |
• ARMv8 Level 3描述符類型圖解
類型 |
Bit[1:0] |
Note |
Invalid |
X0 |
表明無效描述符,出現Page fault |
Reserved |
01 |
保留 |
Page |
11 |
表明是個Page基地址,給出內存頁的輸出地址.bit[47:12] |
• 各個層級Block
轉換粒度 |
Note |
4KB |
。Level 1 轉換表block描述符映射關聯1GB的IA范圍 。Level 2 描述符映射關聯2MB的IA范圍 |
16KB |
。Level 0/1不支持block 轉換 。Level 2 轉換表block描述符映射關聯32MB的IA范圍 |
64KB |
。Level 1不支持block 轉換 。Level 2 轉換表block描述符映射關聯512MB的IA范圍 |
2.1.5 描述符內存屬性
Stage 2 不支持 |
安全模式標志位 |
|
APTable |
下一級levellookup的access permission |
|
XNTable |
下一級level lookup的執行權限 |
|
PXNTable |
限制XN的特權bit,P是指特權. |
2.2 VMSAv8-32
2.2.1 地址轉換系統
• 地址類型
VA(虛擬地址) |
保存在PC,LR,SP中的看得到地址都是虛擬地址VA 。VA最大支持32bit寬,地址空間最大到4GB 。地址范圍:0x00000000~0xFFFFFFFF |
IPA(中間物理地址) |
如果不支持Stage 2轉換,那么IPA == PA。如果支持Stage2,那么IPA: 。 Stage 1 的OA (Output address) 。 Stage 2 的IA (Input address) 。 AArch32的IPA最大支持40bit寬(使用16MB轉換顆粒) |
PA(物理地址) |
物理內存單元映射中的地址,可以看做是PE到內存系統的輸出地址(OA),PA最大支持32bit寬 |
• 地址轉換規則
。Secure狀態下只支持Stage 1地址轉換 |
。Non-secure EL1/EL0既支持Stage 1 也支持Stage 2地址轉換. |
。只有EL2存在才支持Stage 2,所以Stage 2只為EL2服務的 |
2.2.2 轉換表支持
• 短描述符,轉換表中使用32bit描述符entries,提供如下:
。支持最大2級address lookup(地址查找) |
。32bit IA |
。OA最大支持到40bit |
。當使用Page使用Supersection(16MB 轉換顆粒)時候,支持PA超過32bit,最大到40bit |
。支持 不訪問、代理和domain管理? |
• 長描述符,轉換表中使用64bit描述符entries,提供如下:
。支持最大3級address lookup(地址查找) |
。當使用Stage2轉換 ,最大支持40bit IA |
。OA最大支持到40bit |
。固定4KB的轉換顆粒大小(PAGE_SIZE),不支持domain |
2.2.3 描述符格式
• 短描述符格式分為4類
Supersection |
超節 |
由16MB的memroy block組成,可選支持 |
Section |
節 |
由1MB內存塊組成 |
Large Pages |
大頁 |
由64KB內存塊組成 |
Small Pages |
小頁 |
由4KB內存塊組成 |
• 轉換表中,短描述符是下面之一情況
。一個無效的fault entry |
00 |
。一個page table 條目,指向下一級轉換表地址 |
01 |
。一個page或者section 條目,定義了內存訪問屬性 |
1x |
• Level 1描述符格式
00 |
|
Page table |
01 |
Section/Supersection |
1x |
• Level 2描述符格式
無效 |
00 |
Large page |
01 |
Small page |
1x |
2.2.4 描述符內存屬性
NS |
安全模式標志位 |
AP |
下一級levellookup的access permission |
XN |
下一級level lookup的執行權限 |
PX |
限制XN的特權bit,P是指特權. |
Domain |
Domain其實就是頁表權限之上再加一層開關 00:忽略頁表權限,訪問產生page fault 01:看頁表權限訪問 11:忽略頁表權限正常訪問 |
S |
Shareable(可共享位) |
nG |
非全局,決定轉換是否標記在TLB中 |
TEX[2:0] |
內存范圍屬性位 |
2.3 TTW(地址轉換流程)
。TTW(Translation table walk)包含1個或者多個Translation table的查找 |
。目的:提供一種機制去實現 虛擬地址VA => 物理地址PA |
。Non-secure & EL0/1,包含Stage 1、Stage 2 (一階、二階) 地址轉換 |
。TTBR0_ELx提供user space的初級查找基地址,TTBR1_ELx提供kernel space的初級查找基地址 |
。每一級的translation table lookup返回一個descriptor,如果是最后一級查找,那么返回包含OA和相關內存訪問權限屬性;如果不是最后一級查找,則包含了下一 level 轉換表的基地址. |
2.3.1 VMSAv8-64
• TTW結構流程圖
• TTW實現流程圖
。TTBRn_ELx[47:12]寄存器獲取基地址和IA[47:39]做ORR運算得到地址作為輸入,開始一階轉換的Level0查找,得到OA作為二級轉換的IA(IPA) |
。將IPA作為二級查找的IA,遞歸TTW過程,得到二級轉換OA |
。二級轉換OA作為一階轉換Level1查找基地址,開始Level2查找..進入二級轉換,重復上面操作 |
。 Level3轉換完成后得到物理頁框地址[47:12],然后和Page offset做ORR運算,得到最終PA[47:0] |
。如下詳細圖解 |
2.3.2 VMSAv8-32
• TTW結構流程圖
• TTW實現流程圖
2.4 Cache 支持
第3章 MMU Fault
3.1 故障類型
Alignment fault |
未對齊故障,發生在Memroy access過程中 |
Permission fault |
權限故障(可以發生在TTW的任一Level 的查找中) |
Translation fault |
轉換故障,發生在TTW過程中 |
Address size fault |
地址寬度故障 |
Synchronous external abort |
同步外部終止,包括Data abort 和Instruction abort |
Access flag fault |
訪問標記故障 |
TLB confict abort |
TLB沖突終止,通常會關聯到translation table |
3.2 Kernel如何處理讀取空指針?
3.2.1 ARM發生了什么?
。kernel函數讀取空指針 => ARM發生同步Data abort異常,首先被MMU攔截進入MMU處理,若MMU處理不了,再交由系統處理。如果是32位機,系統將進入Data abort模式處理異常,下面是異常入口函數: 64位:do_mem_abort (arch/arm64/mm/fault.c) 32位:do_DataAbort (arch/arm/mm/fault.c) |
。傳入esr寄存器保存的異常的類型,先進入inf->fn()處理,若MMU處理成功就直接返回,否則跳過進入arm64_notify_die /arm_notify_die系統處理 |
• AArch64
• AArch 32
3.2.1 Kernel如何處理?
。如下圖從fault_info分支中看到同步Data abort會進入do_bad()處理函數,而do_bad()函數固定返回1,說明MMU無法處理,交回由ARM處理. |
。可見,MMU只能處理這幾類異常:Address size fault、 Access flag fault、Premission fault、Translation fault、Page fault等. |
• AArch 64
• AArch 32
第4章 Vmalloc
4.1 簡介
。Vmalloc提供建立連續虛擬內存和離散物理內存直接的映射機制,消除物理內存碎片化 |
。Vmalloc區為非連續內存分區,地址范圍是:VMALLOC_START ~ VMALLOC_END 之間. |
。由若干個vmalloc子區域組成,每個vmalloc子區域間隔4KB(PAGE_SIZE),作為安全隔離區 |
。用vm_struct表示每個vmalloc子區域,每次調用vmalloc()在內核成功申請一段連續虛擬內存后,都會對應一個vm_struct子區域. |
。所有的vmalloc內存子區域使用一個鏈表鏈接起來. |
• Vmalloc 區域結構圖
• vm_struct 數據結構(kernel3.10)
next |
所有的vm_struct子區域組成一個vmlist鏈表,next指針指向下一個vm_struct 節點地址 |
addr |
vmalloc() 最終在內核空間申請一個vm_struct 內存子區域,addr指向該內存子區域首地址 |
size |
表示該vm_struct子區域的大小 |
flags |
表示該非連續內存區的類型標記 |
pages |
指針數組成員是struct page*類型指針,每個成員都關聯一個映射到該虛擬內存區的物理頁框 |
nr_pages |
指針數組pages中page結構的總數 |
phys_addr |
通常為0,當使用ioremap()映射一個硬件設備的物理內存時才填充此字段 |
caller |
返回地址 |
4.2 基本流程
。size 修正為PAGE_SIZE的整數倍,保證對齊 |
。在vmalloc內存范圍內查找一塊合適的虛擬地址子內存空間,存儲到vm_struct結構中. |
。為申請到的vm_struct 子內存空間分配不連續的物理頁框(Physical Frame) |
。建立連續的vm_struct子內存空間到非連續的物理頁框(Physical Frame)之間的映射. |
4.3 代碼實現分析
• vmallo()內部封裝__vmalloc_node_range函數
size |
需要申請子內存的大小,通過vmalloc()傳過來 |
align |
表示將所申請的內存區分為幾個部分,1表示size大小的虛擬內存區作為一個整體 |
start |
vmalloc區域范圍從 VMALLOC_START 開始 |
end |
vmalloc區域范圍到 VMALLOC_END 結束 |
gfp_mask |
頁面分配標志,GFP_KERNEL | __GFP_HIGHMEM 表示將從內核高端內存區分配內存空間 |
prot |
描述當前頁的保護標志 |
node |
表示在哪個節點上(struct pg_data_t)為這段子內存區分配空間,-1表示在當前節點分配 |
caller |
返回地址 |
• __vmalloc_node_range函數分析
LINE 9 |
修正獲取內存的size,PAGE_ALIGN 將size的大小修改成PAGE_SIZE的整數倍,假設要申請1KB的內存區,那么實際上分配的是PAGE_SIZE(4KB)大小 的區域,然后進行size合法性檢查,若不合法則返回NULL,申請內存失敗 |
LINE 13 |
在vmalloc區域VMALLOC_START,VMALLOC_END 范圍內申請一塊合適大小的子內存區vm_struct,這部分由函數__get_vm_area_node()來實現 |
LINE 18 |
為申請到的子內存區vm_struct 分配物理頁框(physical frame),將不連續的physical frame分別映射到連續的vm_struct子內存區中,這部分由函數__vmalloc_area_node()來實現 |
LINE22~24 |
新分配的vm_struct區域都有VM_UNLIST標記表明未完全初始化,這里初始化完成后,清除掉此標記,由函數clear_vm_unlist()來實現,表明已經完成VA->PA的映射,kmemleak_alloc()函數是調試用,最后返回addr. |
• __get_vm_area_node函數分析
LINE 20 |
修正獲取內存的size,修正為PAGE_SIZE的整數倍大小,實現頁對齊; |
LINE 24 |
使用kmalloc分配一段連續內存,用於存儲vm_struct 結構 |
LINE 28 |
每個vm_struct子區域之間有4KB大小的安全間隙,所以需要加上PAGE_SIZE的偏移 |
LINE 30 |
將在vmalloc整個非連續內存區域范圍內查找一塊size大小的子內存區,該函數先遍歷整個vmap_area_list鏈表,依次比對鏈表中每個vmap_area子區域大小,直到找到合適的內存區域為止, 由 alloc_vmap_area()函數實現 |
LINE 37 |
將查找到的vmap_area 加載到vm_struct子內存中,然后將這個子vm_struct子內存區插入到整個vmlist鏈表中,由setup_vmalloc_vm()函數實現 |
• alloc_vmap_area函數分析
LINE 17-27 |
紅黑樹結構,留作后續進階學習 |
• __vmalloc_area_node函數分析
當__get_vm_area_node()創建完新的vm_struct子內存區后,需要通過__vmalloc_area_node()為這個字內存區域分配物理頁.
LINE 9-10 |
根據PAGE_SIZE計算所需要的內存映射頁框(frame)數,保存在nr_pages中,根據nr_pages計算出pages指針數組的大小array_size,pages指針數組每個元素指向一個用於描述物理頁框(frame)的page 結構. |
LINE 15-19 |
如果pages指針數組大小超過一個PAGE_SIZE的大小(4kB), 那么將進入遞歸__vmalloc_node()為其分配空間,否則通過kmalloc_node()為pages指針數組分配一段連續內存空間,此段內存空間位於kernel空間的物理內存線性映射區域. pages指針數組用於存放非連續物理頁框page結構地址 |
LINE 29-43 |
通過一個循環,為pages指針數組中的每個page結構分配物理頁框(frame),這里的page結構只是用於描述物理頁框結構,不是代表物理內存,如果node<0,說明未指定物理內存所在節點,使用alloc_page()分配一個頁框,否則通過alloc_page_node()在指定的節點上分配物理頁框,然后把剛剛分配的page裝載到pages[i]中. |
LINE 46 |
上面完成了分配所需要的物理頁框(frame),然后由map_vm_area()完成pages數組中每個非連續物理頁框到vmalloc子區的連續虛擬地址映射關系. |
第5章 Linux虛擬內存布局
5.1 User內存布局
• 以32位系統為例
• 內存段解析
內存段 |
Note |
Text |
可執行代碼、字符串面值、只讀變量 |
Data |
已經初始化為0的全局變量和靜態局部變量 |
BSS |
未經初始化為0的全局變量和靜態局部變量 |
Stack(棧) |
局部變量,函數參數,返回地址等,效率比堆高很多 |
Heap(堆) |
Malloc等動態分配的內存,申請到的內存按PAGE_SIZE對齊,機制比較復雜 |
Mem maping |
通過mmap系統調用映射進來,包括動態庫和文件,可以向上/向下增長. |
• 一個簡單例子助於理解
Creat一個新的process(Mem mapping),process內有一個函數func(Text),函數內分別定義一個char型變量i(Stack),一個未初始化的static int類型數組j[5](BSS),一個已經初始化的static long型變量k(Data)。func內調用malloc()分配了一段內存(Heap).
5.1.1 Mem mapping內存分配方式(64位)
當系統Create一個新的Process(進程)的時候,使用mmap給它分配內存有兩種實現方式,一種是從一個固定的基地址TASK_UNMAPPED_BASE開始向上增長,一種是以某一個基地址為基准的固定范圍內偏移位地址向下增長,起始地址是非固定值,這樣可以提高安全性能,如下代碼描述 |
若mmap_is_legacy() == true,則每一個新的mmap地址是由低=》高增長的,屬於老的方式,起始地址是固定值TASK_UNMAPPED_BASE,不同位寬的kernel,起始地址有所不同,如下圖描述 |
若mmap_is_legacy() == false,則和上面相反,每一個新的mmap地址是由低《= 高增長的,屬於新的方式,起始地址是固定值+固定范圍內隨機偏移,相比老的方式更加安全,如下圖描述 |
5.2 Kernel內存布局
5.2.1 ARM64內核內存布局
• 兩種Page size內存布局對比,如圖:
• 內存段解析
內存段 |
Note |
Kernel driver |
內核驅動模塊空間,大小為64MB,起始地址如下 MODULES_END == 0XFFFF-FFC0-0000-0000 MODULES_VADDR == 0XFFFF-FFBF-0000-0000 |
Vmalloc |
Vmalloc空間,大小約~239GB,用於非連續物理內存到連續虛擬內存直接的映射,起始地址如下 VMALLOC_START == 0XFFFF-FF80-0000-0000 VMALLOC_END == 0XFFFF-FFBB-BBBB-0000 |
Linear maping |
線性映射區,包括三段:Kernel.text(程序段)、Kernel.init、Kernel.data(數據段),Kernel.text段起始地址為 0XFFFF-FFC0-0008-0000 |
• 相關代碼定義
VA_BITS |
文件路徑:kernel/arch/arm64/include/asm/memory.h #define VA_BITS (39) #define TASK_SIZE_64 (UL(1) << VA_BITS) |
MODULES |
文件路徑:kernel/arch/arm64/include/asm/memory.h #define PAGE_OFFSET (UL(0xffff-ffc0-0000-0000)) #define MODULES_END PAGE_OFFSET #define MODULES_VADDR (MODULES_END –SZ_64M) |
VMALLOC |
文件路徑:kernel/arch/arm64/include/asm/pgtable.h #define VMALL0C_START UL(0xffff-ff80-0000-0000) #define VMALL0C_END (PAGE_OFFSET- UL(0x4-0000-0000)- SZ_64K) |
5.3 各內存域和物理內存映射關系
與物理內存之間的映射關系 |
|
VMALLOC |
PA = f(VA), f是頁表機制映射法則 |
MODULES |
和vmalloc映射機制相同
|
Liner maping |
PA = VA + OFFSET |
BSS\Text\Data |
和vmalloc映射機制相同
|
Heap(堆) |
和vmalloc映射機制相同
|
Stack(棧) |
和vmalloc映射機制相同
|
Mem maping |
和vmalloc映射機制相
|