保护模式编程学习心得

这篇心得是大2写的。在整理硬盘的时候突然发现。虽然已经过时了,但是还有点小意义,现保存到我的BLOG上。

 

控制寄存器cr0控制是在保护模式还是在模式还是虚拟86下工作。

CR2用于发生页异常时报告出错信息。当发生页异常时,处理器把引起页异常的线性地址保存在CR2中。操作系统中的页异常处理程序可以检查CR2的内容,从而查出线性地址空间中的哪一页引起本次异常。

CR3用于保存页目录表的其始物理地址。

 

虚拟地址空间-(段转换)->线性地址空间-(页转换)->物理地址空间

虚拟地址空间是对一个程序员来说,程序访问的空间,一般有4G。

线性地址空间是一个操作系统级的概念,它由操作系统建立,也是4G。

物理地址空间是机器实际内存大小。操作系统通过页转换把线性地址空间转化为物理地址空间。当然,还要通过硬盘来模拟。

 

段描述符有64位。其中有32位基地址,代表这个段在线性地址中的偏移。16位的段界限。

段描述符在一起构成描述符表。每个表最多有4k(8192)个描述符

有GDT全局描述符表,LDT局部描述符表。

全局描述符表放的是系统代码的段描述符。因为它们在进程的虚拟地址空间中有同样的偏移,比如kernel32.dll在每个进程的地址空间中有同样的偏移。GDT 不能有GDT本身之内的描述符进行描述定义。必须由GDTR访问

局部描述符表放的是每个进程的段描述符。因此,每个进程都有一个局部描述符表。

 

放问描述符表必须用段择子。它是16位的数据结构。其中有13位的编号,还有1位的标志,2位的特权。

13位刚好说明要访问的描述符在表中的索引(4k即8192)。标志说明是在GDT还是LDT中找。

 

全局描述符表寄存器GDTR长48位,其中高32位为基地址,低16位为界限。

局部描述符表寄存器LDTR规定当前任务使用的局部描述符表LDT。LDTR类似于段寄存器,实际上,每个任务的局部描述符表LDT作为系统的一个特殊段,由一个描述符描述。而用于描述符LDT的描述符存放在GDT中。在初始化或任务切换过程中,把描述符对应任务LDT的描述符的选择子装入LDTR。而LDT表本身的描述符在GDT中,所以LDTR访问的是GDT。

 

中断描述符表寄存器IDTR指向中断描述符表IDT。

 

编程注意。若用JUMP16宏访问LDT要在选择子中加TIL宏

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值