30天自制操作系统 第6天日志

一、实验主要内容

1、 内容1:分割源文件

由于源程序太长了,所以对其进行分割。
优点:按照处理内容进行分类,将来进行修改容易找到地方。如果Makefile写得好,只需要编译修改过的文件,提高make的速度。多个小文件好处理。
缺点:源文件数量增加,分类分的不好的话,修改时不容易找到地方。
在这里插入图片描述
对应源文件的分割,还需要对Makefile进行修改。
在这里插入图片描述

2、 内容2:整理Makefile

由于Makefile文件太长了,对其进行处理
我们发现每次增加新的源文件都要增加雷同的编译规则,所以将它们使用一般规则。
make.exe会首先寻找普通的生成规则,如果没有的话,就是用一般规则。
Makefile减少了21行。

3、 内容3:整理头文件

头文件代码很长,主要原因是各个源文件都要重复声明”void io_out8(int port, int data);”
我们将重复的部分全部去掉,归纳在bootpack.h的文件中。
该文件包含函数的定义以及函数定义在那个文件,像目录一样,对修改很方便。
在编译graphic.c的时候,我们要读取头文件,只需要在graphic.c中加上一行:
在这里插入图片描述
bootpack.h间接地写到了graphic.c中
文件名的双引号表示该头文件与源文件在同一个文件夹里,而尖括号表示该头文件位于编译器所提供的文件夹里。
整体缩短了34行!
在这里插入图片描述

4、 内容4

_load_gdr这个函数用来将指定的段上限和地址给GDTR的48位寄存器。
这个寄存器不能用MOV指令来赋值,唯一方法是指定一个内存地址,从指定地址读取6个字节(48位),然后再赋值给GDTR寄存器。这条任务指令为LGDT。
该寄存器的低16位是段上限,等于“GDT的有效字节数-1”,高32位,代表GDT的开始地址。
DWORD[ESP+4]中存放的是段上限,DWORD[ESP+8]里存放的是地址,其中段上限和地址分别为0x0000ffff和0x00270000。若是按字节写出来就成了FF FF 00 00 00 27 00 00。
在这里插入图片描述
为了执行LGDT,作者希望把它们排列成[FF FF 00 27 00 00]的样子。所以就先”MOV AX, [ESP+4]”读取最初的0xffff,然后再写到[ESP+6]里。结果就成了[FF FF FF FF 00 27 00 00],如果从[ESP+6]开启读6个字节的话正好是想要的结果,即如下图:
在这里插入图片描述
naskfunc.nas的_load_idtr对IDTR的设置与GDTR类似。
在这里插入图片描述
这个函数是按照CPU的规格要求,将段的信息归结成8个字节写入内存。
首先是段的地址。地址用32位表示,称为段的基址(base)。在这里分为low(2字节),mid(1字节)和high(1字节)3段,合起来32位。是为了与80286时代的程序兼容才分为三段。

段上限最大4GB,但只能使用20位,指定到1MB为止。为了扩大指定段的大小,段属性里设置了一个标志位Gbit。当这个标志位位1时,limit的单位不解释成字节(BYTE),而解释成页(page,有4KB)。这样4KBx1M=4GB。20位的段上限分别写到limit_low和limit_high里。

段属性,又称为“段的访问控制权属性”,在程序中用变量名access_right或ar来表示。因为12位段属性中的高4位放在limit_high的高4位里,所以程序里有意把ar当做如下的16位构成来处理:
xxxx0000xxxxxxxx(其中x是0或1)

ar的高四位被称为“扩展访问权”
在这里插入图片描述
ar的低8位:
在这里插入图片描述
CPU到底是处于系统模式还是应用模式取决于执行中的应用程序是位于访问权位0x9a的段还是位于访问权位0xfa的段。

5、 内容5:初始化PIC

要使用鼠标必须使用中断,将GDT和IDT正确无误地初始化。同时还要初始化PIC(programmable interrupt controller),“可编程中断控制器”。PIC是将8个中断信号集合成一个中断信号的装置。与CPU直接相连的PIC称为主PIC(master PIC),与主PIC相连的PIC称为从PIC(slave PIC)。主PIC负责处理第0到第7号中断信号,从PIC负责8到15.
在这里插入图片描述
PIC的初始化:
在这里插入图片描述
从CPU角度来看,PIC是外部设备,CPU使用OUT指令进行操作。程序中的PIC0和PIC1,分别指主PIC和从PIC。
PIC的寄存器都是8位寄存器,IMR是“interrupt mask register”的缩写,意思是“中断屏蔽寄存器”。8位分别对应8路IRQ信号。

