Chinaunix首页 | 论坛 | 博客
  • 博客访问: 538798
  • 博文数量: 139
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 1840
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-11 22:40
文章分类

全部博文(139)

文章存档

2011年(1)

2009年(3)

2008年(135)

我的朋友

分类:

2008-05-19 21:18:00

学习Linux内核也好,进行嵌入式系统移植也好,免不了要跟内存打交道。要和内存打交道,那就免不了和内存单元的“门牌号”地址打交道。以前没有系统地整理过,看到16页,发现自己对地址的概念并不是非常清晰,所以从网上搜集了一些资料,经过思考,现在整理如下。
 
    每个存储单元在存储器中的位置可以用逻辑地址和物理地址来表示。
    (1)逻辑地址(Logical Address)是由段基址和段内偏移地址两部分组成。以8051单片机为例,段基址和段内偏移地址都是无符号的16位二进制数。
    (2)物理地址(Physical Address)也叫实际地址或绝对地址,是出现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。
    (3)线性地址(Linear Address)是逻辑地址到物理地址变换之间的中间层。程序代码会产生逻辑地址,通过逻辑地址变换就可以生成一个线性地址。如果启用了分页机制,那么线性地址可以再经过变换以产生一个物理地址。如果没有启用分页机制,那么线性地址直接就是物理地址。
 
    由此看出,逻辑地址不等于物理地址。所谓的物理地址,就是实实在在的通过CPU外部地址总线的地址信号。不管采取什么地址映射机制,最终要得到的就是物理地址。
 
    下面给出两份资料,对理解有很大帮助。
 
材料一:8086/8088CPU为什么要采用段结构?
 
    我们研究科学、要知其然,更要知其所以然。要多问几个为什么;看问题的方法要“扒皮抽筋,入骨三分”的。这里我们就要问一问,8086/8088CPU为什么采用段结构,其原理是什么?
 
    追根求源,Intel的8位机8080CPU,数据总线DB为8位,地址总线为16位。那么这个16位地址信息也是要通过8位数据总线来传送,也是要在数据通道中的暂存器,以及在CPU中的寄存器和内存中存放的,但由于AB正好是DB的整数倍,故不会产生矛盾!
 
    但当上升到16位机后,Intel8086/8088CPU的设计由于当年IC集成技术和外封装及引脚技术的限制,不能超过40个引脚。但又感觉到8位机原来的地址寻址能力2^16=64KB太少了,但直接增加到16的整数倍即令AB=32位又是达不到的。故而只能把AB暂时增加4条成为20条。则2^20=1MB的寻址能力已经增加了16倍。但此举却造成了AB的20位和DB的16位之间的矛盾,20位地址信息既无法在DB上传送,又无法在16位的CPU寄存器和内存单元中存放。于是应运而生就产生了CPU段结构的原理。
 
    首先我们要把教学的“有效数字”的概念应用到20位二进制物理地址中,有效数字位的数字可为1,也可为0,我们现在要把20位有效数字的物理地址分成两段,可以有多种分法。但要求这两段分开后,每段不能大于16位,也不能小于4位。共有13种分法,形成的高位有效数字可为nbits(n=4,5,6,...,16),低位有效数字等于(20-n)bits。高位有效数字即为段首址,但要在其低位补上无效数字的零,仍然保持20位。然后右移四位,把低四位无效的零自然丢失,形成逻辑地址的十六位段首址。20位实际地址中,低位有效数字即为段内偏移量,当不足16位时要在其高位补上若干无效的零,形成逻辑地址的十六位段内偏移量。
 
    下面我们来分析一个这个由段首址和段内偏移量两部分构成的逻辑地址的性质:

    性质一:如上所述形成的段首址和段内偏移量均为十六位,可以很方便的在数据总线上传送,及在CPU寄存器和内存单元中存放。
 
    性质二:段首址即该段的内存首地址。段内偏移量则是该段的范围内距离段首址的字节数。
 
    性质三:因为段首址的有效数字和段内偏移量有效数字是互补的,所以段的大小可以说是由段首址的有效数字决定,也可以说是由段内偏移量有效数字的长短决定。即段的取值范围是段内偏移量有效数字的长度从全0,然而末位加一,直至全一。
 
    性质四:段的大小则可以是2^4、2^5、2^6……2^16即16,32,64……64K个字节。共有十三种大小不同的段可供选择。
 
    性质五:当需要对内存寻址时,只须将段首址送入20位地址加法器中,然后左移四位,并且末位补上四个零,而后加上段内偏移量即可送到20位地址总线上。由此才将段首址和段内偏移量决定的逻辑地址变成20位物理地址!
 
    性质六:请注意,这里的“加法”不是一般教材中所讲的“叠加”,段首址的有效数字和段内偏移量的有效数字位是不能重叠的!二者只能是高低有效数字的“衔接”,只有如此才能复原20位物理地址的本来面目。否则,将会改变段首址的取值,超越该段的取值范围,而且也破坏了20位物理地址的本来面目。这才是段结构原理的真谛!
 
材料二:
题目:在分页存储管理中,须将逻辑地址转换成物理地址,在分页地址转换中,地址字长16位,页长4KB,现有一逻辑地址字为2F6AH,则其相应物理地址为______.页表如下:
  页号      块号
  0          5
  1         10
  2         11
 
【解析】
 
    逻辑地址=页号+页内地址
    物理地址=块号+块内地址
    页内地址=块内地址
 
    此题中页长4KB,即2^12,所以页内地址占了16位地址字长的低12位。由此确定所求页内地址为0F6AH,相应的页号为2。通过页表得知,页号2对应块号11,而11=BH。所以相应的物理地址为BF6AH。
 
    可以认为这里的2F6AH为线性地址,再次变换得到物理地址BF6AH。
阅读(1624) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~