没有合适的资源?快使用搜索试试~ 我知道了~
linux x86内存管理之分段与分页
5星 · 超过95%的资源 需积分: 49 32 下载量 128 浏览量
2009-06-22
11:00:33
上传
评论 1
收藏 479KB DOC 举报
温馨提示
试读
11页
主要分析了linux启动过程中,对分段与分页的理解,以及虚拟地址到物理地址的转换。
资源推荐
资源详情
资源评论
Linux 内存管理(x86)之分段分页概念
Memory Addresses:
三种地址:
逻辑地址()
程序里面用到的地址几乎都属于这类地址。在 种,一个逻辑地址由两部分组成:
段()和段内偏移()。
线性地址()
位的线性地址,最大寻址范围 。
物理地址( !")
直接输出到存储芯片的地址线上的地址。
下图是 上逻辑地址到物理地址的转换示意图。# 的 $$%$"$
%由两部分组成,其中的 &'% 把逻辑地址转换成线性地址,然后由
% 把线性地址转换成物理地址。
x86 Segmentaon in hardware:
从 开 始 , 有 两 种 地 址 转 换 模 式 :
实 模 式
( real mode ) 和
保 护 模 式
(protectedmode)。 PC 上电复位时,x86 处于实模式下,何时转换到保护模式,转换之
前需要做些什么,这个问题有待进一步学习。
这里先给出一个逻辑地址到线性地址转换的总体框图,下面分别详细描述各个部分:
从图中可以看出, 的逻辑地址由两部分组成:段选择符(&)和段内偏移
()。段选择符是一个 ( 的数,段内偏移的长度是 (。段选择符其实是一
概念:
逻辑地址组成(段选择符和段内偏移)
)*+)*,+
段描述符
个索引值,它表示当前这个逻辑地址属于哪个段描述符,有了段描述符,逻辑地址就可以
转换为线性地址,当然这个转换过程由 完成,而不是由代码来做这个工作。段选择符
的结构如下图所示:
其中,*- 标志位,如果为 ,则表示从 )* 中取段描述符,否则从™)* 中取段描述符;
. 表示访问这个段所需的 / % 特权等级( 把 / % 操作划分为 个等级,所以 ( 就
够了),如果 / % 的特权等级低于当前访问段定义的 / % 特权等级, 会报一个异常;
表示第几个段描述符。
有 个段寄存器来保存段选择符,它们分别是:cs,ss,ds,es,fs以及 gs。
cs:代码段段选择符寄存器。
ss:栈段段选择符寄存器。
ds:数据段段选择符寄存器。
上述的三个是特殊用途的段选择符寄存器,剩下的三个作为一般用途。
所有的段描述符要么保存在 )*(()0*(,全局段描述符表)中,要么
保存在 )*()0*()中。 用两个寄存器 和 来保存 )* 和 )* 的
信息。 的长度为 位,高 位保存 )* 的首地址,低 位保存 )* 的长度,也就是
说,)* 的最大长度是 1,每个段描述符的长度为 个字节,所以 )* 最多可容纳 2
个段描述符。)* 本身并不是一个段,而是线性地址空间中的一个数据结构。)* 存放在
)* 类型的系统段中。此时,)* 必须包含 )* 的段描述符。如果系统有多个 )* 的话,那
么每个 )* 都必须在 )* 中有一个段描述符。
下面看一下段描述符的结构:每个标志位的意义可以参考赵炯老师的 3 内核完全剖
析(第三版),24 页。
逻辑地址转换到线性地址的过程:
首先,检查段选择符的 TI 域,取得 )* 或者 )* 的基地址。
其次,段选择符的 -5)6# 域值乘 ,加上第一步中得到的基地址,得到段描述符的地
址, 把这个段描述符加载到不可编程寄存器(nonprogrammable CPU register),这样
就不用再访问 )* 或者 )* 了。
最后把逻辑地址的段内偏移加上段描述符的基地址得到线性地址。如果线性地址超出
了段描述符的范围, 会产生一个异常。
当然上述过程由 硬件完成。
Segmentaon (on Linux):
的分段机制,可以为每个进程分配一段独立的线性空间。而分页机制可以把同一
个线性地址映射到不同的物理地址。这两个机制都可以把不同进程的物理空间分离开来 。
3 倾向于使用分页机制来实现这个功能。原因有两个:一是,把分段功能设置为,所有
的进程共享整个线性空间(),这样的段设置非常简单;二是,
为了方便把 3 移植到其它没有分段机制或者分段功能非常有限的 / %。
3 中所有的用户空间进程使用相同的用户空间代码段与数据段,所有的内核空间进
程使用相同的内核空间代码段与数据段。
上面的表格中可以看出,用户代码段,用户数据段,内核代码段,内核数据段具有相
同的线性空间(),只是 / % 的特权等级不同。而且这个段设置
的结果就是,逻辑地址等于线性地址。
在单处理器系统中,只有一个 )*,而多处理器系统中,每个 / % 都有一个
)*。3 中所有的 )* 保存在 cpu_gdt_table 数组中。每个 )* 的首地址与长度保存在
cpu_gdt_descr 中。
x86 Paging in hardware:
分页单元的功能是把线性地址转换为物理地址,其中一个重要的特性是检查当前的访
问操作是否有效(与被访问线性地址的权限作比较),如果操作是非法的,则会产生一个
页操作异常。
Regular paging:
使用 17(
)固定大小的页面。每个页面均为 17,对齐于 1 地址边界处。这
表示分页机制把 7 的线性空间划分为 $ 个页面。由于 1 大小的页面作为一个单元进行
映射,并且对齐于 1 边界,因此线性地址的低 位可以作为页内偏移。
的 .30 可以把一个线性地址分为三个部分(这种分法是由 / % 决定的):
页目录(Directory)、页表( table)、页内偏移( oset)。线性地址到物理地址的转换
分两步完成,每步基于一个转换表。第一步转换基于页目录表(Page Directory),第二步
转换基于页表(Page Table)。它们的转化可以用下图来表示:
的 寄存器保存页目录表(Page Directory)的物理地址。
剩余10页未读,继续阅读
资源评论
- yue1648712732013-12-15不错,对于内存管理知识又深入了解了!
- qiujingwen2013-03-11很好,讲得很通俗,
- e栈社区2012-11-21很好,讲得很通俗,之前还对x86的分段分页机制有疑惑,看完了这篇明白了不少
dyzhu
- 粉丝: 3
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于spark-streaming的实时计算系统+源代码+文档说明
- 基于Spark框架的改进并行化综合能源客户识别+源代码+文档说明
- 基于python torndo实现Rest API服务,用于远程提交spark,查询yarn任务状态和日志地址+源代码+文档说明
- 基于spark的日志分析工具+源代码+文档说明
- 基于Spark的机器学习代码+源代码+文档说明
- 基于Spark的图书推荐算法+源代码+文档说明
- 一个基于Spark的电商系统+源代码+文档说明
- 基于Python Spark的大数据分析+源代码+文档说明
- ubuntu18.04安装pycharm2023.3.5
- 基于spark的电影推荐系统+源代码+文档说明
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功