目錄
? 流程設計
invalid 命令
內核態invalid
內核態invalid,用戶態mmap物理地址
PAN機制
? PAN機制歷程? ?硬件支持? ? ?
ARMv8.1-PAN 特性
Linux 內核的適配
?軟件模擬 PAN(SW PAN)
背景
Linux 的實現
總結
? ?
前述刷新cache的流程也同樣可以用于invalid 的操作。
? 流程設計
?1)寫程序寫數據到內存。
?2) 讀程序讀數據,可能從cache讀到老數據,這里invalid
invalid 命令
參考clean的操作,我們采用對應的指令。
DC IVAC, Data or unified Cache line Invalidate by VA to PoC
于是我們設計類似的接口
for (i = 0; i < gen_test_size; i = i + 64){temp_addr=(unsigned char *)((unsigned char *)test_virt_addr_r+i);__asm volatile("dc ivac,%0"::"r"(temp_addr));}
但實際運行的時候,報 指令無權限。也就是 用戶態不能執行這個指令。
內核態invalid
內核接口,直接調用同樣的指令invalid 操作
// 失效指定范圍的 D-Cache
static void invalidate_dcache_range(unsigned long start, unsigned long end) {for (; start < end; start += cache_line_size()) {asm volatile("dc ivac, %0" :: "r"(start));}dsb(ish); // 數據同步屏障
}if (copy_from_user(&range, (void __user *)arg, sizeof(range))) {return -EFAULT;}invalidate_dcache_range(range.addr, range.addr + range.length);
用戶態接口
// 分配測試內存size_t size = 4096;char *buffer = malloc(size);strcpy(buffer, "Test data");// 構造參數struct cache_range range = {.addr = (unsigned long)buffer,.length = size};// 調用 IOCTL 失效 Cacheif (ioctl(fd, 0, &range) < 0) {
上述代碼可以正常運行。?
內核態invalid,用戶態mmap物理地址
內核態同上,但是用戶態測試用的地址變為mmap映射
于是我們得到了內核異常,報段錯誤
576.716499][ 4] [ T2037] Unable to handle kernel access to user memory outside uaccess routines at virtual address 0000007f7b5da740
[ 576.728329][ 4] [ T2037] Mem abort info:
[ 576.732249][ 4] [ T2037] ESR = 0x9600014f
[ 576.736429][ 4] [ T2037] EC = 0x25: DABT (current EL), IL = 32 bits
[ 576.742867][ 4] [ T2037] SET = 0, FnV = 0
[ 576.747048][ 4] [ T2037] EA = 0, S1PTW = 0
[ 576.751313][ 4] [ T2037] Data abort info:
[ 576.755318][ 4] [ T2037] ISV = 0, ISS = 0x0000014f
[ 576.760278][ 4] [ T2037] CM = 1, WnR = 1
[ 576.764371][ 4] [ T2037] user pgtable: 4k pages, 39-bit VAs, pgdp=0000002241257000
PAN機制
? ? ? ? ?PAN(Privileged Access Never)?是 ARMv8 架構引入的一種安全特性,用于防止?內核態(Privileged Mode)直接訪問用戶態(User Mode)內存,從而增強系統對內存訪問漏洞的防護能力。其核心思想是:即使在內核態,也不能繞過 MMU 權限檢查直接訪問用戶空間數據,必須通過安全的拷貝函數(如?copy_from_user
)??
PAN 通過 ARM 的頁表權限控制,強制內核態訪問用戶地址時觸發異常(即使 MMU 處于內核態)。
-
若內核需訪問用戶數據,必須通過?
copy_from_user
?等安全接口(這些函數會臨時禁用 PAN)
? ? 目前板卡上此功能并未開啟。通過malloc分配的內存可以invalid,也可以驗證這一點。
zcat /proc/config.gz |grep CONFIG_ARM64_SW_TTBR0_PANCONFIG_ARM64_SW_TTBR0_PAN is not set
? PAN機制歷程? ?硬件支持? ? ?
ARMv8.1-PAN 特性
-
引入時間:2014 年(ARMv8.1-A 架構)。
-
核心機制:
-
新增?
SCTLR_ELx.PAN
?控制位(EL1/EL2/EL3均可配置)。 -
內核態訪問用戶地址時觸發?Permission Fault(即使 MMU 允許)。
-
-
指令支持:
-
SETPAN
?指令動態切換 PAN 狀態(需配合?ERET
?使用)。
-
Linux 內核的適配
Linux 的實現
-
初始支持:
Linux 4.10(2016年)合并 ARMv8.1-PAN 支持,通過?CONFIG_ARM64_PAN
?啟用。 -
動態切換:
在合法訪問用戶數據時(如系統調用),臨時禁用 PAN:?軟件模擬 PAN(SW PAN)
背景
-
兼容舊硬件:
部分 ARMv8.0 處理器(如 Cortex-A53/A57)無硬件 PAN,需軟件模擬。 -
實現原理:
-
修改頁表權限,使用戶空間內存在內核態?不可訪問。
-
通過?
TTBR0
?切換模擬 PAN 效果。
-
-
SW PAN 補丁:
Linux 4.3(2015年)引入?CONFIG_ARM64_SW_TTBR0_PAN
,通過動態切換?TTBR0
?實現: -
性能代價:
每次用戶/內核數據拷貝需切換?TTBR0
,開銷顯著高于硬件 PAN。
總結
? ?1)mmap映射的地址并不能被invalid。
? ? 2)也不能被lock
? ?總體的拷貝速率比內核管理的慢。后續我們采用巨頁來映射,看是否相關的操作是否可行。
? ?