您的位置:首页 > 其它

写操作系统(七)执着 进入保护模式的准备

2009-02-17 13:02 302 查看
       在写操作系统(六)执着 中写了关于实模式和保护模式的对比学习,下面是对进入保护模式的前提准备。就像我在(五)说的,模式模式是指CPU的工作模式,我们现在要去操控CPU,怎么---寄存器,控制CPU=控制寄存器。虽然有些“乱七八糟,七长八短”,学习起来辛苦,但是都是有一定的内涵的,很奇妙的。

      由于超时原因,我一般都是现在word里写好,然后copy过来的。但是每次格式都有点乱,sorry。

     

1.       GDT(Global Descriptor Table)系统中只有一个,保存所有选择子的索引和对应的段描述符,段描述符中指定了由选择子索引的段基地址,可被每一个任务共享。

2.       LDT(Local Descriptor Table),可选,可有多个,和GDT一样有段描述符,但是应用的级别和范围不一样,GDT通常用于系统级别,LDT通常用于应用程序级别。通常与任务的数量保持对等,当然任务也可以没有LDT,这样可以实现保护任务安全,使任务间互不相干。
3.       IDT系统中只能有一个,可存放256个描述符,分别对应256个中断。因为一个描述符占8个字节,所以IDT的长度可达2K。描述符有任务门,中断门,陷阱门三个门描述符。
4.       *DTR:GDT,LDT,IDT在保护模式下是特殊的段,它包含段机制所使用的重要数据,为了能够更快速的找到这些段,系统采用特殊寄存器保存这种段的基地址的段限,即GDTR,LDTR,IDTR,TR(任务状态寄存器)
5.       GDTR(48b) = 基址(32b) + 界限(16b)。我们知道,GDT里面可包含了所有段描述符,但是它本身的段却不能自己描述自己,所以由GDTR作为伪描述。
另外,由于选择子用了13位来表示索引号,所以最多由8192个描述符,而每个描述符需要8位,所以段的界限是8192*8,16位表示的段长为正好为65536。所以界限由16位表示即可。
6.       通常将LDT在GDT中的选择子保存在LDTR中,这样LDTR从GDT中取出对应的描述符,根据描述符取出基址和界限,就可以对LDTR进行访问。
7.       段选择子,实模式下,段寄存器存放的成为段基址,保护模式下称为段选择子,真正的段基址需要到GDT中按段选择子找到相应的段描述符。
 
8.       门:控制CPU在不同运行级别间的转换
9.       80386有4个32位控制寄存器,名字分别为CR0、CR1、CR2和CR3。
1、CR1是保留在未来处理器中使用的,在80386中没有定义。
2、CR0包含系统的控制标志,用于控制处理器的操作模式和状态。
3、CR2和CR3是用于控制分页机制的。CR2用于发生页面异常时报告出错信息,这是CR2保存的时异常发生时的线性地址;CR3用于保存页表在内存的起始物理地址,由于页表对齐,所以低12位比为0。
4、CR0寄存器的PE位控制,它负责实模式和保护模式之间的切换。当PE=1时,说明处理器运行于保护模式之下,其采用的段机制和前面所述的相应内容对应。
当PE=0,那么处理器就工作在实模式之下。
3、CR0寄存器的PE位控制,用于指定处理器是否启用分页管理机制。当PG=0禁用分页管理机制,此时由分段管理部件产生的线性地址就是物理地址;当PG=1,启用分页机制,此时由分段管理部件产生的线性地址须再经过分页管理机制才能得到真正的物理地址。
4、CR0寄存器的MP,EM,TS,ET用于控制浮点协处理器的操作
   __________________________________________________________________________
  |PG|0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |ET|TS|EM|MP|PE|   CR0
  |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|_ |__|  
  |                               Reserved                                   |   CR1
  |__________________________________________________________________________|
  |                         页故障线性地址                                   |   CR2
  |__________________________________________________________________________|
  |   高20位页表的起始物理地址                          |低12位为0           |   CR3
  |_____________________________________________________|____________________|
10.   进入保护模式的步骤:
1.  创建一个有效的全局描述表
2.  创建一个有效的中断描述表
3.  关中断
4.  用GDTR指向创建的全局描述符
5.  用IDIR指向创建的中断描述符
6.  MSW中的PE位置1
7.  远跳到保护模式
8.  装载DS和SS的选择子
9.  设置保护模式下堆栈段
11.   返回实模式的步骤:
1.       关中断
2.       远跳转16位的代码段
3.       加载SS的选择子到数据/代码段
4.       清除PE位
5.       远跳到实模式
6.       加载DS,ES,FS,GS,SS在实模式下的值
7.       设置IDTR在实模式下的值
8.       开中断
 

 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