第二章 内存寻址

本文深入解析计算机内存寻址机制,包括逻辑地址、线性地址和物理地址的概念,以及MMU如何通过分段和分页将它们相互转换。详细介绍了段选择符、段寄存器和段描述符在保护模式下的作用,以及Linux系统中分段和分页的具体实现,最后讲解了硬件分页原理和80386处理器的分页机制。

1.内存地址

  • 1.逻辑地址:段地址(segment)+偏移量(offset)

    MMU通过分段单元(segmentation unit)电路把1转化2

  • 2.线性地址:也叫虚拟地址(virtual address),uint32表示

    MMU通过分页单元(paging unit)电路把2转化为3

  • 3.物理地址:内存芯片级内存单元寻址,uint32 or uint26

2.硬件中的分段

  • 实模式:存在的主要原因是维持处理器与早期模型的兼容,让操作系统自举
  • 保护模式:
2.1 段选择符和段寄存器
  • 逻辑地址:段标识/选择符(segment selector)(16bit)+相对地址偏移量(32bit)
  • 段寄存器:为了方便找到段选择符,只存放段选择符
    • cs:代码段寄存器,其中两位字段指明CPU的特权级(0、3分别表示内核态和用户态)
    • ss:栈段寄存器
    • ds:数据段寄存器,指向包含静态数据或全局数据段
    • es、fs、gs:可以指向任意数据段
2.1.1 段描述符(8bytes)
  • 描述了段的特征,放在GDTLDT
  • 段首字节的线性地址、粒度标志、段长度、系统标志、特权级等信息都包含在这个字段
  • 有几种广泛采用的段描述符类型:
    • 代码段描述符:
    • 数据段描述符:段栈是通过一般的数据段实现的
    • 任务状态段描述符:用于保存处理器寄存器的内容,只出现在GDT
    • 局部描述符表描述符:代表一个包含LDT的段
2.2 快速访问段描述符
  • 处理器提供一种附加的非编程寄存器(包含8字节的段描述符),每当一个段选择符被装入段寄存器时,相应的段描述符就由内存装入到对应的非编程CPU寄存器,这样就没必要访问GDT或LDT了

3. linux中的分段

  • 分段可以给每一个进程分配不同的线性地址空间,分页可以把同一线性地址空间的映射到不同的物理空间
  • 运行在用户态的所有Linux进程都使用一对相同的段来对指令和数据寻址
    • 用户代码段
    • 用户数据段
  • 运行在内核态的所有Linux进程都使用一对相同的段来对指令和数据寻址
    • 内核代码段
    • 内核数据段
  • …(后面的不懂了)

4. 硬件中的分页

  • 分页单元把线性地址转换成物理地址,关键是访问类型与访问权限比较
  • 为了效率起见,线性地址被分成以固定长度为单位的组,称为(page)
  • 页内部连续的线性地址被映射到连续的物理地址中(这样指定一个页的权限就指定了一组线性地址的存取权限)
  • 分页单元把所有RAM分成固定长度的页框(和页长度一致)
    • 页框是主存的一部分,因此也是一个存储区域
    • 页只是一个数据块,可以放在任何页或主存
  • 把线性地址映射到物理地址的数据结构称为页表(page table)
4.1 常规分页

32bit线性地址 = 10bitDirectory + 10bitTabel + 12bitOffset

  • 线性地址转换分两步(每一步都基于转换表)
    • 页目录
    • page table页表(主页这里是小写)
  • 每个活动必须有一个分配给它的页目录(不过不会马上为进程的所有页表都分配RAM,需要时才分配)
  • 80386的处理器分页:
    • 正在使用的页目录的物理地址存放在控制寄存器cr3中
    • 10bitDirectory决定页目录中的目录项
    • 目录项指向适当的页表
    • 10bitTabel决定页表中的表项
    • 表项含有页所在页框的物理地址
    • 12bitOffset决定页框内的相对位置,因为12bit,所以每页4096字节
内存工作原理 1.内存寻址 首先,内存从CPU获得查找某个数据的指令,然后再找出存取资料的位置时(这个动作称为“寻址”),它先定出横坐标(也就是“列地址”)再定出纵坐标(也就是“行地址”),这就好像在地图上画个十字标记一样,非常准确地定出这个地方。对于电脑系统而言,找出这个地方时还必须确定是否位置正确,因此电脑还必须判读该地址的信号,横坐标有横坐标的信号(也就是RAS信号,Row Address Strobe)纵坐标有纵坐标的信号(也就是CAS信号,Column Address Strobe),最后再进行读或写的动作。因此,内存在读写时至少必须有五个步骤:分别是画个十字(内有定地址两个操作以及判读地址两个信号,共四个操作)以及或读或写的操作,才能完成内存的存取操作。 2.内存传输 为了储存资料,或者是从内存内部读取资料,CPU都会为这些读取或写入的资料编上地址(也就是我们所说的十字寻址方式),这个时候,CPU会通过地址总线(Address Bus)将地址送到内存,然后数据总线(Data Bus)就会把对应的正确数据送往微处理器,传回去给CPU使用。 3.存取时间 所谓存取时间,指的是CPU读或写内存内资料的过程时间,也称为总线循环(bus cycle)。以读取为例,从CPU发出指令内存时,便会要求内存取用特定地址的特定资料,内存响应CPU后便会将CPU所需要的资料送给CPU,一直到CPU收到数据为止,便成为一个读取的流程。因此,这整个过程简单地说便是CPU给出读取指令内存回复指令,并丢出资料给CPU的过程。我们常说的6ns(纳秒,秒-9)就是指上述的过程所花费的时间,而ns便是计算运算过程的时间单位。我们平时习惯用存取时间的倒数来表示速度,比如6ns的内存实际频率为1/6ns=166MHz(如果是DDR就标DDR333,DDR2就标DDR2 667)。 4.内存延迟 内存的延迟时间(也就是所谓的潜伏期,从FSB到DRAM)等于下列时间的综合:FSB同主板芯片组之间的延迟时间(±1个时钟周期),芯片组同DRAM之间的延迟时间(±1个时钟周期),RAS到CAS延迟时间:RAS(2-3个时钟周期,用于决定正确的行地址),CAS延迟时间 (2-3时钟周期,用于决定正确的列地址),另外还需要1个时钟周期来传送数据,数据从DRAM输出缓存通过芯片组到CPU的延迟时间(±2个时钟周期)。一般的说明内存延迟涉及四个参数CAS(Column Address Strobe 行地址控制器)延迟,RAS(Row Address Strobe列地址控制器)-to-CAS延迟,RAS Precharge(RAS预冲电压)延迟,Act-to-Precharge(相对于时钟下沿的数据读取时间)延迟。其中CAS延迟比较重要,它反映了内存从接受指令到完成传输结果的过程中的延迟。大家平时见到的数据3—3—3—6中,第一参数就是CAS延迟(CL=3)。当然,延迟越小速度越快。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值