分页机制

Linux内存寻址之分段机制及分页机制 前言 最近在学习Linux内核,读到《深入理解Linux内核》的内存寻址一章。原本以为自己对分段分页机制已经理解了,结果发现其实是一知半解。于是,查找了很多资料,最终理顺了内存寻址的知识。现在把我的理解记录下来,希望对内核学习者有一定帮助,也希望大家指出错误之处。 分段到底是怎么回事 相信学过操作系统课程的人都知道分段分页,但是奇怪的是书上基本没提分段分页是怎么产生的,这就导致我们知其然不知 阅读详情

本文为<x86汇编语言:从实模式到保护模式> 第16章笔记


因为段的长度不定, 在分配内存时, 可能会发生内存中的空闲区域小于要加载的段, 或者空闲区域远远大于要加载的段. 在前一种情况下, 需要另外寻找合适的空闲区域; 在后一种情况下, 分配会成功, 但太过于浪费. 为了解决这个问题, 从80386处理器开始, 引入了分页机制. 分页功能从总体上来说, 是用长度固定的页来代替长度不一定的段, 藉此解决因段长度不同而带来的内存空间管理问题. 尽管操作系统也可以用软件来实施固定长度的内存分配, 但太过于复杂, 由处理器固件来做这件事, 可以使速度和效率最大化.

分页机制概述

简单的分页模型

处理器中有负责分段管理的段部件, 每个程序或任务都有自己的段, 这些段都用段描述符定义. 随着程序的执行, 当要访问内存, 就用段地址加上偏移量, 段部件就会输出一个线性地址. 在单纯的分段模式下, 线性地址就是物理地址.

一旦决定采用页式内存管理, 就应当把4GB内存分成大小相同的页. 页的最小单位是4KB, 也就是4096字节, 用十六进制表示就是0x1000. 因此, 第一个页的物理地址就是0x00000000, 第2个页的物理地址是0x00001000, 第3个页的物理地址是0x00002000....最后一个页的物理地址是0xfffff000. 这样,  4GB内存划分为1048576(0x100000)个页. 很显然, 页的物理地址, 其低12位始终为0.

段管理机制对于Intel处理器来说是最基本的, 任何时候都无法关闭. 也就是说, 即使启用页管理功能, 分段机制依然是起作用的, 段部件依然工作.


如上图所示, 内存的分配设计段空间的分配和页分配. 左边是虚幻的, 或者说虚拟的4GB内存空间, 称为虚拟内存; 右边是实实在在的内存, 被分成1048576个4KB的页面(每个方框4KB, 灰色代表已分配).

在分页模式下, 操作系统可以创建一个为所有任务公用的4GB虚拟内存空间, 也可以为每一个任务创建独立的4GB虚拟内存空间, 这都是可行的. 当一个程序加载时, 操作系统既要在左边的虚拟内存中分配段空间, 又要在右边的物理内存中分配相应的页面. 因此, 第一步骤是寻找空闲的段空间, 该段空间既没有被其他程序使用, 也没有被同一程序内的其他段使用. 比如上图, 假设已经成功找到并分配了一个段空间, 基地址为0x00200000, 长度为8200字节.

页的最小尺寸是4KB, 也就是4096字节, 因此, 8200字节的段, 需要占用3个页面, 其中最后一个页面只用了8个字节, 其余都是浪费着, 但这无关紧要, 如果允许页共享, 多个段或多个程序可以用同一个页来存放各自的数据. 在分段之后, 操作系统的任务就是把段拆开, 并分别映射到物理页. 注意, 段必须是连续的, 但不要求所分配的页都是连续的, 挨在一起的.

就上图中的列子来说, 该段有8200字节, 需要分配3个页面. 操作系统在物理内存中搜索可用的空闲页, 接下来, 要建立线性地址和也之间的对应关系, 在图中, 0x200000~0x00200FFF对应着物理地址为0x00002000的页, 0x00201000~0x00201FFF对应着0x00004000, 0x00202000~0x00202007对应着0x00007000的页, 当然, 这里只是示例, 线性地址区间和页的对应关系可以随意.

