如何在 linux 内核中映射一个文件?
How to mmap a file inside the linux kernel?
我正在 linux 内核中使用 kprobes 挂钩一些系统调用。在那期间,我想使用 mmap
.
从文件中读取
不可能在内核内部使用系统调用,但通常有其他解决方法。 (例如 sys_open
与 vfs_read
)。
这可能吗?如果可能,怎么做?
据我了解,mmap()
的功能无法从内核 space 使用。
虽然可以成功调用 do_mmap()
或类似的函数,但函数 returns user space address,kernel不能直接使用。从内核访问用户 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 未映射内存,旨在在第一个页面错误上映射。
我正在 linux 内核中使用 kprobes 挂钩一些系统调用。在那期间,我想使用 mmap
.
不可能在内核内部使用系统调用,但通常有其他解决方法。 (例如 sys_open
与 vfs_read
)。
这可能吗?如果可能,怎么做?
据我了解,mmap()
的功能无法从内核 space 使用。
虽然可以成功调用 do_mmap()
或类似的函数,但函数 returns user space address,kernel不能直接使用。从内核访问用户 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 未映射内存,旨在在第一个页面错误上映射。