内存的三种地址,及其转换

三种内存地址:逻辑地址,线性地址,和物理地址

 

逻辑地址:

  包含在机器语言指令中用来指定一个操作数或一条指令的地址。这种寻址方式在80X86著名的分段结构中表现得尤为具体,它促使MS-DOS或Windows程序员把程序分成若干段。每一个逻辑地址都是有一个段和偏移量组成,偏移量指明了从段开始的地方到时间地址之间的距离

线性地址:(虚拟地址)

  是一个32位无符号整数,可以用来表示高达4GB的地址,也就是高达4294967296个内存单元。线性地址通常用十六进制数字表示

物理地址:

  用于内存芯片级内存单元寻址。它们与从微处理器的地址引脚发送到内存总线上的电信号相对应。物理地址由32位或36位无符号整数表示

 

内存控制单元(MMU)通过一种称为分段单元的硬件电路把一个逻辑地址转换成线性地址

分段单元

  1,先检查段选择符的TI字段,已决定段描述符保存在哪一个描述符表中。TI字段指明描述符是在GDT中(在这种情况下,分段单元从gdtr寄存器中得到GDT的线性基地址)还是在激活的LDT中(在这种情况下,分段单元从ldtr寄存器中得到LDT的线性基地址)

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

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

 

第二个称为分页单元的硬件电路把线性地址转化成一个物理地址

 

        分段单元            分页单元

  逻辑地址=============》 线性地址 ============》 物理地址

 

 实际上,分段和分页在某种程度上有点多余,因为它们都可以划分进程的物理地址空间:

  分段可以给每一个进程分配不同的线性地址空间,而分页可以把同一线性地址空间映射到不同的物理空间,与分段相比,Linux更喜欢使用分页方式

因为

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

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

 

在多处理系统中,所有与CPU都共享同一内存;这意味着RAM芯片可以由独立的CPU并发访问。

因为在RAM芯片上的读或写操作必须串行的执行。因此一种所谓内存仲裁器的硬件电路插在总线和每个RAM芯片之间

作用是如果某个RAM芯片空闲,就准予一个CPU访问,如果该芯片忙于为另一个处理器提出的请求服务,就延迟这个CPU的访问。

即使在单处理器上也使用内存仲裁器,因为单处理器系统中包含有一个叫做DMA控制器的特殊处理器,而DMA控制器与CPU并发操作

 

在多处理器系统的情况下,因为仲裁器有多个输入端口,所以其结构更加复杂。

例如:双Pentium在每个芯片的入口维持一个两端口仲裁器,并在试图使用公用总线前请求两个CPU交换同步信息。

 

仲裁器由硬件电路管理,是隐藏的

有一种落差是,你配不上自己的野心,也辜负了所受的苦难
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值