《30天自制操作系统》学习笔记——第七天

来源:互联网 发布:如何在知乎添加话题 编辑:程序博客网 时间:2024/05/21 15:35

           

         明天就要回学校了,收拾完东西,再在家里写下最后一篇笔记。

         今天终于迎来鼠标的控制了!

                         

        作者一开始先拿键盘练手,给出了一个键盘的中断处理程序。其中作者重点指出一句:

io_out8(PIC0_OCW2,0x61);

        这句的含义是告诉PIC“IRQ-01已经处理完毕”,这样处理之后可以接收下一次中断,相当于开中断。

        我们在《汇编语言》中学习到关于中断处理程序时,一般是把所有步骤执行完了,再iret,cpu执行其原来的工作。本书一开始的时候也是这样,但是这样有一个缺陷,像是键盘的处理程序需要往显存里进行多次的读写操作,非常消耗时间,于是这里进行了中断处理程序的缩减。在中断处理程序中,只是把按键的编码保存下来,并置标志flag,然后显示的工作交给HariMain来处理。在主函数中,使用for(;;)对缓冲区的flag进行不断地查询,只要是发现缓冲区中有编码,就显示,没有则开中断,进入hlt状态。其实一开始我对这个程序有一点误解,感觉怎么中断方式还倒退回程序查询方式了?其实不然,只有发生中断,cpu才会从hlt状态中出来,才会再执行for(;;)循环,才会下一次查询,这样巧妙地利用了hlt指令对中断的响应,使cpu能耗降低。

       接下来作者开始引入FIFO缓冲区。从这里开始,到后面的内存分配那一章,看了之后,我终于大致了解了《数据结构》这本书的用处了。不过讲FIFO的大篇幅基本无难点,作者就是把键盘接受的数据送去的位置,从一个字节变成了一个循环队列。

       鼠标的控制电路包含在键盘的控制电路里面,因此如果键盘的控制电路初始化正常完成,鼠标的电路控制器的激活也就完成了。在初始化键盘控制电路的函数中,有这么一个函数:wait_KBC_sendready。它用for循环循环查询,直到接收到控制电路发来的做好准备的信号。这里是属于程序查询方式,属于纯串行(嘿嘿,计算机组成原理是不是学的还行?)。设置的原因就是因为控制电路的速度比cpu慢很多。而当其准备完之后发送的就是鼠标模式的模式号码0x47。

       接下来,作者同样为鼠标做了一个循环队列的缓冲区。而鼠标的数据获取方法,和键盘的是完全一样的。而传送的数据到底来自鼠标还是键盘要靠中断号来判断。

       最后来点总结。我发现从第一个引入键盘中断的程序开始,就有这样的感觉,其实程序的主体,在主函数中,是for(;;)以后的内容。因为这是无限循环,没有出去的时候,要是后面还有的话,有也没用意义。所以后面当出现了鼠标的时候,对鼠标的操作和键盘的写在一起,都在for循环体中。这一点在高手看起来应该很简单,但是我实在还是觉得,都往一个for里面挤,接下来的程序肯定会越来越复杂,因为它的逻辑关系变复杂了

       哦了,今天写的有点啰嗦,期待明天的笔记!

0 0