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() 在内核空间和用户空间中是不是相同?的主要内容,如果未能解决你的问题,请参考以下文章
Linux 内核 内存管理内存管理架构 ② ( 用户空间内存管理 | malloc | ptmalloc | 内核空间内存管理 | sys_brk | sys_mmap | sys_munmap)