Linux 是否对页目录和页表使用自映射?
我只是问这个问题,因为我很好奇 Linux 内核是如何工作的。根据 http://i-web.iu-tokyo.ac.jp/edu/training/ss/lecture/new-documents/Lectures/02-VirtualMemory/VirtualMemory.ppt Windows 在其页面目录中使用特殊条目和名为 self-map 的页表,以便能够操作内核虚拟地址空间中的页目录/表内容。如果有人熟悉Linux内存管理,请告诉我Linux内核是否以类似或不同的方式处理这个问题。谢谢。
I'm just asking this question because I'm curious how the Linux kernel works. According to http://i-web.i.u-tokyo.ac.jp/edu/training/ss/lecture/new-documents/Lectures/02-VirtualMemory/VirtualMemory.ppt Windows uses special entries in its page directory and page tables named self-map in order to be able to manipulate page directory/tables content from kernel virtual address space. If anyone is familiar with Linux memory management, please tell me if Linux kernel handle this problem in a similar or different way. Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
是的,在 Linux 中页表也映射到地址空间。但某些架构中的分页数据结构可能使用物理地址。所以它在 Linux 中没有修复。但您可以轻松访问该表。
下面是访问页表的内核代码
要了解有关 Linux 内存管理的更多信息请参阅此
Cr3 寄存器IA32存储的是页表基指针(pgd指针),页表基指针存储的是物理地址。 即使对于 Windows 也是如此(因为它是 x86 处理器的一项功能,而不是操作系统)。
阅读本文了解 IA32 分页。
编辑2:
任务结构包含一个mm_struct 与内存管理相关的实例任务(所以是一个进程),这个
mm_struct
有一个pgd_t * pgd
。 load_cr3 加载cr3寄存器中页目录表的物理地址,但它采用的是pgt的虚拟地址。所以mm_struct
包含了pgt
的虚拟地址。由于页表位于内核空间中,并且内核虚拟内存直接映射到 RAM,因此这是一个简单的宏。
Yes, in Linux also page tables are mapped to address space. But paging data structures in some of the architectures may use physical addresses. So it not fixed in Linux. But you can access the table easily.
Here is the kernel code to access the page table
To understand more about Linux memory management see this
Cr3 register on IA32 stores the page table base pointer (pgd pointer), which stores physical address. This is true even for Windows (as it is a feature of the x86 processor, not of the OS).
Read this article to understand IA32 paging.
Edit2:
Task struct contains a mm_struct instance related to Memory management of that task (so a process), this
mm_struct
has apgd_t * pgd
. load_cr3 loads a physical address of page directory table incr3
register but it takes the virtual address of pgt. Somm_struct
contains the virtual address ofpgt
.Since page tables are in kernel space and kernel virtual memory is mapped directly to ram it's just easy macro.