4GB虚拟内存空间不可能用来保存任何数据, 因为它是虚拟的, 它只是用来指示内存的使用情况. 当操作系统加载一个程序并创建为任务时, 操作系统在虚拟内存空间寻找空闲的段, 并映射到空闲的页, 然后, 到真正开始加载程序时, 再把原本属于段的数据按页的尺寸拆开, 分开写入对应的页中.

从段部件输出的是线性地址, 或者叫做虚拟地址. 为了根据线性地址找到页的物理地址, 操作系统必须维护一张表, 把线性地址转换成物理地址, 这是一个反过程.

如上图所示, 因为有1048576个页, 故转换表有1048576个表项. 这是个一维表格, 每个表项占4字节, 内容为页的物理地址. 这个表格的用法是这样的: 因为页的尺寸是4KB, 故, 线性地址的低12位可用于访问页内偏移, 高20位可用于指定一个物理页. 因此, 把线性地址的高20位当成索引, 乘以4, 作为表内偏移量, 从表中取出一个双字, 那就是该线性地址做对应的页的物理地址. 举个例子: mov edx, [0x0002]    执行这条指令, 段部件用段地址0x00200000加上指令中给出的偏移量0x2002, 得到线性地址0x00200002. 线性地址的高20位是表格索引, 即0x00200, 将索引乘以4, 得到0x00800, 这就是表内偏移, 看图, 从该单元可以取出一个双字0x00007000, 这就是页物理地址. 线性地址的低12位是页内偏移, 用页物理地址加上页内偏移量, 就是最终的物理内存地址. 0x00007000加上0x0002, 得到0x00007002, 这就是实际要访问的物理内存地址. 这里有个问题, 为什么表内表内偏移为0x000800的地方, 会恰好是物理地址0x00007000, 而不是其他页地址呢? 当程序加载时, 操作系统会首先在虚拟内存中分配段, 然后, 根据段需要分成多少页, 来搜索空闲页面. 当段较大时, 要按页的尺寸分成好几个地址区段, 操作系统用每个区段的首地址, 取高20位, 乘以4, 作为偏移量访问表格, 并将分配给区段的页的物理地址写入该表项. 最后, 把原本需要写入每个区段的程序数据, 写到对应的页中. 注意了, 在页式内存管理中, 页面的管理和分配是独立的, 和分段以及段地址没有关系.操作系统所要做的, 就是寻找空闲页面, 把它分配给需要的段, 并将页的物理地址填写到映射表内. 很显然, 也很重要的结论是, 线性地址, 包括线性地址空间, 和页面分配机制没有关系.

基于以上特点, 同时为了充分挖掘分页内存管理的潜力, 一般来说, 每个任务都可以拥有4GB的虚拟内存空间; 同时, 每个任务都有自己的4GB虚拟内存空间, 但是, 很重要的是, 在整个系统中, 物理页面是统一调配的. 考虑这样一种情景: 任务A有一个段, 基地址为0x00050000, 长度为3000自己, 系统为它分配了物理地址0x08001000的页. 过了一会, 任务B加载了, 它也有一个段, 基地址也是0x00050000, 长度为4096字节, 此时, 操作系统为它分配了另外一个不同的, 物理地址为0x00700000的页. 在这种情况下, 在任务A内访问线性地址0x00050006, 访问的其实是物理地址0x08001006; 在任务B内访问同样的线性地址时, 访问的其实是物理地址0x00700006.

另一个问题是, 每个任务都有4GB虚拟内存空间, 而物理内存只有一个, 最大也才4GB, 根本不够分的. 事实上, 确实不够分, 但是操作系统可以暂时将不用页退避到磁盘, 调入马上要使用的页, 通过这种手段来实现分页内存管理.

以上, 就是基本的段页式内存管理机制. 基本的段页式内存管理示意图:

页目录, 页表和页

