當(dāng)然虛擬地址空間劃分不只是如此。因?yàn)槟壳皯?yīng)用程序沒有那么大的內(nèi)存需求,所以ARM64處理器不支持完全的64位虛擬地址,實(shí)際支持情況如下。
(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ī)范的地址,不允許使用。
如果處理器實(shí)現(xiàn)了ARMv8.2標(biāo)準(zhǔn)的大虛擬地址(Large Virtual Address,LVA)支持,并且頁長度是64KB,那么虛擬地址的最大寬度是52位。這個(gè)也就是大頁表,可以提升內(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架構(gòu)的Linux內(nèi)核時(shí),可以選擇虛擬地址寬度
? (1)如果選擇頁長度4KB,默認(rèn)的虛擬地址寬度是39位。
? (2)如果選擇頁長度16KB,默認(rèn)的虛擬地址寬度是47位。
? (3)如果選擇頁長度64KB,默認(rèn)的虛擬地址寬度是42位。
? (4)可以選擇48位虛擬地址。
在ARM64架構(gòu)的Linux內(nèi)核中,內(nèi)核虛擬地址和用戶虛擬地址的寬度相同。
? 所有進(jìn)程共享內(nèi)核虛擬地址空間,
? 每個(gè)進(jìn)程有獨(dú)立的用戶虛擬地址空間,
? 同一個(gè)線程組的用戶線程共享用戶虛擬地址空間,內(nèi)核線程沒有用戶虛擬地址空間。
-
處理器
+關(guān)注
關(guān)注
68文章
19896瀏覽量
235298 -
ARM
+關(guān)注
關(guān)注
134文章
9353瀏覽量
377637 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3125瀏覽量
75274 -
MMU
+關(guān)注
關(guān)注
0文章
92瀏覽量
18754
發(fā)布評論請先 登錄
請問ARM的虛擬地址映射有“擴(kuò)大”內(nèi)存范圍的作用嗎
請問ARM虛擬地址 物理地址 加載地址 運(yùn)行地址的聯(lián)系是什么?
【HarmonyOS】虛擬地址<->物理地址是如何映射的
鴻蒙內(nèi)核源碼分析(內(nèi)存映射篇):虛擬地址與物理地址之間是如何映射的
物理地址到虛擬地址的轉(zhuǎn)換步驟
探討一下ARM中的MMU虛擬地址
linux kernel實(shí)現(xiàn)物理地址到虛擬地址空間的切換方法
鴻蒙內(nèi)核中虛擬地址與物理地址之間是如何映射的

內(nèi)核邏輯地址和內(nèi)核虛擬地址到底有什么區(qū)別
虛擬地址和邏輯地址的區(qū)別是什么?

虛擬地址物理地址等眾多地址及MMU相關(guān)知識(shí)

為什么要用MMU?為什么要用虛擬地址?
Linux系統(tǒng)為什么需要引入虛擬地址

Linux虛擬地址空間和物理地址空間的關(guān)系

評論