《自己动手写操作系统》小结

来源:互联网 发布:dnf网络不稳定 编辑:程序博客网 时间:2024/04/29 21:34

一、保护模式
在初始状态下寻址方式为实模式,CS:IP = CS*10+IP的方式确定物理地址。载入gdt后,CS表示 gdt中的偏移量,CS:IP相当于类似gdt[cs].base+IP的形式寻址。

组成:GDT:由多个段描述符(8bytes)组成,每个段描述符包含段的基地址,界限,属性。
段选择子(2bytes):段选择符的相对GDT地址的偏移量。由于每个段描述符大小为2<<3byte,所以最低三位可用于记录TI(1bit)和RPL(2bits);TI位用于区分使用gdt还是ldt;rpl用作检验特权级;
1)加载gdt
2)打开A20地址线,地址92h第1位置1
3)寄存器cr0第0位置1
4)jmp dword 段选择子:偏移地址,长跳转jmp指令将填充CS和IP寄存器

二、分页机制
在只有保护模式段模式寻址的情况下,一个CS、IP描述的逻辑地址经GDT转换成一个线性地址,此时线性地址=物理地址。使用分页机制下,线性地址与物理地址之间多了一层映射关系。

组成:页目录表:由多个PDE(4bytes)组成,每个PDE指向一个页表
页表:由多个PTE(4bytes)组成,每个PTE指向一个物理页
开启方式:
1)将页目录表地址加载到cr3
2)打开cr0的最高位

以32位系统为例。
线性地址的高10位表示页目录表中的偏移量,由此可得出页表的地址。
中间10位表示页表中的偏移量,由此可得出物理页的地址。
低12位表示物理页中的偏移量。
使用4KB页最多可以表示2^10*2^10*4KB=4GB空间

三、特权级变换
特权级从高特权到低特权分为0、1、2、3级,主要表示在GDT和门描述符的DPL,选择子的RPL和CS、SS的CPL上,用于限制对段的访问权限,内核段一般处于0级特权级上。用户程序通常处在3级特权级上,当发生中断时,分别由从低特权级(用户)转移到高特权级(内核)和高特权级转移到低特权级两个变换过程。

中断
中断也有一个与GDT、LDT类似的IDT,记录了中断描述符也就是一种门描述符。中断描述符分为三类:中断门,陷阱门,任务门。
门描述符主要由选择子,偏移地址,DPL等属性组成。选择子和偏移地址描述了目标代码的地址,以及RPL_A。
假设代码段A通过门描述符C调用目标代码B,需要校验CPL_A、DPL_C,RPL_A,DPL_B。
其中RPL_A≤DPL_C,CPL_A≤DPL_C,DPL_A≥DPL_B
首先A对门的调用要符合对代码段调用的规则,也就是A所用的RPL和CPL特权级都必须高于门的特权级。然后校验A的CPL与B的DPL,对于一致代码段,要求CPL==DPL,对于非一致代码段,要求A特权级不高于B的特权级即CPL_A≤DPL_B。
中断分为外部中断和 int引起的中断。int 0-31是已定义的中断,32-255时用户自定义。外部中断由硬件产生,分为NMI引脚非屏蔽中断和INTR引脚可屏蔽中断两种。可屏蔽中断由8259A主、从两片可编程中断控制器通过INTR发送到CPU,其中每片8个IRQ,从片关联到主片的IRQ2位置上。进入了保护模式后,中断向量要重新跟关联到中断描述符上。由于int0~int15已经定义了中断,所以IRQ0~IRQ15要重新关联到int 32以后。
初始化8259A过程:1)往20h(主)或A0h(从)写入ICW1
2)往21h或A1h写入ICW2
3)往21h或A1h写入ICW3
4)往21h或A1h写入ICW4
5) 往21h或A1h写入屏蔽码OCW1

TSS
由于任务或进程会在0到3几个特权级之间切换,不同的特权级使用的堆栈不同,而切换时需要保存当前的堆栈及CPU信息,这些信息将被保存到TSS上,并根据切换的特权级取出相应的堆栈指针。TSS在GDT中占用一个描述符,并且要通过ltr命令加载其选择子。在调用时门堆栈指针会自动切换到TSS相应位置中。
堆栈指针从RING3->RING0切换过程:
1)从用户堆栈切换到TSS,并将寄存器压栈
2)从TSS取出新的SS和ESP
3)执行调用门

多进程
这里的进程是用一个函数代表,也就是一个简单的代码段,算是一个非常简化的例子,主要用来说明切换时的细节。
进程主要是在时钟中断中进行,维护一个进程表记录CPU、堆栈的状态及返回地址等必要信息,一个指向当前进程的进程表指针。cpu调度算法比较简单,通过预先设定的优先级执行,在每次时钟中断时,修改TSS中返回地址的内容,使其下一次时钟中断切换到下一个准备好的进程。

0 0
原创粉丝点击