ARMv8 內存管理架構.學習筆記


http://blog.csdn.net/forever_2015/article/details/50285955

 

 

目 錄

1章 分級存儲架構2

1.1基礎認識... 2

1.1.1從數據通路描述2

1.1.2從數據交換單位描述2

1.1.3 Cache數據一致性拓撲結構3

1.2 系統層內存模型... 3

1.2.1內存屬性3

1.2.2地址空間4

1.2.3字節編碼支持4

2章 虛擬內存系統架構(VMSA) 5

2.1 VMSAv8-645

2.1.1地址轉換系統5

2.1.2 內存轉換粒度6

2.1.3 Address Translation Stage 8

2.1.4 描述符格式(descriptor format) 9

2.1.5 描述符內存屬性11

2.2 VMSAv8-3211

2.2.1地址轉換系統11

2.2.2轉換表支持12

2.2.3描述符格式12

2.2.4 描述符內存屬性13

2.3 TTW(地址轉換流程)14

2.3.1 VMSAv8-64 14

2.3.2 VMSAv8-32 16

3章 MMU Fault 19

3.1故障類型... 19

3.2 Kernel如何處理讀取空指針?... 19

3.2.1 ARM發生了什么?19

3.2.1 Kernel如何處理?20

4章 Vmalloc 22

4.1簡介... 22

4.2基本流程... 22

4.3 代碼實現分析... 23

5章 Linux虛擬內存布局27

5.1 User內存布局... 27

5.1.1 Mem mapping內存分配方式(64位) 28

5.2 Kernel內存布局... 29

5.2.1 ARM64內核內存布局29

5.3 各內存域和物理內存映射關系... 31

 

 

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

。支持亂序,內存訪問順序同編程順序可能不一致

。支持預讀取?

。支持內存非對齊訪問

Device

(設備)

。讀寫不經過Cache

。不支持亂序內存訪問

。不支持預讀取

。不支持內存非對齊訪問

Shareability

(可共享性)

指當前內存頁表項的數據是否可以同步到其它CPU上,多核CPU調用帶有該屬性頁表項的數據,一旦某個CPU修改了數據,那么系統將自動更新到其它CPU的數據拷貝,實現內存數據一致性.

Cacheability

(可緩存性)

指當前內存頁表項對於的數據是否可以加載到Cache當中.

 

1.2.2 地址空間

地址類型

最大支持位寬

寄存器配置

PA(Physical address)

48 bit

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地址轉換和控制、訪問權限、內存屬性決定和檢查等。

 

• 相關命名解析

VMSA

描述ARMv8地址轉換方案,包括Stage 1 和 Stage 2兩個階段.

VMSAv8-32

描述AArch32 地址轉換方案,包括單一階段的地址轉換

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 =’00’

TCR_ELx.TG0 =’10’

TCR_ELx.TG0 =’01’

 

• 4KB轉換粒度圖解

。最大支持4個Level 的Lookup ,Level0~Level3每個層級的查找最大可以解析9-bit數據

IA[38:30]對應Linux中的PGD,IA[29:20] =>PMD,IA[20:12] => PUD, IA[11:0] => PTE

Page Offset IA[11:0] == OA[11:0]

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轉換粒度圖解

。最大支持3個Level 的Lookup ,Level2~Level3每個層級的查找最大可以解析13-bit數據

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(一階地址轉換)圖解

TTBR 寄存器提供Level 0查找的基地址,通過此基地址和IA[n:39] => 查找到Level 1基地址

Level 1基地址結合IA[38:30]=> 查找到Level2 的基地址

Level 2基地址結合IA[29:21]=> 查找到Level3 的基地址

Level 3基地址結合IA[20:12]=> 查找物理頁框所在地址OA

。最后得到需要的物理地址PA[47:0] <= OA[47:12] + IA[11:0]

 

 

 

 Stage 2 (二階地址轉換)圖解

Stage 2有級聯table的概念,可以減少level的級數

。所謂級聯就是假如有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 0不支持block 轉換

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 描述符內存屬性

NSTable

 

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系統調用映射進來,包括動態庫和文件,可以向上/向下增長.
起始地址由TASK_UNMAPPED_BASE決定,給新的process分配內存

 

• 一個簡單例子助於理解

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映射機制相

 

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM