内存寻址(上)

内存地址

在操作系统中,一般会引用三种地址描述方式:

逻辑地址(logical address

每一个逻辑地址由一个段地址和偏移地址组成。在有地址变换功能的计算机中,访问指令给出的地址 (操作数) 叫逻辑地址,也叫相对地址。

线性地址(linear address

由一块连续的虚拟内存空间组成。在80x86微处理器中是一个32位无符号整数,可以用来表示4GB的地址,也就是4294967个内存单元。

物理地址(physical address

是计算机内的实际地址,它们与从微处理器的地址引脚发送到内存总线上的电信号对应。在80x86微处理器中由32位或36位无符号整数表示。

内存寻址流程:

地址间转换关系

分段机制

硬件中的分段机制

从80286模型开始,Intel微处理器以两种不同的方式执行地址转换,这两种方式分别为实模式(real mode)和保护模式(protested mode)。

实模式被特殊定义为20位地址内存可访问空间上,这就意味着它的容量是2的20次幂(1M)的可访问内存空间(物理内存和BIOS-ROM),软件可通过这些地址直接访问BIOS程序和外围硬件。

实模式下寻址方式

保护模式又被称作为虚拟地址,它本身本身是80286及以后兼容处理器序列之后产成的一种操作模式,它具有许多特性设计为提高系统的多道任务和系统的稳定性。例如内存的保护,分页机制和硬件虚拟存储的支持。现代多数的x86处理器操作系统都运行在保护模式下,包括Linux, Free BSD。

保护模式下寻址方式

段选择符和段寄存器:

一个逻辑地址由两部分组成:一个段标识符和一个指定端内相对地址的偏移量。段标识符是一个16位长的字段,称作段选择符,而偏移量是一个32位字长的字段。为了方便地找到段选择符,处理器提供段寄存器,段寄存器的唯一目的是存放段选择符。

段选择符

段描述符:

每个段由一个8字节的段描述符表示,他描述了段的特征。段描述符放在全局描述符表(Gloabal Descriptor Table,GDT),或LDT(Local Descriptor Table,LDT)中。

段描述符

快速访问描述符:

为了加速逻辑地址到线性地址额转换,80x86处理器提供了一种附加的非编程的寄存器,供6个可编程的段寄存器使用。每当一个段选择符被装入段寄存器时,相应的段描述符就由内存装入到对应的非编程CPU寄存器。从那时起,针对那个段的逻辑地址转换就可以不访问主存中的GDT或LDT,处理器只需直接引用存放段描述符的CPU寄存器。

段选择符和段描述符

分段单元

分段单元执行以下操作
先检查段选择符的TI字段,以决定段描述符保存在哪一个描述符表中。TI字段指明描述符是在GDT中还是在LDT中。

从段选择符的index字段计算段描述符的地址,index字段的值乘以8,这个结果与gdtr或ldtr寄存器中的内容相加。

把逻辑地址的偏移量与段描述符Base字段的值相加就得到了线性地址。

这里写图片描述

Linux中的分段

Linux以非常有限的方式使用分段,与分段相比,Linux更喜欢使用分页方式,因为:

当所有进程使用相同的段寄存器值时,内存管理变得更简单,也就是说它们能共享同样的一组线性地址

Linux设计目标之一是可以把它移植到绝大多数流行的处理器平台上。然而,RISC体系结构对分段的支持十分有限。

Linux 2.6只有在80x86结构下才需要使用 分段。
运行在用户态和运行在内核态的进程使用不同的段描述符,于是在Linux下就有了4个重要的段描述符字段:
用户代码段
用户数据段
内核代码段
内核数据段
相应的段选择符由宏__USER_CS,__USER_DS,__KERNEL_CS,__KERNEL_DS分别定义。

Linux GDT

在单处理器系统中只有一个GDT,在多处理器系统中系统每个CPU对应一个GDT。所有的GDT都存放在cpu_gdt_table数组中,所有GDT的地址和它们的大小被存放在cpu_gdt_dsescr数组中。
每个GDT包含18个段描述符和14个空的,未使用的或保留的项。

每个GDT中包含的18个段描述符指向下列段

用户和内核态下的代码段和数据段共4个。

任务状态段(TSS),每个处理器有1个。

1个包括缺省局部描述符表的段,这个段通常是被所有进程共享的段

3个局部线程储存(Thread-Local Storage,TLS)段,这种机制允许多线程应用程序使用最多3个局部与线程的数据段。

与高级电源管理(AMP)相关的3个段。

与支持即插即用(PnP)功能BIOS服务程序相关的5个段。

被内核用来处理“双重错误”异常的特殊TSS段。

这里写图片描述

Linux LDT

大多数用户态下的Linux程序不使用局部描述符表,这样内核就定义了一个缺省的LDT供大多数进程共享。缺省的局部描述符表存放在default_ldt数组中。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内存工作原理 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、付费专栏及课程。

余额充值