mmap() 在内核空间和用户空间中是不是相同?

Posted

技术标签:

【中文标题】mmap() 在内核空间和用户空间中是不是相同?【英文标题】:Is mmap() same in kernel space and user space?mmap() 在内核空间和用户空间中是否相同? 【发布时间】:2020-12-04 23:51:20 【问题描述】:

我的问题不仅限于mmap(),而是在内核空间代码和用户空间代码中使用的所有函数(从用户空间调用时 - 系统调用)。例如,如果我从用户空间调用mmap(),其中包括上下文切换(SYSENTER / INT 80H),但是如果我从内核调用mmap,则不需要这样做。我的问题是,mmap() 函数在内核或用户空间中是否相同。如果相同,如果从内核调用 mmap 实现是否设法不执行SYSENTER / INT 80H

【问题讨论】:

Linux内核中没有这个功能。 【参考方案1】:

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,内核的其余部分可以通过其他更简单的路径访问它。

【讨论】:

以上是关于mmap() 在内核空间和用户空间中是不是相同?的主要内容,如果未能解决你的问题,请参考以下文章

将 mmap 的区域传回内核空间

内存映射mmap 和 共享内存

Linux 内核 内存管理内存管理架构 ② ( 用户空间内存管理 | malloc | ptmalloc | 内核空间内存管理 | sys_brk | sys_mmap | sys_munmap)

再学零拷贝与mmap

认真分析mmap:是什么 为什么 怎么用

再学零拷贝与mmap