我们知道, 为了完成从虚拟地址(线性地址)到物理地址的转换, 操作系统应当为每个任务准备一张页映射表. 因为任务的虚拟地址空间为4GB, 可以分出1048576个页, 所以, 映射表需要1048756个表项, 又因为每个表项4字节, 故映射表总大小为4MB. 没错, 这张表很大, 要占用相当一部分空间, 考虑到在实践中, 没有哪个任务会真的用到所有表项, 充其量只是很小一部分, 这就很浪费了.  为了解决这个问题, 处理器设计了层次化的分页结构.

分页结构层次化的主要手段是不采用单一的映射表, 取而代之的是页目录表和页表. 如下图所示:

首先, 因为4GB的虚拟内存空间对应着1048576个4KB页, 可以随机的抽取这些页, 将它们组织在1024个页表内, 每个页表可以容纳1024个页. 页表内的每个项目叫做页表项, 占4字节, 存放的是页的物理地址, 故每个页表的大小是4KB, 正好是一个标准页的长度. 注意, 页在页表内的分布是随机的, 哪个页位于哪个页表中, 这是没有规律的.

如图所示, 在将1048576个页归拢到1024个页表之后, 接着, 再用一个表来指向1024个页表, 这就是页目录表(Page Directory Table: PDT), 和页表一样, 页目录项的长度为4字节, 填写的是页表的物理地址, 共指向1024个页表, 所以页目录表的大小是4KB, 正好一个标准页的长度.

这样的层次化分页结构是每个任务都拥有的, 或者说, 每个任务都有自己的页目录和页表. 如下图所示, 在处理器中有个控制寄存器CR3, 存放着当前任务页目录的物理地址, 故又叫做页目录基址寄存器(Page Directory Base Register: PDBR). 每个任务都有自己的TSS, 其中就包括了CR3寄存器域, 存放了任务自己的页目录物理地址. 当任务切换时, 处理器切换到新任务开始执行, 而CR3寄存器的内容也被更新, 以指向新任务的页目录位置. 相应的, 页目录又指向一个个的页表, 这就使得每个任务都只在自己的地址空间内运行. 从下图可以看出, 页目录和页表也是普通的页, 混迹于全部的物理页中. 它们和普通页的不同支持仅仅在于功能不一样. 当任务撤销之后, 它们和任务所占用的普通页一样会被回收, 并分配给其他任务.

地址变换的具体过程

对于Intel处理器来说, 有关分页, 最简单和最基本的机制就是这些; CR3寄存器给出了页目录的物理地址; 页目录给出了所有页表的物理地址, 而每个页表给出了它所包含的页的物理地址. 好了, 该清楚的都清楚了, 唯一还不明白的, 应该是如何用这种层次性的分页结构把线性地址转换成物理地址? 这里举个例子, 某任务加载后, 在4GB虚拟地址空间创建了一个段, 起始地址为0x00800000, 段界限为0x5000, 字节粒度. 当前任务执行时, 段寄存器DS指向该段. 又假设执行了下面一条指令

mov edx, [0x1050]
此时, 段部件会输出线性地址0x00801050. 在没有开启分页机制时, 这就是要访问的物理地址. 但现在开启了分页机制, 所以这是一个下虚拟地址, 要经过页部件转换, 才能得到物理地址.

如下图所示, 处理器的页部件专门负责线性地址到物理地址的转换工作. 它首先将段部件送来的32位线性地址分为3段, 分别是高10位, 中间10位, 低12位. 高10位是页目录的索引, 中间10位是页表的索引, 低12位则作为页内偏移量来用.


当前任务页目录的物理地址在处理器的CR3寄存器中, 假设它的内容为0x00005000. 段管理部件输出的线性地址是0x00801050, 其二进制的形式如图中给出. 高10位是十六进制的0x002, 它是页目录表内的索引, 处理器将它乘以4(因为每个目录项4字节), 作为偏移量访问页目录. 最终处理器从物理地址00005008处取得页表的物理地址0x08001000.

