2012-06-30 67 views
1

虛擬內存分爲兩部分。傳統上,用戶空間爲0〜3GB,內核空間爲3GB〜4GB。對於arm Linux,用戶空間中的線程是否可以訪問內核空間的虛擬地址?

我的問題:

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

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

+0

我有**答案**。訪問權限管理依然依賴頁表項和域訪問控制寄存器中的域和AP域。在2.6.38之前,啓動代碼通過DOMAIN_MANAGER初始化DOMAIN_USER。但是在early_trap_init中,系統會將DOMAIN_USER修改爲DOMAIN_CLIENT。而當域屬性是DOMAIN_CLIENT時,頁表項中的AP字段將會生效。感謝以下答案。 –

回答

1

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

char c=42; 
*c=42; 

我們採取一個字節(一char),併爲其分配的數值42。然後,我們取消引用這個非指針,這將可能嘗試訪問虛擬內存的第42個字節,這幾乎肯定不是你的內存,並且爲了這個例子,還訪問了內核內存。想,當你運行這個(如果你設法保持在槍口下的編譯器)會發生什麼:

Segmentation fault 

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

+0

擁有足夠特權的用戶空間可能會在Linux上打開'/ dev/kmem'(如果它被配置),這是內核虛擬內存;-) – ephemient

+0

@ephemient:真的嗎?但是,足夠的特權仍然不意味着它是可寫的,對吧?或者是「充分特權」,就像'root'一樣運行? – Linuxios

+1

如果內核配置了CONFIG_DEVKMEM = y,並且沒有LSM(如SELinux)阻止訪問,那麼使用'CAP_SYS_RAWIO'('root'具有所有功能,並且可以授予其他進程)足以讀取寫'/ dev/kmem'。曾幾何時,這就是模塊加載的工作原理,儘管不再是這種情況。 – ephemient

2

實際上,您的應用程序可能訪問頁面0xFFFF0000,因爲它包含swi處理程序和一些其他用戶空間幫助程序。所以不行,3/1分割不是什麼神奇的東西,內核管理起來非常簡單。

通常,內核將設置3GB以上的所有內存,只能由內核域本身訪問。如果驅動程序需要在用戶和內核空間之間共享內存,它通常會提供一個mmap接口,然後創建一個別名映射,以便爲同一物理地址創建兩個虛擬地址。這隻能在VIPT-Cache系統上可靠地工作,或者需要大量小心的顯式緩存刷新。如果你不想這樣做,你可以破解內核,使得用戶空間可以訪問的3G分區的內存塊。但是,所有的用戶空間應用程序都會共享這個內存我已經爲armv5系統上的特殊應用做過一次這樣的事情。

+0

感謝您的回答。我同意。你說,超過3GB的虛擬地址可能只能由_kernel-domain_本身**訪問**,並且可以由_user-domain_ ** **阻止**。您能簡單介紹一下如何實施它嗎? –

+0

我已經得到了答案。謝謝。 –

相關問題