我正在使用 linux 内核中的 kprobes Hook 一些系统调用。在此期间,我想使用 mmap
读取文件。
在内核中使用系统调用是不可能的,但通常有其他方法可以解决。 (例如 sys_open
与 vfs_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/