Memory 内核读/写用户空间内存

Memory 内核读/写用户空间内存,memory,linux-kernel,Memory,Linux Kernel,首先,从用户空间中malloc一个缓冲区,并用所有“a”填充该缓冲区 然后,使用netlink套接字将缓冲区指针传递给内核, 最后,我可以使用直接从用户空间传递的原始指针读取和写入缓冲区。 为什么? 为什么允许从内核直接访问用户空间内存 Linux设备驱动程序,第三版,第415页,说内核不能直接操作未映射到内核地址空间的内存。在本书中,“内核不能直接操作未映射到内核地址空间的内存”是关于物理内存的。换句话说,内核只有800-900 MB(在x86上)可以一次映射到物理内存。为了访问整个物理内存,

首先,从用户空间中malloc一个缓冲区,并用所有“a”填充该缓冲区
然后,使用netlink套接字将缓冲区指针传递给内核,
最后,我可以使用直接从用户空间传递的原始指针读取和写入缓冲区。
为什么?
为什么允许从内核直接访问用户空间内存

Linux设备驱动程序,第三版,第415页,说内核不能直接操作未映射到内核地址空间的内存。

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


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

关键是,仅在内核中直接访问用户地址有时是可行的

只要您尝试在分配用户地址的同一进程的上下文中访问该用户地址,并且该进程已经在其中出错,并且您使用的内核具有3:1内存映射(与有时使用的4:4映射相反),并且内核没有交换分配所在的页,那么访问就可以工作

问题是,所有这些条件并不总是正确的,它们甚至可以在程序运行时发生变化。因此,内核驱动程序编写器不需要指望能够访问用户地址


可能发生的最糟糕的事情是,你假设它能工作,让它一直在实验室工作,并让它每隔一段时间在客户站点崩溃。这就是书中陈述的原因。

@BaliC Linux设备驱动程序,第三版,第15章,内存映射和DMA,高内存和低内存部分说内核不能直接操作未映射到内核地址空间的内存。对不起,我的错误,看起来像是家庭作业!)