6_30天自制操作系统第6天心得体会

回顾第五天的GDT和IDT,之前不是很懂这个GDT,IDT,在这一章节的学习后,对第5天的知识进行一个补充。

GDT:全局段号记录表

分段:将4G的内存分成一块一块的,每一块的起始地址都可以当做0来处理。像这样分出来的块,就叫做段。

表示一个段所需要的信息:段的大小,段的起始地址,段的管理属性(禁止写入,禁止执行,系统专用等)

CPU用8个字节来表示这些信息。

我们可以分成8192个段,段号是0-8191.因为段寄存器是16位的,所以能处理0-65535范围的数,但是由于CPU设计的原因,段寄存器的低三位不能使用。

表示8192个段,共需要8192*8Byte = 64kb。这64KB的数据就是GDT。

GDT是全局段号记录表。将这些数据整齐地排列在内存的某个地方,然后将内存的起始地址和有效设定个数放在CPU内被称作GDTR的特殊寄存器里面。

IDT是中断记录表

IDT记录了0-255的中断号码与调用函数的对应关系。

(注意,必须先设定GDT,然后再设定IDT)

分割编译与中断处理

1.分割源文件

分割多个源文件的好处是调理更清晰,但是有时候会添加多余的函数声明。

2. 整理Makefile

相同的编译规则就制定一个一般规则,譬如说:

以下三个编译规则,除了文件名不一样,其余一样,风格简直一样。

所以,我们可以简化成:

注意make.exe的编译规则,一般make.exe先找普通规则,然后是一般规则。普通规则优先级更高。

3.整理头文件

使用头文件,这个大家C语言都学过,把变量和函数的声明 都放在一个头文件里面。

只需要主要头文件的两个写法,一个是<>,一个是"",<>表示的头文件在编译器所提供的文件夹下,“”表示头文件与源文件在同一个目录下。

4.意犹未尽

1 _load_gdtr:
2         MOV AX,[ESP+4];
3         MOV [ESP+6],AX;
4         LGDT [ESP+6]
5 RET

代码的含义:

 

注意gdtr寄存器是一个48的特殊寄存器,低16位用来保存段上线,高32位保存段的起始地址。

为了表示4G内存,我们使用了分页,1P=4KB,通过Gbit位来表示,为1表示段上限的单位是页,为0表示为Byte。

AR寄存器我们认为是16位,高4位放在limit_high的高4位处,低8位含义如下:

5.初始化PIC

对于CPU来说,PIC是外部设备,所以CPU使用OUT指令进行操作PIC中的寄存器。

下面简单介绍PIC中的寄存器:

IMR:中断屏蔽寄存器,为1时屏蔽中断。

ICW:初始化控制数据,每一个PIC有4个ICW寄存器。

ICW1,ICW4与PIC的主板配线方式,中断信号的电气特性有关;

ICW3:设定主从PIC的连接;

ICW2:设定终段号。

6.中断处理程序的制作

将键盘挂在主pic的1号中断,中断即为21号,将鼠标挂在从PIC的12号中断,中断号为2c。

调用中断程序的汇编代码:

中断服务程序:

补充几条汇编指令:

PUSH,POP,PUSHAD;

 

 

 

原文地址:https://www.cnblogs.com/OathKeeper/p/7755768.html