linux - 如何在 linux 内核中映射一个文件?

标签 linux kernel memory-mapping

我正在使用 linux 内核中的 kprobes Hook 一些系统调用。在此期间,我想使用 mmap 读取文件。

在内核中使用系统调用是不可能的,但通常有其他方法可以解决。 (例如 sys_openvfs_read)。

这可能吗?如果可能,怎么做?

最佳答案

根据我的理解,mmap() 的功能不能从内核空间使用。

虽然可以成功调用 do_mmap() 或类似函数,但该函数返回用户空间地址内核不能直接使用。从内核访问用户空间内存的唯一正确方法是copy_to_user/copy_from_user。但是使用这些函数意味着复制,所以 mmap() 的优势(与 read() 相比)就失去了。


要在内核中使用 read() 功能,set_fs(KERNEL_DS) 技术可用于指向内核空间 的掩码指针,作为指向用户空间 的指针传递给此函数,因此 copy_to_user 可以正常工作。

但使用 mmap() 时,问题就相反了:他需要使用从函数返回的用户空间指针,就像使用指向内核的指针一样空间。而这无法通过正常方式完成。

尝试取消引用指向尚未映射的用户空间区域的指针可能会使内核崩溃。并且大多数 mmap() 实现实际上返回未映射的内存,这些内存旨在在第一个页面错误时被映射。

关于linux - 如何在 linux 内核中映射一个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48460742/

相关文章:

linux - Busybox 与 Embutils

c++ - 非自愿上下文切换 : How can I prevent them?

python - 如何在Python中创建三角形内核?

c - 如何将数据从中断处理程序传输到用户应用程序?

go - 如何用Go boot编写内核?

python - Python C 模块中的映射——有什么需要注意的陷阱吗?

我们可以在 C 中将一个数组映射到另一个数组,就像映射一个文件一样吗?

c - 单独数据包中的 TCP FIN

python - 在 Python 中循环遍历数字

r - 使用大内存在 R 中处理大于物理 RAM 的数据?