从硬件了解寻址

学习Linux内核,内存管理是必学的,但是和自己以前设计译码电路的寻址完全不同,所以对抽象后地址映射不能很好地理解,虽然很多书都有介绍,但是领悟的还是有缺陷。所以这次以Intel微处理器为例子,去了解硬件是怎么寻址的,然后在转到Linux系统怎么抽象的。

80x86常见的工作模式有,实模式和保护模式。

先来看实模式,它的操作空间<=1MB。

所以这个时候段寄存器里面存放的是16位的段地址。然后段地址会和偏移地址运算后(段地址X10H+偏移地址)来读取对应的存储单元。段寄存器内的段地址是任何一个大小为64KB(2^16B=64KB)的存储器段的起始地址,偏移地址用来精确的读取该存储器段内的任一单元。

这里有一个存储器区域叫做高端存储器,大小为64KB,因为地址范围(0FFFF0H~10FFEFH)在1MB的最顶端,所以叫做高端存储器。

自己的思维是,如果一段内存区域已经被分配,那么它就已经固定了,不会再变动,一直到它被释放。

但实际上,段地址和偏移地址允许重定位,这样的好处是,在实模式下运行的程序可以在保护模式下运行。可重定位程序是一个可以放入存储器的任何区域,且不需要修改而仍能执行的程序。可重定位数据是可以放在存储器的任何区域,且不需要修改就可以被程序引用的数据。

另外需要注意的是,存储器段是可以相连或不相连的,也可以是重叠的。

到这儿,应该能看出段不是惯性思维中固定且有序的,它们会根据存储器的实际情况做出改变。

希望你忘了上边的再看下边的,要不然会乱的。

接下来是保护模式下的存储器寻址,它的操作空间在>1MB。

这个时候的段寄存器已经变了,它里面存放的是叫做选择子,以及两个标志(TI、RPL)。另外还有一个专业术语叫描述符表,它其实也就是一块存储区,里面放的是每个存储段的首地址以及他的大小。所以,这个时候,段寄存器会根据TI来选择实在全局描述符表还是局部描述符表查找选择子中对应的值,这个值说白来才是真正存储段所要的段首地址值。

但是保护模式下通过段最后得到的地址并不是实际的物理地址,因为它是根据程序产生的地址,叫做线性地址。

这东西吧,又被人分成了3部分,最高10位页目录地址,最低12位偏移量,中间的10位页表地址。所以,这又联系到了页,根据偏移地址(2^12=4KB)知道一个页4KB。

然后页目录回合一个名字叫做CR3的寄存器(这个寄存器的专职工作就是保存一个地址值)进行运算,得出在页目录表中的对应位置,取出,然后在页表进行运算,取出对应于页表中的值,接下来在和偏移量运算,得到最终的物理地址。运算过程是,(M<<2+N)线性地址中的页目录和页表左偏移两位相加对应的存储器中的数,(M+N)偏移量直接加不左移。

到这,硬件上的寻址就结束了,下来要做的就是去看操作系统中的代码是如何抽象这些东西的,呵呵。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值