分类: LINUX
2012-09-25 19:59:59
虚拟保护机制:
从虚拟地址到物理地址,需要经过分段机制和分页机制两极转化。第一级是使用分段机制,将虚拟地址转化为线性地址,第二级是分页机制,将线性地址转化为物理地址。
第一级是必要的,第二级是可以禁止启动的,但是一旦禁止启动,段机制得到的线性地址,直接作为物理地址。
在80286保护虚拟地址只有分段管理机制:
无论是在实方式还是保护方式下,程序只与逻辑地址打交道,逻辑地址由段基址和偏移量组成。
在存储器中访问一个存储单元的过程:
首先是在段寄存器中,得到一个段基址,然后段基址加上存储单元的偏移量就得到在存储单元的物理地址。在保护方式下逻辑地址被成为虚拟地址,因为这个段可能不存在物理存储器上。
逻辑地址到线性地址的实现过成:
通过段选择符----> 得到该段的段描述符,从而得到段的32位基址。在加上32(16)位的偏移地址就得到了32位的线性地址。
段选择符是一个指向操作系统定义的段信息的指针。
(RPL)最低的两位规定了选择符请求特权的级别。00B 最高的特权,11B 最低特权
TI表示指示器。TI=0 全局描述符表。T1=1局部变量描述符。
段描述符表:
段描述符简称描述符表:在80386/80486CPU 下共有三个描述符表,全局描述符,局部描述符和中断描述符。对于全局描述符来说,系统只有一个全局描述符。
详细解说中断描述符:
存储了中断程序的入口的 段地址和段内的偏移地址。
中断描述表里面包含了中断描述符,陷阱门描述符和任务门描述符。中断门和陷阱门间接的提供了中断程序的入口段基地址。既由陷阱门或者中断门描述符索引出来一个段描述符。该段提供了中断程序的入口基地址。
在局部描述符表寄存器中,包含了一个选择器和不可见的高速缓存器。
线性地址到物理地址的转换:
分页机制将32位线性地址分为三个域,目录索引域(10位),表索引域(10位)和偏移量(12位)。
线性地址高10位*4(12位) 就是在页目录项的偏移量。页目录项的起始基址由控制寄存器CR3的高20位加上12位的0组成。所以项的地址实际上就是基地址的高20位和12位偏移地址所组成。页表项的基地址就是在页目录项中的一个项的内容高20位加上12位0构成。偏移量=表索引地址(10)位*4 (12位)得到。在页表项中的32位地址由页表基地址高20位和12位偏移量构成。页表中的一个项的内容的高20位加上12位全是0,所得到就是页帧的基地址和12位偏移量组成。
说的似乎不清楚,给大家举例来说明:
假设某存储单元的线性地址为25674890H,CR3= 28345XXXH,求该存储单元单元的物理地址。
首先先将线性地址分成三个域:
0010010101 1001110100 100010010000
目录索引域(10位) 表索引域 (10位) 偏移量(12位)
因为CR3= 28345XXXH ,所一目录索引域的基地址为28345000H,线性目录中所以的地址为0010010101B,故:
页目录表中所索引的物理地址= 目录表基地址+ 偏移量(目录地址*4)
= 28345XXXH + 254H = 28345254H
如果设目录中寻址项的内容为00200021H ,这表明所寻址项的对应的页表项中的基地址为00200000H。线性地址中页表索引地址为1001110100B,故:
页表中所寻址的物理地址= 页表基地址+ 页表索引地址*4
= 00200000H+9D0H= 002009D0H
如果页表中所寻址的内容为34567021H,则页帧基地址为= 34567000H
最终要寻址寻找的单位的物理地址为=页帧地址+线性地址中的12位偏移量= 34567000H+890H = 34567890H。