来源:互联网 发布:江西行知教育集团 编辑:程序博客网 时间: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、由于分段机制使用的是逻辑地址,那么寻址时需要将它映射为线性地址:



0 0
原创粉丝点击