对于arm Linux,用户空间中的线程可以访问内核空间的虚拟地址吗?

时间:2012-06-30 12:20:06

标签: linux linux-kernel arm

虚拟内存分为两部分。传统上,0~3GB用于用户空间,3GB~4GB用于内核空间。

我的问题:

用户空间中的线程可以访问内核空间的内存吗?

对于ARM数据表,访问属性由域访问控制寄存器负责。但是在内核源代码中,用户空间虚拟内存的页表项中的域值与内核空间的页表项相同。

2 个答案:

答案 0 :(得分:2)

实际上,您的应用程序可能会访问页面0xFFFF0000,因为它包含swi-handler和其他几个用户空间助手。所以不,3/1分裂并不神奇,内核管理起来非常容易。

通常内核会将所有3GB以上的内存设置为只能由内核域本身访问。如果驱动程序需要在用户和内核空间之间共享内存,它通常会提供一个mmap接口,然后创建一个别名映射,因此您有两个相同物理地址的虚拟地址。这仅适用于VIPT-Cache系统或大量精心显式缓存刷新。如果你不想要这个,你就可以破解内核,使用户空间可以访问3G-split上面的一大块内存。但是,所有用户空间应用程序都将共享此内存。我已经为armv5系统上的特殊应用做了一次。

答案 1 :(得分:1)

用户空间代码获取内核内存?唯一允许的内核是DOS及其古老的朋友。 但回到这个问题,请看这个例子C代码:

char c=42;
*c=42;

我们取一个字节(一个char)并为其赋值数字42.我们然后取消引用这个非指针,它可能会尝试访问虚拟内存的第42个字节,这几乎绝对不是你的记忆,并且,为了这个例子,内核内存。猜猜运行时会发生什么(如果你设法在枪口下保持编译器):

Segmentation fault

Linux具有与任何现代操作系统一样的内存保护。如果您尝试访问另一个进程的内存,您的进程将在它可以执行任何操作之前终止(其他事情我不太确定会发生调试器)。即使那个内存是另一个Userland进程的内存,你仍然会被终止。我几乎可以肯定root程序无法访问其他程序内存或内核内存。访问内核内存的唯一方法是成为内核的一部分,或间接通过内核的合作。