线性地址的中间10位为0x001, 处理器用它作为页表索引取得页的物理地址. 将该值乘以4, 作为偏移量访问页表. 最终, 处理器又从物理地址08001004处取得页的物理地址, 这就是我们一直努力寻找的那个页.

页的物理地址是0x0000c000, 而线性地址的低12位是数据所在的业内偏移量. 故处理器将它们相加, 得到物理地址0x0000C050, 这就是线性地址0x00801050所对应的物理地址, 要访问的数据就在这里.

注意, 这种变换不是无缘无故的, 而是事先安排好的. 当任务加载时, 操作系统先创建虚拟的段, 并根据段地址的高20位决定它要用到哪些页目录项和页表项. 然后, 寻找空闲的也, 将原本应该写入段中的数据写到一个或者多个页中, 并将页的物理地址填写到相对应的页表项中. 只有这样做了, 当程序运行的时候, 才能以相反的顺序进行地址变换, 并找到正确的数据.

页目录项, 页表项, CR3和打开分页

页目录项和页表项

页目录和页表中分别存放为页目录项和页表项, 它们的格式如下:

可以看出, 在页目录和页表中, 只保存了页表或者页物理地址的高20位. 原因很简单, 页表或者页的物理地址, 都要求必须是4KB对齐的, 以便于放在一个页内, 故其低12位全是0. 在这种情况下, 可以只关心其高20位, 低12位安排其他用途.

  • P 是存在位, 为1时, 表示页表或者页位于内存中. 否则, 表示页表或者页不在内存中, 必须先予以创建, 或者从磁盘调入内存后方可使用.
  • RW 是读/写位. 为0时表示这样的页只能读取, 为1时可读可写
  • US 是用户/管理位. 为1时, 允许所有特权级别的程序访问; 为0时, 只允许特权级别为0, 1和2的程序访问.
  • PWT(Page-level Write-Through) 是页级通写位, 和高速缓存有关. "通写"是处理器高速缓存的一种工作方式, 这一位用来间接决定是否采用此种方式来改善页面的访问效率.
  • PCD(Page-level Cache Disable)是页级高速缓存禁止位, 用来间接决定该表项所指向的那个页是否使用高速缓存策略.
  • A 是访问位. 该位由处理器固件设置, 用来指示此表项所指向的页是否被访问过.
  • D(Dirty) 是脏位. 该位由处理器固件设置, 用来指示此表项所指向的页是否写过数据
  • PAT(Page Attribute Table) 页属性表支持位. 此位涉及更复杂的分页系统, 和页高速缓存有关, 可以不予理会, 在普通的4KB分页机制中, 处理器建议将其置0.
  • G 是全局位. 用来指示该表项所指向的页是否为全局性质的. 如果页是全局的, 那么, 它将在高速缓存中一直保存(也就意味着地址转换速度会很快). 因为页高速缓存容量有限, 只能存放频繁使用的那些表项. 而且, 当因任务切换等原因改变CR3寄存器的内容时, 整个页高速缓存的内容都会被刷新.
  • AVL位卑处理器忽略, 软件可以使用.

CR3(PDBR)和开分页机制

控制寄存器CR3, 也就是页目录表基地址寄存器PDBR, 该寄存器如上图所示.

由于页目录表必须位于一个自然页内(4KB对齐), 故其物理地址的低12位是全0. 低12位除了PCD和PWT外, 都没有使用. 这两位用于控制页目录的高速缓存特性, 参见上面解释.

控制寄存器CR0的最高位PG位, 用于开启分页或者关闭页功能. 当该位清0时, 页功能关闭, 从段部件来的线性地址就是物理地址. 当它置位时, 页功能开启. 只能在保护模式下才能开启分页功能, 当PE位清0时(实模式), 设置PG位将导致处理器产生一个异常中断.

