![用户态程序可以访问内核内存和其他进程的内存吗?](https://linux22.com/image/150978/%E7%94%A8%E6%88%B7%E6%80%81%E7%A8%8B%E5%BA%8F%E5%8F%AF%E4%BB%A5%E8%AE%BF%E9%97%AE%E5%86%85%E6%A0%B8%E5%86%85%E5%AD%98%E5%92%8C%E5%85%B6%E4%BB%96%E8%BF%9B%E7%A8%8B%E7%9A%84%E5%86%85%E5%AD%98%E5%90%97%EF%BC%9F.png)
我在很多教程中读到用户模式程序无法访问内核内存和其他进程的内存。
但这总是正确的吗?
例如:内核不能将内核内存或其他进程的内存映射到某个进程的虚拟地址空间吗?
答案1
可以通过读取文件来读取内核地址/dev/mem
。
您需要是root用户并且需要编译Linux内核CONFIG_STRICT_DEVMEM=n
(许多发行版默认启用CONFIG_STRICT_DEVMEM
安全性)
你可以试试我写的这个 GitHub 项目:关联
答案2
我使用的至少一个 prog 充分利用了内核空间,netsniff-ng。 Netsniff-ng 是一种用于捕获帧的零拷贝机制。它通过将内核空间映射到用户空间来利用这一点。特别是使用 SOCKET_MMAP 系统调用。结果非常棒。我曾经在运行 2.1 Gbps 的交换机端口上捕获帧,并且帧丢失为零。
点击这里看看 SOCKET_MMAP 系统调用是如何工作的,它可能会给你一些想法
答案3
要访问其他进程的内存,您需要以下功能普通的用户没有。但是,如果您获得了这些功能,例如通过成为 root,那么您就可以做到。