段
来源:互联网 发布:江西行知教育集团 编辑:程序博客网 时间:2024/04/27 23:57
写在前面:
最近在学习《linux操作系统结构分析》,该系列博客记录我的学习的过程。
段
背景
线性地址(LinearAddress)是逻辑地址到物理地址变换之间的中间层,是一个32位无符号整数,可以用来表示高达4GB的地址。程序代码会产生逻辑地址,通过逻辑地址变换就可以生成一个线性地址。如果启用了分页机制,那么线性地址可以再经过变换以产生一个物理地址。
386架构里,cpu可以处于实模式和保护模式。
实模式下,cpu指令访问的地址就是物理地址,形式为:段寄存器:偏移
在保护模式下,cpu可以使用分段机制和分页机制。
分段机制下使用的地址就是逻辑地址,形式为:段选择符+偏移
分页机制下使用的地址就是线性地址,形式为:0xXXXXXXXX
无论是逻辑地址还是线性地址,都要被cpu映射成物理地址。保护模式下必须采用分段机制。在此基础上可采用分页机制。 逻辑地址被转化为线性地址,如果采用分页机制,则该线性地址通过分页机制被映射成物理地址。如果不采用分页机制,则该线性地址就是物理地址。
实模式下的物理地址只能访问1M以下空间,而保护模式下的物理地址可以访问所有32位空间。并且要注意,物理内存空间只是物理地址空间的一个部分而已。 另外还有一个”总线地址“的概念,是从总线设备的角度来说的。 在linux系统里,对cpu来说,物理内存的首地址是从线性地址的0xc0000000开始的。而对总线设备来说,物理内存的首地址可能是从总线地址0x00000000开始,也可能是从另外的总线地址开始,随系统而异。这也是为什么内核里经常有vir_to_phy和vir_to_bus转换的缘故。 关于物理地址,线性地址和虚拟地址的区别,我只能凭我的理解简单说说,可能不准确。物理地址在什么时候都存在,但是在采用分页技术和虚拟内存技术后,你很难确定物理地址在那里,所以建议在实模式下采用物理地址和线性地址形式,这时候物理地址和线性地址其实是一致的。最常用的,比方说,计算机启动后的地址是0xfff0:0000,装载BIOS,然后转移到0x07C0:0000,所以总可以设置一个物理断点0x7C00,开始调试你的bootloader。
是什么?
段是一种基本的内存管理机制,把处理器的线性地址空间划分为小的地址段,是基本的内存保护单位。通常每个段长64KB。段与段之间相互独立。
段式管理是指把一个程序分成若干个段(segment)进行存储,每个段都是一个逻辑实体(logical entity),程序员需要知道并使用它。
注意:
1) 要确定段在哪里,需要知道基址,386保护模式下,段长可变,受保护,所以还需要有保护信息,段长等。固用一个数据结构——段描述符,来描述段。
2) 段可以进一步划分为页,段描述符粒度标志G位能反应是否划分了页。
同类技术?
1、页
因为段的长度不定,在分配内存时, 可能会发生内存中的空闲区域小于要加载的段, 或者空闲区域远远大于要加载的段. 在前一种情况下, 需要另外寻找合适的空闲区域; 在后一种情况下, 分配会成功, 但太过于浪费. 为了解决这个问题, 从80386处理器开始, 引入了分页机制. 分页功能从总体上来说, 是用长度固定的页来代替长度不一定的段, 藉此解决因段长度不同而带来的内存空间管理问题。
逻辑地址使用分页机制到物理地址的转换
分页机制使用两级转换表,
第一级是页目录(Pagedirectory),存储在物理页中,4KB大小,有1024个页目录项(Page directory entry);
第二级是页表(PageTable),存储在物理页中,4KB大学,有1024个页表项(Page Table entry)。每一个页表项对应一个物理页(4KB)。
2、段页式
单个段的存储基于页式存储管理实现。对用户来讲,按段的逻辑关系划分,对操作系统讲,按页划分每一段。
对比同类的优缺点?
分页机制解决了内存碎片问题,便于管理,但不易实现共享,实现动态链接。
分段机制,便于动态申请内存,管理和使用统一化,便于共享,便于连接,但易产生碎片问题
段页式存储管理,结合二者的优点,克服两者的缺点。
组成部分?
这里主要说明段描述符的组成。
段描述符结构:
基地址
….
粒度标志
…..
类型
…..
注:
1、通过类型可以设置段为系统段和用户段
2、操作系统会用到很多段,每个段都有描述符,这些描述符又用另外一个数据结构管理——段描述符表,段描述符表也有很多,可分为全局的(GDT)和局部的(LDT)。
3、由于分段机制使用的是逻辑地址,那么寻址时需要将它映射为线性地址:
- 段
- 段
- BSS段 数据段 代码段 堆栈
- RO段、RW段和ZI段
- RO段、RW段和ZI段
- RO段、RW段和ZI段
- RO段RW段和ZI段
- RO段、RW段和ZI段
- BSS段/DATA段/CODE段
- 代码段、数据段、堆栈段
- BSS段/DATA段/CODE段
- RO段、RW段和ZI段
- BSS段、数据段和代码段
- bss段、data段和text段
- BSS段、数据段和代码段
- BSS段、数据段、代码段
- bss段、data段和text段
- RO段、RW段和ZI段
- 对象和方法
- atitit.D&D drag&drop拖拽文件到界面功能 html5 web 跟个java swing c#.net c++ 的总结
- 修改Mac OS X的hosts文件
- CSS笔记之层叠、颜色和单位
- OC 字符串常用方法
- 段
- Catch That Cow
- 链表(16)----删除链表重复元素
- 办理云南大学【Q33603896】毕业证真实可靠百度★推荐
- 安卓调用webserver
- BBasic-囚徒困境
- java 注解
- 关于sqlserver身份登录失败的解决方法
- 办理云南大学【Q33603896】毕业证真实可靠百度★推荐