理论+实例,带你掌握Linux的页目录和页表

如题所述

在操作系统加载用户程序时,内存管理至关重要。除了存放程序内容,还需为页目录和页表分配物理内存。在x86系统中,为了提高内存使用效率,采用分页机制,将物理内存按4KB为单位进行划分。

最初的映射表虽能映射虚拟内存到物理内存,但4MB的物理空间占用过大。为解决这个问题,引入了页目录和页表的两级转换。页目录负责管理1024个页表的地址,每个页表包含1024个表项,每个表项对应一个物理页。

页目录自身占用4KB物理内存,对于小空间程序来说浪费。通过拆分映射表为1024个页表,每个页表只占用1个物理页的空间,更有效地利用内存。用户程序通常只需要几十个页表,比如10MB程序只需3个页表,加上页目录,总共16KB空间。

处理器通过CR3寄存器获取当前任务的页目录地址,每个程序有自己的页目录和页表。在加载过程中,操作系统分配页目录、分配物理页到页表,并更新TSS段中的页目录地址。线性地址经过页目录和页表的转换,最终得到物理地址。

当用户程序运行时,例如一个20MB程序在1GB物理内存中,通过计算确定页目录的使用。程序被加载到虚拟内存,然后分配页目录、页表,根据程序内容的线性地址,依次填充页目录和页表的表项。这个过程确保了线性地址到物理地址的正确转换。
温馨提示:内容为网友见解,仅供参考
无其他回答

理论+实例,带你掌握Linux的页目录和页表
页目录自身占用4KB物理内存,对于小空间程序来说浪费。通过拆分映射表为1024个页表,每个页表只占用1个物理页的空间,更有效地利用内存。用户程序通常只需要几十个页表,比如10MB程序只需3个页表,加上页目录,总共16KB空间。处理器通过CR3寄存器获取当前任务的页目录地址,每个程序有自己的页目录和页表。在...

Linux 页表初探
每个进程均有一个页表,保存在进程的pgd字段中。页目录表和页表都存在于物理内存中,每个表中项保存的地址均为物理地址。页目录表和页表占用的内存示意图如下。每个进程的页表保存在进程的pgd字段中。页面换入和换出机制允许操作系统在物理内存不足时,将暂时不用的页面替换出去,保存到磁盘(交换设备)...

Linux内核:内存管理——分页机制
分页机制与分段机制存在区别,分页使用固定长度页面,而段的长度与存储的代码或数据结构相匹配。分页减少了地址转换所需总线周期数量,通过缓存最近访问的页目录和页表(TLB)减少内存访问。页表描述分页转换功能,由物理地址数组组成,线性地址高20位作为索引值选择物理地址基地址,低12位作为偏移量。每个页表...

关于虚拟内存中页目录与页表在物理内存中加载的问题
首先,物理内存无所谓内核区用户区,所有地址都一样。虚拟的地址空间才分内核区用户区。处理器通过查看页目录和页表,把虚拟地址换算成物理地址。用户区与内核区的两个不同的虚拟地址对应同一个物理地址也不要紧。内核区与用户区的真正区别在于普通进程能不能访问该区域中的地址。在正常情况下,操作系统肯...

Linux下逻辑地址-线性地址-物理地址详解
页表是关键组件,它将线性地址分解为目录页、表页和偏移量,通过两级查找确定物理地址。32位线性地址由三部分组成:目录页偏移、表页偏移和物理页内的偏移。页目录表和页表分别存储这些信息,每个任务有自己的页目录表和页表,以实现每个任务的独立虚拟内存空间。当遇到未分配的页表项时,Linux会处理缺页...

Linux 写时复制机制详解
函数检查源和目标地址的对齐性,并计算需要复制的页目录项和页表。如果遇到无效页目录项,程序会报错。最后,通过设置页表项为只读,当尝试写入共享空间时,会触发写保护异常处理,即写时复制(COW)。在异常处理函数do_wp_page中,针对未共享页面和共享页面两种情况,执行不同的操作。对未共享页面,直接...

linux为什么主要采用分页机制来实现虚拟存储管理
页内偏移 最低12位 即页表被划分为页目录表Directory和页中间表Tabl两个部分 此种情况下, 线性地址的转换分为两步完成.第一步, 基于两级转换表(页目录表和页中间表), 最终查找到地址所在的页帧 第二步, 基于偏移, 在所在的页帧中查找到对应偏移的物理地址 使用这种二级页表可以有效的减少每个...

linux中将虚拟地址转物理地址(进程地址空间介绍)
在第三部分,我们将通过一个实例来展示如何使用这些信息。编写一个程序模块,用于打印进程的线性区起始和结束地址,以及代码段、数据段、堆、栈等部分的地址。这将帮助我们更好地理解进程地址空间的布局。接下来,我们将详细介绍如何将虚拟地址转换为物理地址。在Linux中,处理器的分页单元根据页目录和页表...

学嵌入式linux需要先学什么?
我的专长是操作系统,是快速地带领大家掌握一些项目开发的基础知识。 如果你决定深入研究某方面时,我并不能带你多久。你要去看源码,去看这方面的专业书籍。 比如想深入钻研内核的内存管理时,它有页表映射(你需要阅读ARM架构的手册)、SLAB分配器、vmalloc\/malloc实现、mmap实现、缺页中断、父进程子进程之间的页面管理...

MMU和虚拟内存的问题
你应该已经知道,32位系统的内存寻址是直接使用32位数据的,对于进程而言,这32位的数据并非实际内存地址,其中10位用来表示页分组索引,每个进程都会维护这样一个分组索引;而另10位用来表示页索引,用来在分组中定位页面,最后12位则是相对地址,之所以是12位是因为windows采用了4k的页表,12位可以完全...

相似回答
大家正在搜