Linux内存管理二(页表)

本文详细介绍了Linux内存管理中的页表机制,包括多级分页模型的节省内存优势、数据结构如pgd_t、pud_t、pmd_t、pte_t的定义,以及页表项中的_PAGE_PRESENT、_PAGE_DIRTY等关键信息,阐述了如何创建和操作页表项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.综述

用来将虚拟地址空间映射到物理地址空间的数据结构称为页表,即页表用于建立用户进程的虚拟地址空间和系统物理内存(内存、页帧)之间的关联

实现两个地址空间的关联最容易的方法是使用数组,对虚拟地址空间中的每一页,都分配一个数组项。该数组项指向与之关联的页帧, 但有一个问题,一般Linux体系结构使用4 KiB页,在虚拟地址空间为4 GiB的前提下,则需要包含100 万项的数组。在64位体系结构上,情况会更糟糕。每个进程都需要自身的页表,因此系统的所有内存 都要用来保存页表,也就是说这个方法是不切实际的。

因为虚拟地址空间的大部分区域都没有使用,因而也没有关联到页帧,那么就可以使用功能相同 但内存用量少得多的模型:多级分页,多级分页模型如下(以三级页表为例):

虚拟地址的第一部分称为全局页目录(Page Global Directory,PGD)。PGD用于索引进程中的一 个数组(每个进程有且仅有一个),该数组是所谓的全局页目录或PGD。PGD的数组项指向另一些数 组的起始地址,这些数组称为中间页目录(Page Middle Directory,PMD)。

虚拟地址中的第二个部分称为PMD,在通过PGD中的数组项找到对应的PMD之后,则使用PMD 来索引PMD。PMD的数组项也是指针,指向下一级数组,称为页表或页目录。

虚拟地址的第三个部分称为PTE(Page Table Entry,页表数组),用作页表的索引。虚拟内存页和 页帧之间的映射就此完成,因为页表的数组项是指向页帧的。

虚拟地址最后的一部分称为偏移量。它指定了页内部的一个字节位置。归根结底,每个地址都指 向地址空间中唯一定义的某个字节。

页表的一个特色在于,对虚拟地址空间中不需要的区域,不必创建中间页目录或页表。与前述使 用单个数组的方法相比,多级页表节省了大量内存。

当然,该方法也

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值