我正在研究linux设备驱动程序,发现页数等于帧数。每个页面映射到每个帧。它说就像每当程序需要内存时它都会分配页面。
但是在操作系统书籍中,我发现虚拟地址分为页面,这些页面被加载到框架中。那么页面数如何等于框架?
以上哪个是正确的?linux如何在页表中存储有关虚拟、页面、框架映射的信息?
我完全糊涂了。
我正在研究linux设备驱动程序,发现页数等于帧数。每个页面映射到每个帧。它说就像每当程序需要内存时它都会分配页面。
但是在操作系统书籍中,我发现虚拟地址分为页面,这些页面被加载到框架中。那么页面数如何等于框架?
以上哪个是正确的?linux如何在页表中存储有关虚拟、页面、框架映射的信息?
我完全糊涂了。
物理页面被称为page frames
(你可以称它们为框架)。该术语是为虚拟内存中的页面page
保留的。
虚拟内存被内核分成大小相等的块。物理内存也被划分为相同大小的页面(页框)。
例如,如果我们有 4GB 的 RAM,在 32 位架构上,这意味着:1048576 个大小为 4KB 的页面帧
让我们继续,
内核为每个页框(物理页)维护一个结构struct page
。这个结构在linux/mm_types.h
(https://github.com/torvalds/linux/blob/master/include/linux/mm_types.h)中定义,这个结构包含一个名为mapping
(struct address_space *mapping
)的成员,它指定页框所在的地址空间位于。还有一个名为的成员index
表示此映射内的偏移量。
所有结构页面都保存在全局mem_map
数组中,内核使用该数组来了解虚拟内存和物理内存之间的所有关联。
最后,要将虚拟地址转换为物理地址,内核使用virt_to_page()
定义的宏asm-i386/page.h
指向pfn_to_page
(https://github.com/torvalds/linux/blob/master/include/asm-generic/memory_model.h)。
在举个例子之前,让我们看看 32 位架构中的地址布局
| 10 位 - 目录 | 10 位 - 页表 | 12 位 - 偏移 |
让我们看一个将内存虚拟地址转换为物理地址的示例:
http://img11.imageshack.us/img11/9426/pagingexample.png
希望这有帮助。
问候。