《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里面挤,接下来的程序肯定会越来越复杂,因为它的逻辑关系变复杂了。
哦了,今天写的有点啰嗦,期待明天的笔记!
- 《30天自制操作系统》学习笔记——第七天
- 30天自制操作系统-第七天
- 《30天自制操作系统》学习笔记——第一天
- 《30天自制操作系统》学习笔记——第三天
- 《30天自制操作系统》学习笔记——第五天
- 《30天自制操作系统》学习笔记——第八天
- 《30天自制操作系统》学习笔记——第九天
- 《30天自制操作系统》学习笔记——第十四天
- 《30天自制操作系统》学习笔记——第1-3天
- 《30天自制操作系统》学习笔记——第9天 内存管理
- 《30天自制操作系统》学习笔记--第0天
- 《30天自制操作系统》学习笔记--第1天
- 《30天自制操作系统》学习笔记--第2天
- 《30天自制操作系统》学习笔记--第3天
- 《30天自制操作系统》学习笔记--第4天
- 《30天自制操作系统》学习笔记--第5天
- 《30天自制操作系统》学习笔记--第6天
- 《30天自制操作系统》学习笔记--第7天
- glext.h
- 空气净化器、抽油烟机相关知识
- NoSQL一致性
- Oracle database启动过程分析
- The requested URL /OA_HTML/AppsLogin was not found on this serve
- 《30天自制操作系统》学习笔记——第七天
- rtsp
- 学点Unicode又不会死——Unicode的流言终结者和编码大揭秘
- Linux下学习DB2命令的笔记
- Spring.Net 面向切面AOP
- 随机数与枚举
- 对于VC++报错:fatal error C1001: INTERNAL COMPILER ERROR
- tslib1.4移植简单记录
- 电信采集项目的一个小总结