mmap在内核空间和用户空间中是否相同?

问题描述

我的问题不仅限于mmap(),而是所有在内核空间代码用户空间代码中都使用过的函数(当从用户空间调用时-是系统调用)。一个示例,如果我从用户空间调用mmap(),其中包括一个上下文切换(SYSENTER / INT 80H),但是如果我从内核调用mmap则不需要。我的问题是mmap()函数在内核或用户空间中是否相同。如果相同,那么如果从内核调用了mmap,是否可以不执行SYSENTER / INT 80H

解决方法

mmap(2)的实现方式不具说明性,因为它具有兼容性伪像,但这是truncate(2)的示例:

  1. 用户空间调用以specially linked函数开头的内核空间。
  2. function调用内部函数。
  3. internal function e.g. do_sys_truncate()调用到实际的内核API。
  4. kernel API e.g. vfs_truncate()做得很繁重。
  5. 该内核API就是其余内核代码的exported

因此,从本质上讲,用户空间mmap()只是内部内核API的另一条更复杂的路径,内核其余部分可以通过其他更简单的路径访问内部内核API。