30天自制操作系统第七天学习笔记(u盘软盘双启动版本)

暑假学习小日本的那本书:30天自制操作系统

qq交流群:159336168    ,更多学习中的问题、资料,群里分享

environment:开发环境:ubuntu

代码下载地址:百度云中去下载吧,传到csdn速度太慢了.

百度云:用户名:397916230@qq.com

           密码:397916230

从第一天到第九天的代码和笔记全部在百度云盘中


第七天的学习思考:

从第七天的学习,我感觉有些内容已经有比较高的抽象层次了。而且有些知识是以前从没有接触过的,我想这些内容就是x86与arm,与单片机不同的一些地方。

下面是学习过程中的一些感想,记录下来,对以后的学习、思考可能有些帮助:


1:获取按键编码部分

       在第6天的课程中,我就尝试每进一次中断,就打印出不同的内容。但是发现当时只能进一次中断服务程序。感觉很奇怪,因为在arm/51中,中断只与soc/mcu有关,但对x86,在中断服务程序中需要对pic0 pic1进行通知,cpu通信pic0或是pic1哪一个的中断已经处理,outb(PIC0_OCW2,0X61);这个对io port进行写操作的函数就是为了通知pic0 irq1 已经处理了。这样pic0就会对 键盘下一次产生的irq1传递给cpu,否则pic0是不会响应irq1的。这种反馈机制是快速cpu对慢速keyboard的一应对方法。
对中断的响应的一部分权力 分配给了pic0 pic1两块芯片。
cpu响应中断--->pic0响应中断---》pic1响应中断

如果pic0,pic1中断屏蔽了,cpu也是接收不到中断的。


得到按键值也只是对特定port的读data=inb(port); 所以这个函数非常具有通用性。只要知道我们输入的键值在哪个port,就可以把data读出来。
对于这些特定的port是不需要记忆的,只需要知道它的功能是什么,记忆是没有意义的,在程序中,会用define,使这个port见名知意。
如port 0x0060可以得到key value,那么只需要用如下宏定义,使人类写代码更简单。
#define port_keydata 0x0060
所以我们在中断服务程序中读data就容易了,data=inb(port_keydata);
//当然,如果你去问这个port为什么是0x0060,实际上这个问题的意义不是太大的。
然后在data在中断服务程序中将其显示出来。

不知道的常识:按键在 press and release时都会产生中断,都会进入中断服务程序。所以按下和松手都可以通过程序知道的。


2:加快中断处理部分
       这一部分的思想是一种对中断响应速度进行优化的思想,其实在arm,在51中也都是这样的思想,中断服务程序只记录发生了什么事,得到必要的信息。真正的处理程序是在任务中进行处理的。
基于这种思想,应该尽快离开中断服务程序,所以把第1部分的显示部分拿到while(1)中执行。中断处理程序变小了,中断处理部分自然变快了。
因为是在while(1)中进行显示,所以要显示的内容必须要在中断服务程序中保存起来,又可以在main中进行读取。这就需要一个变量,既可以在中断服务程序中访问,也可以在bootmain函数中访问,所以能满足这个条件的只有全局变量。
全局变量的声明和引用方法如下:
1:在中断服务文件的外面声明:struct KEYFIFO keyfifo;
2:在bootmain函数的外面引用:extern struct KEYFIFO keyfifo;

这样,keyfifo就成功了一个全局变量了。

关于右ctrl按下时产生两次中断,松手时也是产生两次中断。
按下时,第一次中断发送e0 第二次中断发送1d
松手时,第一次中断发送e0,第二次中断发生9d

那为什么按下右ctr,松开右ctr都是显示e0呢?作者讲的感觉有点迷糊,我做了一下实验,应该是由于第二次中断在第一次中断之后马上产生,而此时cpu的中断是cli的,所以第二个中断服务程序是没有响应的,或是被松手中断的数据给覆盖了。


3:制作fifo缓冲区 部分
       所以这时就需要fifo,来保存两个字节的内容,fifo的作用就是这样出现的。
只是用了一个最简单的fifo就使右ctrl可以正常的工作了。fifo的出现意味着c语言中数据结构的出现,fifo是一种first in,first out的数据,它的特点就是先进先出,对这个数据进行操作的函数就是读出数据,写入新数据。数据结构+方法,这是一种抽象,一种面向对象的抽象。

4:对fifo的改善来源于,用for来移位的操作比较费时,而移位的过程中cpu的中断是关闭的,在任务情况下关cpu中断的时间都应该尽可能短,所以作者用了一个更好的双端fifo,用length记录可用的fifo空间,data[32]为buffer,next_r,next_w记录读写的位置。这种数据结构的改善避免了使用for来对data[32]进行移位的费时操作。
可见,数据结构的复杂性,可能降低算法的复杂性,用空间换时间的想法。

5:整理了fifo之后,使fifo更具用通用性了
        一个fifo的数据结构(struct),一个buffer[length],三个对fifo进行操作的函数,init_fifo(),fifo_read(),fifo_write(),仅仅这三个函数就把buffer[length]这个数组变成了一个先进先出的数据类型。从这一部分,更加体现了(oop)面向对象的思想。fifo的数据结构(struct)是对象的属性,上面的三个函数是对像的方法。
      作者这样,一步一步的从最简单的编程出发,然后提出问题,把数据从最简单的类型,一步一步的抽象成了数据结构的方法。对于学习c语言的人来说是非常有意义的。其它的书中很少有见到这种介绍一个简单的东西为什么一步一步的变的复杂了。那是因为有某些需要,作者写出了这样的需要。我觉得如果c语言基础不是很好的人,在这个一步一步抽象的过程中会很容易迷失的,因为抽象的过程不能太过于注意细节。要从更高的层次思考问题。
读到这一部分进,我也意识到,如果你是真的要学习软件,学习编程,就应该学学这本书,因为这本书从硬件,汇编,c语言,低级层面编程如何抽象到面向对象的高级层面编程都有涉及。
一个真正的大的项目是如何从无到有,从有到变成一个真正的大的项目的。
在学习的过程中,你将会知道,一个大的项目要如何维护,如何分配module到不同的文件,如果去看一个大项目的源码。
这些内容在国内其它的书中,真的是难找到的。而在这本书里,你却能找到答案。当然这只是个人看法。


6 7:对鼠标的学习
这一部分把握两点:
1:初始化键盘(鼠标)控制电路
2:使能鼠标(在bootmain函数中,使能了鼠标后,会马上产生一个中断,发送0xfa,这点也很特别,算是一个正常的响应)

对于上面第5部分对fifo的更高层次的抽象,使得这种数据结构可能很方便的用到鼠标的数据保存上面,而且能灵活的指定mousebuffer的大小。抽象的好处在这里表现的非常显示。


在u盘上启动也能正常启动:命令如下
sudo -s
make usb=1
make copy
make u

make dd


u盘启动的图片也不懒得拍了,上一张qemu仿真的图吧!

代码下载地址:http://download.csdn.net/download/h397916230/5990265

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值