求助关于内存地址的几个问题
我个人理解啊,如果有错还望大牛指正:0,先说为什么会有逻辑地址,既然有物理地址了为什么又整个逻辑地址出来?
1,这要从8086CPU说起,说8086CPU的地址寄存器是16位,而地址总线却是20位,同学会问有什么影响吗?
2,有,当然有影响。如果对此不管不顾的话CPU是无法对每个内存物理地址进行“直接控制”的,只能直接控制2的16次方个地址;
3,这样的话,将来内存越来越大,CPU能控制的却只有2的16次方个地址,试问那我还加那么大内存条干吗?
4,同学又问,那有什么办法解决吗?有! 既然我没法对内存的每个地址‘直接’的控制,(请注意,我讲的是“不能直接控制”,而并非“不能控制”)既然我不能对你每个地址都直接控制,那我退而求其次总行吧,那怎么个退而求其次法呢?
6,不能直接控制,那我间接控制总行吧? 那又怎么个间接控制呢?好办。
7,内存的各个地址们听好了,我现在要给你分组啦, 01和02 你俩是1组的, 03,04你俩是2组的,如此等等……
8,那等我再找02的时候我就不直接去找他了,我就说“1组2号,把你的值报给我” ,"2组2号,把你值也报给我";
9,这样的话我就分别获取了 02和04地址的值;这里,组就是段,组号就是段基址,组内号就是偏移;
10,翻译过来,我调用内存的时候就是 段地址+偏移量 = 逻辑地址,当然CPU调用的时候还是直接读写物理地址,因为需要因此需要转换一下;
11,物理地址 = 逻辑地址 * 10H + 偏移地址(这个CPU会自己转换);
好了,我的问题来了
1,段地址是不是唯一的?
2,假设段地址是唯一的,那么 (段地址 + 偏移量) 这个值应该也是唯一的吧,又为什么说逻辑地址不是唯一的,说多个逻辑地址可能指向同一个物理地址?3,段与段之间是不是相互独立的?
4,为什么程序的基址总是不变的吗?
本帖最后由 福禄娃娃 于 2014-4-5 12:19 编辑
1. 段地址不是唯一的,可手动指定,段不能起始于任意地址,而必须从任一小段的首地址开始。机器规定:从0地址开始,每16个字节, 也就是说 段的大小只能是16的倍数。但是段的大小不能超过64KB(2^16=65536KB)
2. 逻辑地址可由不同的段地址和偏移地址合成(具体参考书,电子书为37页)
3. 段与段之间虽然是独立的,但是8086CPU只有实模式,所有的物理地址都是平坦的,都可以访问到,还是可以破坏别的段的数据,造成系统崩溃,那时的CPU还没有设计出保护模式。
4. 基址不会变的情况指的是保护模式下的寻址,保护模式下的寻址和实模式的寻址不同。保护模式下把内存分页了,而且段寄存器里面存放的是段选择子(相当于一个指针),指向一个表(全局描述符表)
对主程序来说,基址是不变的;因为这里的基址只是逻辑地址,实际的物理内存要经由相应的段描述符里的信息转换才能得到。线性地址还要经过分页机制的转换才是物理地址。分页能把同一个线性地址映射到不同的物理地址,所以谁都可以是400000 当年设计出这么蹩脚的寻址方式是有历史背景的,采用了分段的机制,段地址左偏移4位+偏移地址=物理地址
相当于不得已而为之,这种寻址方式只能寻址1MB地址,实际上只能用到640KB的内存空间
早在1978年,Intel研制了8086处理器,8086处理有16-bit寄存器和16-bit的外部数据总线,但是却能够访问20-bit的地址(包含1MByte的地址空间)。8086通过引入“分段(segmentation)机制”来解决这个问题。在分段机制下,一个16bits的段寄存器包含了一个长度是64KBytes的“段”空间的起始指针。通过1次时可用一个段寄存器,8086处理器可以无需在段间切换就能寻址高达256KBytes。因此,通过段寄存器+16bits的指针就能访问20bits的地址空间,共1Mbytes。
虽然8086/8088处理器采用的地址空间大小与外部总线位宽不一致,但是这显得很“别扭”,并且在1985年80386时被统一,地址空间和外部总线位宽均为32bits。
为了兼容8086,这种分段管理内存的方式一直被保留下来。当然,实模式不仅仅是分段内存管理,而是“程序的运行环境”,所为的运行环境,还包括寄存器的长度。
具体可参考 http://zh.wikipedia.org/wiki/Intel_8086 福禄娃娃 发表于 2014-4-5 12:15 static/image/common/back.gif
当年设计出这么蹩脚的寻址方式是有历史背景的,采用了分段的机制,段地址左偏移4位+偏移地址=物理地址
相当 ...
同一个物理地址可以被划分给多个段吗?
页:
[1]