内核读/写用户空间内存

时间:2012-01-17 09:15:13

标签: memory linux-kernel

首先,从用户空间malloc缓冲区并用所有'A'填充缓冲区 然后,使用netlink socket,将缓冲区的指针传递给内核 最后,我可以使用直接从用户空间传递的原始指针来读取和写入缓冲区 为什么?
为什么允许直接从内核访问用户空间内存?
Linux设备驱动程序,第三版,第415页,说内核不能直接操作未映射到内核地址空间的内存。

2 个答案:

答案 0 :(得分:0)

在本书中 - 单词'内核无法直接操作未映射到内核地址空间的内存'是关于物理内存的。换句话说 - 内核只有800-900 MB(在x86上),可以一次映射到物理内存。要访问整个物理内存内核需要不断重新映射此区域。

Netlink根本不处理物理内存 - 它专为用户空间< - >用户空间或用户空间< - >内核空间之间的双向通信而设计。

答案 1 :(得分:0)

重点是直接在内核中访问用户地址有时工作。

只要您尝试在分配它的同一进程的上下文中访问用户地址,并且该进程已将其置于故障中并且您正在使用具有3:1内存映射的内核(而不是4 :4有时使用的映射)并且内核没有交换分配所在的页面 - 访问将起作用。

问题是所有这些条件并不总是正确的,甚至可以从程序的运行时间改变到另一个。因此,内核驱动程序编写者不需要指望能够访问用户地址。

可能发生的最糟糕的事情是你假设它有效,它总是在实验室工作,并且经常在客户现场崩溃。这就是书中声明的原因。