内存寻址之分页机制 写在前面:分页机制完成线性地址到物理地址的转换 80x86 规定分页机制是可选的。分段和分页没有什么必然联系,分段可以说是 Intel 的 CPU 一直保持着的一种机制,而分页只是保护模式下的一种内存管理策略。想开启分页机制,CPU必须工作在保护模式,而工作在保护模式可以不开启分页。分页机制由控制寄存器 CR0 中的 PG 位启用,如PG=1则启用分页机制,把线性地址转换为物理地址;如果PG=0则直 阅读详情

相关推荐

Linux内存寻址——分页机制

一、 分页机制 分页机制在段机制之后进行,完成线性地址到物理地址的转换。段机制把虚拟地址转换为线性地址,分页机制进一步把该线性地址转换为物理地址。 如果不允许分页(控制寄存器CR0的最高位置0),那么经过段机制转化而来的32位线性地址就是物理地址。但如果允许分页(CR0的最高位置1),就要将32位线性地址通过一个地址变换机制转化成物理地址。80x86规定,分页机制是可选的,但很多操作系统主要采...

xiezhi123456的博客 411

分页机制详解

##### 解决内存不足 > 解除线性地址与物理地址一一对应的关系,然后将它们的关系重新 > 建立。通过某种映射关系,可以将线性地址映射到任意物理地址。 > > 对于地址转换这种实时性较高的需求,查找页表的工作也是由硬件完成的。 分页机制要建立在 分段机制的基础上,也就是说,段部件的工作依然免不了,所以,分页 只能是在分段之后进行的, 分页机制的作用有两方面。 - 将线性地址转换成物理地址。 - 用大小相等的页代替大小不等的段。

weixin_61631200的博客 1104

uniapp+openlayers集成天地图实战:renderjs通信陷阱与性能优化避坑指南

本文深入探讨了uniapp与openlayers集成天地图时的renderjs通信陷阱与性能优化策略。通过实战案例解析了renderjs的特殊通信机制、地图实例生命周期管理、图层懒加载等关键技巧,帮助开发者避免常见坑点,提升应用流畅度。特别针对多语言切换、热重载偏移等疑难问题提供了解决方案,是uniapp+openlayers开发者的实用避坑指南。

weixin_30872157的博客 362

深入理解计算机系统-之-内存寻址(五)--页式存储管理

前景回顾前面我们讲解了操作系统段式存储管理的主要内容。 32位,在保护方式下,其能够访问的线性地址空间可达4GB,而且允许几乎不受存储空间限制的虚拟存储器程序。虚拟存储器地址空间能够可达64TB。它还提供了复杂的存储管理和硬件辅助的保护机构和增加了支持多任务操作系统的特别优化的指令。实际上,64TB的虚拟地址空间是有磁盘等外部存储器的支持下实现的。在编写程序是可以放在磁盘存储器上,但在执行时,必须把

OSKernelLAB(gatieme) 1万+

Halcon窗体开发避坑指南:C#自定义控件实现7大图像交互功能

本文详细介绍了如何利用C#封装自定义Halcon控件,以解决原生HWindowControl功能不足的问题。通过实战代码,展示了如何实现图像按比例显示、鼠标拖动缩放、灰度值读取、图像保存、截图及图形叠加等七大核心交互功能,并重点剖析了内存管理、坐标转换等开发避坑要点,帮助开发者构建稳定可复用的机器视觉组件库。

weixin_29251131的博客 292

Opencv相机校准之棋盘格标定

Reference: https://yq.aliyun.com/articles/62472

y459541195的博客 3万+

Linux内核:内存管理——分页机制

线性地址的低 12 位给出了页面中的偏移量,加上页面的基地址最终形成对应的物理地址。由于页面基地址对齐在 4K 边界上,因此页面基地址的低 12 为肯定是 0 ,这意味着 高 20 位的页面基地址 和 12 位偏移地址连接组合在一起就能得到对应的物理地址。当使用分页时,处理器会把线性地址空间划分成固定大小的页面(4KB),这些页面可以映射到物理内存中或磁盘存储空间中,当一个程序引用内存中的逻辑地址时,处理器会把该逻辑地址转换成一个线性地址,然后使用分页机制把该线性地址转换成对应的物理地址。

