當然虛擬地址空間劃分不只是如此。因為目前應用程序沒有那么大的內(nèi)存需求,所以ARM64處理器不支持完全的64位虛擬地址,實際支持情況如下。
(1)-虛擬地址位寬
虛擬地址的最大寬度是48位 內(nèi)核虛擬地址在64位地址空間的頂部,高16位是全1,范圍是[0xFFFF 0000 0000 0000,0xFFFF FFFF FFFF FFFF];
用戶虛擬地址在64位地址空間的底部,高16位是全0,范圍是[0x00000000 0000 0000,0x0000 FFFF FFFF FFFF];
高16位是全1或全0的地址稱為規(guī)范的地址,兩者之間是不規(guī)范的地址,不允許使用。
如果處理器實現(xiàn)了ARMv8.2標準的大虛擬地址(Large Virtual Address,LVA)支持,并且頁長度是64KB,那么虛擬地址的最大寬度是52位。這個也就是大頁表,可以提升內(nèi)存與訪問速度。
可以為虛擬地址配置比最大寬度小的寬度,并且可以為內(nèi)核虛擬地址和用戶虛擬地址配置不同的寬度。
轉(zhuǎn)換控制寄存器(Translation Control Register)TCR_EL1的字段T0SZ定義了必須是全0的最高位的數(shù)量,字段T1SZ定義了必須是全1的最高位的數(shù)量,用戶虛擬地址的寬度是(64-TCR_EL1.T0SZ),內(nèi)核虛擬地址的寬度是(64-TCR_EL1.T1SZ)。(全是0是代表的用戶,全是1代表的是內(nèi)核。)
(2)編譯ARM64架構的Linux內(nèi)核時,可以選擇虛擬地址寬度
? (1)如果選擇頁長度4KB,默認的虛擬地址寬度是39位。
? (2)如果選擇頁長度16KB,默認的虛擬地址寬度是47位。
? (3)如果選擇頁長度64KB,默認的虛擬地址寬度是42位。
? (4)可以選擇48位虛擬地址。
在ARM64架構的Linux內(nèi)核中,內(nèi)核虛擬地址和用戶虛擬地址的寬度相同。
? 所有進程共享內(nèi)核虛擬地址空間,
? 每個進程有獨立的用戶虛擬地址空間,
? 同一個線程組的用戶線程共享用戶虛擬地址空間,內(nèi)核線程沒有用戶虛擬地址空間。
-
處理器
+關注
關注
68文章
20248瀏覽量
252154 -
ARM
+關注
關注
135文章
9552瀏覽量
391812 -
內(nèi)存
+關注
關注
9文章
3209瀏覽量
76353 -
MMU
+關注
關注
0文章
92瀏覽量
19215
發(fā)布評論請先 登錄
請問ARM的虛擬地址映射有“擴大”內(nèi)存范圍的作用嗎
請問ARM虛擬地址 物理地址 加載地址 運行地址的聯(lián)系是什么?
【HarmonyOS】虛擬地址<->物理地址是如何映射的
鴻蒙內(nèi)核源碼分析(內(nèi)存映射篇):虛擬地址與物理地址之間是如何映射的
物理地址到虛擬地址的轉(zhuǎn)換步驟
探討一下ARM中的MMU虛擬地址
linux kernel實現(xiàn)物理地址到虛擬地址空間的切換方法
鴻蒙內(nèi)核中虛擬地址與物理地址之間是如何映射的
內(nèi)核邏輯地址和內(nèi)核虛擬地址到底有什么區(qū)別
虛擬地址和邏輯地址的區(qū)別是什么?
虛擬地址物理地址等眾多地址及MMU相關知識
為什么要用MMU?為什么要用虛擬地址?
Linux系統(tǒng)為什么需要引入虛擬地址
MMU虛擬地址空間布局
評論