30天制作操作系统第6天

30天制作操作系统第六天

这是一个菜鸡为了学习操作系统来练习写的操作系统,参照于书籍《30天自制操作系统》。
相关程序已经放到GitHub中,如果我的能力到位我可能会在这个操作系统的基础上进行添加及优化,作者已经把所有东西都做到极致了,我能做的很少,我只能把自己分析学习的文章总结出来。因为自己能力可能不到位,可能会有些错误希望大家理解,发到这里更多的原因的起到记录作用,如果以后的我回看我写的文章有错误,我会进行修改,同时也希望大家互相学习。
相关项目及源码已经放到GitHub中:https://github.com/Most3R-03/Simple-Operating-System

今天我们继续制作中断程序
在这里插入图片描述
这里是对PIC的初始化程序,对于cpu来说,PIC是外部程序,所以cpu使用OUT指令进行操作。
PIC0与PIC1分别指主PIC与从PIC.PIC内部有很多寄存器,用端口号码来进行区别,以决定写入哪个寄存器。
在这里插入图片描述
我们对PIC进行了设置,以传递中断信号。
最后,我们要通过sti指令,使CPU接受来自外部的中断。
注释:STI指令是CLI指令的逆指令,会使终端许可标志位变为1。
我们首先从外部引入函数
在这里插入图片描述
在这里插入图片描述
当接收到键盘中断时,我们会调用从外部引入的函数inthandler21,但是返回并不能用RET,中断处理完之后必须要执行IRETD函数。
PUSHAD将所有寄存器状态保存在栈上,最后执行完call之后再利用POPAD将所有寄存器恢复。并返回。
在这里插入图片描述
是因为c语言认为他们指的是同一个段,所以通过Mov指令,让他们值相等,让他们进入栈是方便在调用中断函数后恢复他们原来的值。
在这里插入图片描述
AR_INTGATE32是指将IDT的属性设置为0x008e,表示这是用于中断处理的有效设定。
总结一下中断处理,

当键盘触发中断后,IRQ1处传来一个中断信号到PIC0,然后就将唯一的输出管脚信号变成ON,并通知给CPU。如果CPU可以进行中断的话,就会令PIC发送两个字节的数据(0xcd和对应的中断号)给CPU,然后CPU就会根据IDT的设定,执行该中断号所对应的中断函数。

获取按键编码

这里是对于中断函数的处理:据IDT的设定,执行该中断号所对应的中断函数。
在这里插入图片描述
主要注意io_out(PIC_OCW2,0x61)这个函数。
这个函数用告诉CPU已经获取到这个中断了,让cpu继续进行中断获取,如果没有这个函数,cpu执行完中断函数后将不会获取IRQ1的中断。
如果是IRQ3则携程0x63,也就是说将0x60+IRQ号码输出给OCW2就可以
从编号为0X0060的设备输入的8位信息是按键编码,0X0060的设备就是键盘。
对于中断处理,我们将显示字符的内容放在了中断处理的程序中。
对于中断处理,就是打断CPU本来的工作,然后进行中断程序的执行,执行返回之后在进行中断监控,在这期间是不能接受别的中断的。如果中断处理的太慢的话,那么在处理中断会丢失许多中断信号,这会造成鼠标的动作不连贯等效果。

所以我们应该将字符显示与中断处理分开来:

在这里插入图片描述
缺点是如果有未处理的中断在缓冲区中,又来了新的中断将会被忽略。
在这里插入图片描述
接下来由main函数不间断的从ketbuf中读取并置零收到的按键中断。
在这里插入图片描述
在main函数中不断地将中断捕捉并显示出来。
函数首先先执行io_cli()屏蔽中断,为什么要屏蔽中断呢?如果我们在处理缓冲区里的数据时,又有新的中断添加进缓冲区那我们的数据就并不准确。
所哟我们在函数开始时来屏蔽中断,再等到完全将缓冲区里的数据读出来之后在使CPU监听中断,我们程序进行画图显示。
接下来我们来测试一下
在这里插入图片描述
为了解决这种问题,我们准备制作一个队列来储存这个中断信号。
我们将代码改写成这样
在这里插入图片描述
这个stuct的data成员改写成32个字节的数组
在这里插入图片描述
我们设置了32个位置来储存中断变量。
这里是提取中断信息的函数
在这里插入图片描述
读取完数据之后将后一个数据覆盖到前一个数据。

这样做并没有什么不好,但是缺点是如果每次都在禁止中断的时候移动很多个数据,这样当然不行。
所以我们应该来改善这个队列缓冲区。

我们可以申请一个长长的缓冲区来避免位移操作:
例如我们申请一个256字节的缓冲区,写入的数据不停的往后写,如果到达256字节的话就重新从0地址开始写,读数据不停的跟着写入的数据读,这样就可以一圈一圈的读了。

这里就是个简单的数据结构,不再赘述了。
在这里插入图片描述
这是定义了一个缓冲区的结构体:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
作者的编写意图都符合模块化函数。
作者还送了一个函数,用于检测缓冲区中函数的状态。哈哈
在这里插入图片描述
所以我们的中断函数也写的比较简单了
在这里插入图片描述
只用声明一个结构体传入结构体和数据就行。
在读取队列的时候也变得相当简单:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值