mmap() 在内核 space 和用户 space 中是否相同?
Is mmap() same in kernel space and user space?
我的问题不仅限于 mmap()
,而是内核 space 代码和用户 space 代码中使用的所有函数(从用户 space 调用时 - 系统调用) =20=]代码。一个示例,如果我从用户 space 调用 mmap()
,其中包括上下文切换 (SYSENTER / INT 80H)
,但是如果我从内核调用 mmap
则不需要。我的问题是,内核或用户 space 中的 mmap()
函数是否相同?如果相同,如果从内核调用,mmap 实现是否设法不执行 SYSENTER / INT 80H
?
mmap(2)
实现不是说明性的,因为它有兼容性问题,但这里有一个 truncate(2)
:
的例子
- 用户space调用内核space,它以specially linked函数开始。
- 那function调用了一个内部函数。
- internal function e.g.
do_sys_truncate()
调用实际内核 API。
- kernel API e.g.
vfs_truncate()
负责繁重的工作。
- 那个内核 API 就是 exported 内核代码的其余部分。
因此,本质上,用户space mmap()
只是通往内部内核 API 的另一条更复杂的路径,内核的其余部分可以通过其他方式访问它,更简单的路径。
我的问题不仅限于 mmap()
,而是内核 space 代码和用户 space 代码中使用的所有函数(从用户 space 调用时 - 系统调用) =20=]代码。一个示例,如果我从用户 space 调用 mmap()
,其中包括上下文切换 (SYSENTER / INT 80H)
,但是如果我从内核调用 mmap
则不需要。我的问题是,内核或用户 space 中的 mmap()
函数是否相同?如果相同,如果从内核调用,mmap 实现是否设法不执行 SYSENTER / INT 80H
?
mmap(2)
实现不是说明性的,因为它有兼容性问题,但这里有一个 truncate(2)
:
- 用户space调用内核space,它以specially linked函数开始。
- 那function调用了一个内部函数。
- internal function e.g.
do_sys_truncate()
调用实际内核 API。 - kernel API e.g.
vfs_truncate()
负责繁重的工作。 - 那个内核 API 就是 exported 内核代码的其余部分。
因此,本质上,用户space mmap()
只是通往内部内核 API 的另一条更复杂的路径,内核的其余部分可以通过其他方式访问它,更简单的路径。