项目目的通过参考、修改源码模块,实现自己的OS模块,加深对系统底层的认识
理解汇编语言与底层硬件的交互
开发环境操作系统:Ubuntu 14.04
虚拟机:Bochs
编辑器:Vim
编译器:GCC
任务描述
修改或者重新实现参考源码的一个或多个模块
系统界面
实现细节
重构alloc_imap_bit()与alloc_smap_bit()intalloc_imap_bit(intdev)//为新文件分配位置
intalloc_smap_bit(intdev,intnr_sects_to_alloc)//为文件内容分配扇区空间
由于上述两个函数功能相似,可合并为一个函数,故重构,以减少重复代码。
将上述两个函数重构为:
intalloc_ismap_bit(intdev,intnr_sects_to_alloc)
其中原来两个函数的第一参数相同,故保留;而alloc_imap_bit()
不含第二参数,且alloc_smap_bit()
的第二参数nr_sects_to_alloc//要求分配的扇区数
不应为0,故合并后的函数保留两个参数,当nr_sects_to_alloc
为0时转入相应代码段实现alloc_imap_bit()
的功能,不为0时转入相应代码段实现alloc_smap_bit()
的功能。
由此实现两个函数的合并。
实现MESSAGE收发
自行添加文件任务下的MYFSMSG
和磁盘任务下的DEV_MYFSMSG
两个MESSAGE。
在用户进程中调用myfsmsg()
,此函数用于收发MYFSMSG
MESSAGE。
文件任务接收MYFSMSG
MESSAGE后发送DEV_MYFSMSG
MESSAGE给磁盘任务,从而完成一次MESSAGE收发的模拟。
以下为myfsmsg()
函数代码实现,其他相关代码略。
//myfsmsg()函数代码实现
PUBLICintmyfsmsg()
{
MESSAGE msg;
msg.type=MYFSMSG;
send_recv(BOTH,TASK_FS,&msg);
assert(msg.type==SYSCALL_RET);
returnmsg.FD;
}
下图为文件系统测试用户进程:
其中MyFSmsg gets fd=0
为MESSAGE收发的测试输出,
其余为文件系统创建、打开、读取、删除的测试输出。
输出磁盘信息
获取hdinfo[]
数组,根据ATAPI-6文档(P115 Table-Identify device information),分别取出hdinfo[]
数组多个元素;其中,元素为十六进制,每一位(0或1)表示不同的属性,需要通过与运算(&),提取各位的值,判断0或1,据此来判断磁盘特性,并打印输出至显示屏。
示例如下:
intcapabilities=hdinfo[49];
printl("Timer values supported: %s\n",(capabilities&0x2000)?"Yes":"No");
下图为输出节选:
修改屏幕滚动机制
源代码中,屏幕由SHIFT + UP/DOWN
来控制屏幕信息的滚动,但是在修改中发现,如果屏幕打印信息超过一定行数时,较早打印的信息将会被清空;通过直接修改代码中SCR_SIZE
的值,使屏幕能够容纳更多的信息,而不用担心被清空。
其他改动
美化了输出界面,使得各部分测试输出更加易于辨认,结构清晰。
修改了console相关的部分参数和常量,保证系统正常显示输出。
修改了Makefile与bochsrc,保证系统运行。