gpt4 book ai didi

c - 内存映射内核空间的解剖结构

转载 作者:IT王子 更新时间:2023-10-28 23:38:32 26 4
gpt4 key购买 nike

我尝试了解Linux中使用mmap将内核模式空间映射到用户模式空间的机制。

首先,我有一个可加载内核模块 (LKM),它提供了具有 mmap 功能的字符设备。然后一个用户空间应用程序打开设备并调用mmap LKM 在内核态空间(虚拟高地址)内的LKM 堆上分配内存空间。在用户空间端,数据指针指向一个虚拟低地址。

下图展示了我想象的内存的解剖结构。是这样吗?

Memory mapping

如果问题不清楚,请告诉我,我会尝试添加更多细节。


编辑:图片针对 Gil Hamilton 进行了编辑。黑色箭头现在指向一个物理地址。

最佳答案

该图遗漏了一些重要的基本假设。

内核不需要mmap()来访问用户空间内存。如果用户进程拥有内存,则根据定义,它已经映射到地址空间中。从这个意义上说,内存已经在用户和内核之间共享。

mmap() 在用户的虚拟地址空间中创建一个新区域,以便以后访问该地址区域可以由物理内存填充。内存的实际分配和页表项的修改由内核完成。

mmap() 只对管理用户一半的虚拟地址空间有意义。内核的一半地址空间的管理方式完全不同。

此外,内核的一半由系统中的所有进程共享。每个进程都有其专用的虚拟地址空间,但页表的编程方式是,内核半部分的页表条目对所有进程都设置完全相同。

同样,内核不会mmap() 来访问用户空间内存。 mmap() 是内核提供给用户的一种服务,用于修改用户虚拟地址空间中的当前映射。

顺便说一句,内核实际上有几种方法可以访问用户内存。

首先,内核有一个专用的内核地址空间区域(作为其内核空间的一部分),它以连续的方式映射整个物理内存。 (在所有 64 位系统中都是如此。在 32 位系统中,内核必须即时“重新映射”才能实现这一点。)

其次,如果内核是通过系统调用或异常进入的,而不是硬件中断,那么你有有效的进程上下文,所以内核可以直接“解引用”用户空间指针来获取正确的值。

第三,如果内核想要在借用的上下文(例如中断处理程序)中执行时尊重进程的用户空间指针,内核可以通过遍历 vm_area_struct 树来跟踪进程的虚拟地址以获得权限并遍历页表以找出实际的物理页框。

关于c - 内存映射内核空间的解剖结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36264285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com