簡體   English   中英

對於arm Linux,用戶空間中的線程可以訪問內核空間的虛擬地址嗎?

[英]For arm Linux, could threads in user space access virtual address of Kernel space?

虛擬內存分為兩部分。 傳統上,0~3GB用於用戶空間,3GB~4GB用於內核空間。

我的問題:

用戶空間中的線程可以訪問內核空間的內存嗎?

對於ARM數據表,訪問屬性由域訪問控制寄存器負責。 但是在內核源代碼中,用戶空間虛擬內存的頁表項中的域值與內核空間的頁表項相同。

實際上,您的應用程序可能會訪問頁面0xFFFF0000,因為它包含swi-handler和其他幾個用戶空間助手。 所以不,3/1分裂並不神奇,內核管理起來非常容易。

通常,內核將設置3GB以上的所有內存,只能由內核域本身訪問。 如果驅動程序需要在用戶和內核空間之間共享內存,它通常會提供一個mmap接口,然后創建一個別名映射,因此您有兩個相同物理地址的虛擬地址。 這僅適用於VIPT-Cache系統或大量精心顯式緩存刷新。 如果你不想要這個,你就可以破解內核,使用戶空間可以訪問3G-split上面的一大塊內存。 但是,所有用戶空間應用程序都將共享此內存。 我已經為armv5系統上的特殊應用做了一次。

用戶空間代碼獲取內核內存? 唯一允許的內核是DOS及其古老的朋友。 但回到這個問題,看看這個例子C代碼:

char c=42;
*c=42;

我們取一個字節(一個char )並為它分配數值42.然后我們取消引用這個非指針,它可能會嘗試訪問虛擬內存的第42個字節,這幾乎絕對不是你的記憶,並且,為了這個緣故這個例子,內核內存。 猜猜運行時會發生什么(如果你設法在槍口下保持編譯器):

Segmentation fault

Linux具有與任何現代操作系統一樣的內存保護。 如果您嘗試訪問另一個進程的內存,您的進程將在它可以執行任何操作之前終止(其他事情我不太確定會發生調試器)。 即使那個內存是另一個Userland進程的內存,你仍然會被終止。 我幾乎可以肯定root程序無法訪問其他程序內存或內核內存。 訪問內核內存的唯一方法是成為內核的一部分,或間接通過內核的合作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM