30天自制操作系统 杂谈4

中断处理

这句代码:io_out8(PIC0_OCW2,0x61)用来通知PIC已经知道发生了IRQ1中断。如果是IRQ3,就写成0x63。也就是说,将“0x60+IRQ号码”输出给OCW2就可以。执行这句话后,PIC将继续监视IRQ1中断是否发生,否则系统就感知不到。

中断处理基本上就是打断CPU本来的工作,所以必须干净利索,并在处理期间不再接受其他中断。而另一方面,字符显示要花大量时间处理。所以可以确定处理中断并显示字符总的思路:

先将按键的编码接受下来,保存到变量里面,在有主函数偶尔去查看这个变量。若有数据则显示出来。

值得一提的是,鼠标控制电路包含在键盘控制电路里,如果键盘电路初始化正常,鼠标控制器的激活也就完成了!

内存检查

首先我们需要清楚内存大小和范围。在最初启动的时候,BIOS会检测内存容量,但如果我们在nas文件里用汇编语言会带来两个问题:1.BIOS不同版本调用方法不同。2.汇编代码过长,违背我们尽量使用C语言的初衷。

接下来是内存检查需要注意的问题:
1.内存检查时,要往内存里随便写一个值,然后马上读取,来检查读取和写入的值是否相等。486及以后版本的CPU就开始有缓存了,如果不将缓存设置为OFF的话,写入和读出的就是缓存了。
所以程序要做的第一件事是让486版本以后的cache功能无效

2.C编译器过于优秀,进行了优化处理,导致编译的时候好心办坏事。结果……我们还是得写汇编代码!!

内存管理

内存检查完毕,我们就要考虑内存管理。内存管理的基础,一是内存分配,二是内存释放。方法很多,我们从简单的开始:

我们以4KB为单位进行管理,在0x08000000 / 0x1000 = 32768字节 的空间里用0,1标记是否正在使用。比如需要100KB的空间,那么只需找出连续25个标记为0的地方,将他们标记为1。需要释放的时候,只要重新标记为0就可以了。

显然这种方法还有很大的优化空间,例如用位而不是一个字节去存0,1,这样可以大大减少管理表的大小。相应的,这样做会使程序变得复杂些。

另一种优化思路是列表管理,将类似于“从xxx号地址开始的yyy字节的空间是空着的”这种信息存在列表里。
分配内存:将这一段信息删除。addr向后推进一段空间,size减去相应大小。(等同与贴上正在使用的标签)
释放内存:增加一条可用信息,检查新释放的内存与相邻空间是否可连。若可连,则归纳为一条。
结构体代码如下:

struct FREEINFO {
	unsigned int addr, size;
};

struct MEMMAN {
	int frees, maxfrees, lostsize, losts;
	struct FREEINFO free[MEMMAN_FREES];
};

显然,新方法有以下优点:
首先,占用内存可以设置的很少,因为取决于设定的MEMMAN_FREES的大小。
其次对于大块内存的分配和释放都十分迅速。(原先要疯狂写0,1)

当然,事物总有两面性,这带来存储空间变得零散,可能出现MEMMAN_FREES条管理信息全部用完的情况,(尽管当这个变量设置得足够大可以认为不会发生)。如果我们在这个问题上不能自拔(说的就是笔者),花上好几天时间,积极性会比较受挫。不妨继续开开心心地开发,万一出现问题了,再回头重新修正嘛!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值