从硬件了解寻址

来源:互联网 发布:国外域名后缀 编辑:程序博客网 时间:2024/06/03 15:16
学习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 0
原创粉丝点击