Linux保护模式涉及到几个内存管理寄存器:GDTR(全局描述符表寄存器)、LDTR(局部---)、IDTR(中断---)、TR(任务寄存器)。
控制寄存器:CR0含有协处理器的控制位;CR1保留不用;CR2记录页错误线性地址;CR3高20位记录页目录基地址。
CR0中的TS(Task Switched):任务切换标志;
ET(Extension Type):为1时,表明使用80387协处理器;为0时,使用80287协处理器;
PE(Protection Enable):启动保护标志,开启断式保护机制;
PG(Paging):分页标志
NE(Numeric Error):协处理器错误
地址寻址:保护和地址变换
分段机制:逻辑地址——>线性地址
分页机制:线性地址——>物理地址
段选择符是段的唯一标识,其中包含请求特权级(RPL)、表指示标志(TI=0表示GDT,TI=1表示LDT)、索引值(Index);段描述符中保存段的基地址、段限长、段属性等重要信息;
段选择符中的索引在GDT/LDT中定位相应的段描述符,利用段描述符中检查段的访问权限和范围,在段描述符中取得段的基地址,加上偏移地址得到线性地址。
整个虚拟地址空间分为相等两半:一半由LDT映射(局部地址空间),一半由GDT映射(全局地址空间);
GDT是一个数据结构,GDT的基地址和长度必须加载进GDTR寄存器;GDT中的描述符总是8字节,GDT限长为(8n-1),GDT的第一个描述符是空描述符,使用期加载内存时会产生保护性内存;
每个LDT在GDT中都有一个段描述符和段选择符;
段寄存器(CS、SS、DS、ES)结构分为可见部分(段选择符)和不可见部分(段基地址、段限长、段属性);
代码段是一致或不一致的,但数据段必须是非一致的,即不能被低特权级的程序访问。
段描述符分为2大类:系统段描述符(LDT、TSS等)和门描述符(调用、陷阱、中断门,任务门);
调用、陷阱、中断门含有代码段的选择符&段中程序入口点的指针,任务门含有TSS段选择符。
保护机制:4级段级保护 & 2级页级保护;
段级保护:CPL(当前特权级),RPL(请求特权级,与DPL描述符特权级比较),段限长类型,特权级调用门;
页级保护:R/W、U/S(用户/超级用户);
IDT:中段描述符表,也称中断向量表,用来定位中断处理程序入口地址,存放3种描述符(中断门、陷阱门、任务门描述符)。
中断源:外部(硬件)中断,软件中断;
异常源:程序错误异常、软件异常
异常分为故障(程序跳过异常运行)、陷阱(程序重新运行异常)和中止(程序中止)。
中断门和陷阱门的唯一区别:CPU操作标志寄存器IF的方法,通过陷阱门不会影响IF标志。
任务由两部分组成:任务执行空间和TSS(任务状态段);
TSS中包含动态字段(DS、ES等段寄存器,AX、BX等通用寄存器,FLAG标志寄存器,IP,先前任务链接字段)和静态字段(CR3页目录基地址寄存器,IO位图基地址,LDT,栈指针,调试陷阱T标志)。
TSS存放在GDT中。