m0_74282605的博客 884

手把手教你用若依WMS搭建企业级仓库管理系统(Vue+Spring Boot实战)

本文提供了一份基于若依框架(RuoYi)快速搭建企业级仓库管理系统(WMS)的实战指南。详细介绍了从环境准备、项目初始化到核心功能模块(如入库流程、库存管理看板)深度定制的全过程,并涵盖Lodop打印集成、移动端PWA适配及生产环境Docker部署等高级主题,帮助开发者高效构建稳定可用的WMS系统。

weixin_29015899的博客 562

Linux——页表的分页机制

以32位机器为例,页框的个数为4GB / 4KB也就是2^20次方个,假设一个表项占有4Byte,总共有4MB的连续空间需要使用,也就是说,每次调度进程时,这4MB的空间都要被使用。每个页框4KB,共有4x1024个地址,即2^12次方,页内偏移即虚拟地址后12位,也是2^12次方,正好可以偏移出一个页框中全部地址。虚拟地址前20位是两级页表的索引,共能索引出2^20次方个页框,内存共4GB即2^20次方个页框,因此正好与之一一对应。linux将虚拟地址的32位分为前10位、中间10位、后置12位。

weixin_61857742的博客 2072

TSP:车为什么能和云端交互?

TSP:车为什么能和云端交互?

天赐好车的博客 410

使用cutoff包基于最小p值法方法计算最佳截断值(基于LIRI基因数据集) R语言

这个方法在生物学研究中具有重要的意义,能够帮助我们从大规模基因表达数据中准确地找到差异显著的基因。在上述代码中,calculate_p_values函数是一个自定义函数,用于计算差异表达基因的p值。在本文中,我们将介绍如何使用R语言的cutoff包来基于最小p值法方法计算最佳的截断值,以便筛选出差异显著的基因。通过以上步骤,我们成功地使用cutoff包基于最小p值法方法计算了最佳的截断值,并筛选出了差异显著的基因。最后,我们可以根据得到的最佳截断值将基因表达数据集进行筛选,提取出差异显著的基因。

ByteKnight的博客 1291

分段和分页

一. 分页存储管理 1.基本思想     用户程序的地址空间被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配。 2. 分页存储管理的地址机构 15          12         11                  0      页号P                 页

复兴之路 3万+

深度探索:VS2022 牵手 DeepSeek,开启开发新征程

通过将 VS2022 与 DeepSeek 接入,我们成功开启了智能开发的新征程。从前期的硬件准备、软件环境搭建,到实战环节的一步步配置与整合,再到全面的测试与验证,每一个步骤都充满挑战,但也带来了满满的收获。在实际应用中,VS2022 与 DeepSeek 的结合展现出了强大的优势,为开发者带来了更高的效率和更出色的代码质量。无论是代码自动补全、智能代码审查,还是自然语言交互编程,都让开发过程变得更加智能、便捷,极大地提升了开发体验。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 3522

分段和分页机制

一 分段机制   1、什么是分段机制    分段机制就是把虚拟地址空间中的虚拟内存组织成一些长度可变的称为段的内存块单元。   2、什么是段    每个段由三个参数定义:段基地址、段限长和段属性。    段的基地址、段限长以及段的保护属性存储在一个称为段描述符的结构项中。   3、段的作用    段可以用来存放程序的代码、数据和堆栈,或者用来存放系统数据结

qq_37924084的博客 1万+

【DRAM存储器六十四】DDR5介绍--preamble、postamble、interamble、刷新、power down、MPSM

简述DDR5 reamble、postamble、interamble、刷新、power down、MPSM的功能定义

highman110的博客 334

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

x86分页机制详解

