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;