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

How to mmap a file inside the linux kernel?

我正在 linux 内核中使用 kprobes 挂钩一些系统调用。在那期间,我想使用 mmap.

从文件中读取

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

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

据我了解,mmap() 的功能无法从内核 space 使用。

虽然可以成功调用 do_mmap() 或类似的函数,但函数 returns user space addresskernel不能直接使用。从内核访问用户 space 内存的唯一正确方法是 copy_to_user/copy_from_user。但是使用这些函数意味着 copiing,因此 mmap()(与 read() 相比)的优势就丢失了。


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

但是对于 mmap() 一个人有相反的问题:他需要使用 user space 指针,从函数返回,就像指针指向内核space。而这不能用正常的方法来完成。

尝试取消引用指向尚未映射的用户 space 区域的指针可能会使内核崩溃。大多数 mmap() 实现实际上 returns 未映射内存,旨在在第一个页面错误上映射。