文章目录1. 为什么会有分页机制?2. 从虚拟地址到物理地址3. 简单的分页模型4. 页表和页目录4.1 层次化的分页结构4.2 页表4.3 页目录5. 地址变换的具体过程 1. 为什么会有分页机制? 有些资料说是为了实现“虚拟内存”,真的是这样吗?如果没有分页机制,能否实现“虚拟内存”?答案是肯定的。 当同时运行的任务很多时,内存可能就不够用。 如图所示,每个段描述符都有 AVL 位(简称 A 位),用于表示一个段最近是否被访问过(准确地说是表明从上次操作系统清零该位后一个段是否被访问过)。 当创建描述

车子(chezi) 2511

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

内存分页机制

内存分页机制

weixin_42888638的博客 2466

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

django的分页机制

 翻译自官方文档分页机制¶Django 1.0 中分页机制和先前已经大不相同。它提供了一些类协助你把数据分页。对应的文件为 django/core/paginator.py举例¶类Paginator,带两个构造参数,一个就是数据的集合,另一个表示每页放几个数据。>>> from django.core.paginator import Paginator>>> object

huliuhe的专栏 8382

分页机制总结

【0】写在前面(分页机制) 0.0) source code from orange’s implemention of a os and text description from Zhaojiong’s perfect analysis of Linux kernel 0.1)本代码旨在演示 怎样开启分页机制 + 怎样构建页目录和页表 0.3)本文 只对 与 分页机制的 代码进行简要注释,言简

PacosonSWJTU的博客 842

分段机制与分页机制

前言 根据《Linux内核完全注释》做的笔记 目的是理清下述关键词的含义及相互联系,最终彻底理解分段机制与分页机制 分段机制 段描述符 段选择符 段寄存器 GDT 全局描述符表 LDT 局部描述符表 分页机制 页表 TLB 转换查找缓冲区 逻辑地址 线性地址 物理地址 概念简述 段描述符 记录段信息,包括权限、基地址等 段选择符 理解为索引,从描述符表中定位到唯一的段描述符 因此,段寄存器只需要存段选择符,就能根据段寄存器找到段描述符从而获得段基址 段基址寄存器 存放段基址 如 L

DaHuangXiao的博客 756

分页机制+实践

分页机制+实践 段机制把逻辑地址转换为线性地址,分页机制进一步把该线性地址再转换为物理地址。分页功能从总体上来说, 是用长度固定的页来代替长度不一定的段,分页就是将程序分成若干相同大小的页,每页4K个字节。从80386开始,所有的80x86处理器都支持分页,它通过设置CR0寄存器的PG标志启用。当CR0中的PG=0时,禁止使用分页机制,此时分段机制产生的线性地址直接当做物理地址使用;若PG=1,则启用分页机制。 页:将线性地址空间划分成若干大小相等的片。 物理块或页面:将物理地址空间分成与页大小相等的若干存

qq_39790702的博客 450

对linux分页机制的一些认识

x86 CPU中段机制(Segmentation)可以将程序的代码(Code)、数据(Data)、栈(Stack)分开,这样多个程序(或进程)就可以在同一个CPU上运行,而相互不会干扰。 页机制(Paging)用来实现传统的以页面为需求的虚拟内存系统,只有程序需要时,才真正给进程分配物理内存。页机制也可以用来隔离多个任务。 一、硬件中的分页 我们还是从实现linux分页机制的软硬件...

Hansen何的博客 616

X86中的分页机制

一、分页机制分页机制是80x86内存管理机制的第二部分。它在分段机制的基础上完成虚拟(逻辑)地址到物理地址转换的过程。分段机制把逻辑地址转换成线性地址,而分页则把线性地址转换成物理地址。分页可以用于任何一种分段模型。处理器分页机制会把线性地址空间(段已映射到其中)划分成页面,然后这些线性地址空间页面被映射到物理地址空间的页面上。分页机制有几种页面级保护措施,可和分段机制保护机制合用或替代分段机

yyt7529的专栏 3257

【操作系统】分页机制

操作系统实验:分页机制

qq_57438473的博客 1035
上一篇: 任务切换
下一篇: 中断和异常的处理
ProgrammingRing
博客等级 码龄17年 76粉丝 31原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值