ICW是“initial control word”的缩写,意为“初始化控制数据”。注:只有在电脑CPU里,word这个词才是16位的意思,在别的设备上有时指8位有时也指32位。ICW有4个,分别编号为1~4,共有4个字节的数据。ICW1和ICW4与IPC主板配线方式、中断信号的电气特性有关。ICW3是有关主-从连接的设定,对主PIC而言,第几号IRQ与从PIC相连,使用8位来设定的。如果把这些位全部设为1,那么主PIC就能驱动8个从PIC。因此不同的操作系统可以进行独特设定的就只有ICW2了、这个ICW2,决定了IRQ以哪一号中断通知CPU。

6、 内容6:中断处理程序的制作

鼠标是IRQ12,键盘是IRQ1,所以我们编写用了INT 0x2c和INT 0x21的中断处理程序,即中断发生时所要调用的程序。
在这里插入图片描述
Inthandle12接收了esp指针的值,但函数中没有使用。中断处理完成后不能执行“return”但必须执行IRSTD指令,这个指令还是得用nas写。
在这里插入图片描述
接下来解释了栈(stack)的概念,栈属于缓冲区。
缓冲区有两种:一种是将信息从上面逐渐加入进来,需要时再从下面一个个取出。
在这里插入图片描述
最先加入的信息也最先取出,所以这种缓冲区是“先进先出”,简称FIFO。
还有一种缓冲区是信息从上加入,也从最上面开始取。所以这种缓冲区是“先进后出”,简称FILO
在这里插入图片描述
栈正是FILO型的缓冲区,PUSH将数据压入栈顶,POP将数据从栈顶取出。
PUSH EAX这个指令相当于:
在这里插入图片描述
PUSHAD相当于:
在这里插入图片描述
函数_asm_inthandler21的目的是保存中断现场的值,然后将该函数注册到IDT中去。
在这里插入图片描述
asm_inthandler注册在idt的第0x21号,28表示的是asm_inthandler的属于哪一个段,即段号是2,乘以8是因为低3位有着别的意思,所以低三位必须是0。所以“28”也可以写成“2<<3”或者16。

号码为2的段:set_segmdesc(gdt + 2, LIMIT_BOTPAK, ADR_BOTPAK, AR_CODE32_ER);

这个语句说明这个段正好涵盖了整个bootpack.hrb。最后的AR_INTGATE32将IDT的属性设定为0x008e,表示这是用于中断处理的有效设定。

io_sit():是执行STI指令,是CLI的逆指令。执行SIT指令后,IF(中断许可标志位)变为1,CPU接受来自外部设备的中断。
HariMain的最后修改了PIC的IMR,以便接受来自键盘和鼠标的中断。只要按下某个键或者动一动鼠标,中断信号就会传到CPU,CPU处理中断程序,输出信息。
make run 输入“A”
在这里插入图片描述
鼠标的中断还未实现,按下Crt+Alt退出,关闭qemu

二、遇到的问题及解决方法

1、 描述问题1

解析书中P113的代码
在这里插入图片描述
最后存放的地址顺序如下图所示
在这里插入图片描述
在这里插入图片描述
这行代码是将limit高4位和ar高4位加起来

2、 描述问题2

PIC中断信号一共多少号?
虽然主PIC负责处理到0-7号中断信号,从PIC负责处理第8到第15号中断信号。但是从PIC连在主PIC的2号中断信号,所以一共有15个中断信号。
在这里插入图片描述
3、保护模式下的寻址,分段情况和分段分页情况以及段选择子选择GDT与LDT关系
在这里插入图片描述
在这里插入图片描述

三、程序设计创新点

1、描述创新点1

修改中断处理器的信息
在这里插入图片描述
在这里插入图片描述
https://download.csdn.net/download/weixin_43979304/15320819?spm=1001.2014.3001.5503

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SIR怀特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值