【问题标题】:Kernel Read/Write Userspace memory内核读/写用户空间内存
【发布时间】:2012-01-17 09:15:13
【问题描述】:

首先,从用户空间分配一个缓冲区,并用所有“A”填充缓冲区
然后,使用 netlink 套接字将缓冲区的指针传递给内核,
最后,我可以使用直接从用户空间传递的原始指针来读取和写入缓冲区。
为什么 ?
为什么允许从内核直接访问用户空间内存?
Linux Device Driver, Third Edition, Page 415, 说内核不能直接操作没有映射到内核地址空间的内存。

【问题讨论】:

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

标签: memory linux-kernel


【解决方案1】:

关键是直接在内核中访问用户地址有时才有效。

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

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

可能发生的最糟糕的事情是让您假设它可以正常工作,让它始终在实验室中正常工作,并让它经常在客户站点崩溃。这就是本书声明的原因。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-07-25
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 2018-06-30
      • 2012-02-03
      • 1970-01-01
      相关资源
      最近更新 更多