问题描述
我的问题不仅限于mmap()
,而是所有在内核空间代码和用户空间代码中都使用过的函数(当从用户空间调用时-是系统调用)。一个示例,如果我从用户空间调用mmap()
,其中包括一个上下文切换(SYSENTER / INT 80H)
,但是如果我从内核调用mmap
则不需要。我的问题是mmap()
函数在内核或用户空间中是否相同。如果相同,那么如果从内核调用了mmap,是否可以不执行SYSENTER / INT 80H
?
解决方法
mmap(2)
的实现方式不具说明性,因为它具有兼容性伪像,但这是truncate(2)
的示例:
- 用户空间调用以specially linked函数开头的内核空间。
- function调用内部函数。
- internal function e.g.
do_sys_truncate()
调用到实际的内核API。 - kernel API e.g.
vfs_truncate()
做得很繁重。 - 该内核API就是其余内核代码的exported。
因此,从本质上讲,用户空间mmap()
只是内部内核API的另一条更复杂的路径,内核其余部分可以通过其他更简单的路径访问内部内核API。