一个操作系统的设计与实现——第24章 64位文件系统,键盘驱动与外壳程序
24.1 64位文件系统
想要实现文件系统,就需要一个超级块和一个文件系统位图。在我们的操作系统中,超级块位于98号扇区,文件系统位图位于99号扇区,文件从100号扇区开始存放。
本章代码24/FS.h定义了FCB,一个FCB的大小是32字节,一个扇区可以存放16个FCB,其中,最后一个FCB改为存放魔数,这些FCB组成了超级块。
本章代码24/FS.hpp实现了文件系统的各个接口,其实现思路与32位操作系统一致,这里不再赘述。
24.2 64位键盘驱动
想要实现键盘驱动,就需要先实现一个具有阻塞功能的IO队列。IO队列的实现位于本章代码24/IOQueue.h与24/IOQueue.hpp中,其实现思路与32位操作系统一致,这里不再赘述。
键盘驱动的实现位于本章代码24/Keyboard.h与24/Keyboard.hpp中,其实现思路与32位操作系统一致,这里不再赘述。
键盘接在IO APIC上,IO APIC使用索引寄存器和数据寄存器进行访问,其中,索引寄存器的地址是0xfec00000,数据寄存器的地址是0xfec00010。键盘在IO APIC中的索引是0x12与0x13,其中,0x12号寄存器用于设定中断向量号等信息,0x13号寄存器用于设定中断需要发送给哪个CPU。在我们的操作系统中,0x12号寄存器固定设为0x21,表示键盘中断的中断向量号是0x21;0x13号寄存器固定设为0x0,表示键盘中断发送给第一个CPU。
接下来,请看本章代码24/Int.hpp。
第21~24行,在IO APIC中安装键盘中断。
接下来,请看本章代码24/Int.s。
intKeyboard函数是键盘中断处理函数。
第126~127行,发送中断响应信号。
第129~132行,从0x60端口读取键盘扫描码,然后调用键盘驱动函数。
第173行,在中断处理函数表中安装键盘中断处理函数。
接下来,请看本章代码24/Syscall.s。
第5行,导入inputStr函数。
第63行,在系统调用表中安装inputStr函数,其系统调用号是1。
24.3 64位外壳程序
本章代码24/Shell.h与24/Shell.hpp实现了外壳程序,其实现思路与32位操作系统一致,这里不再赘述。
24.4 编译与测试
本章代码24/Test.c继续测试0号与2号系统调用。新增的循环用于使任务的运行时间变长,以观察3特权级任务与外壳程序共存时的效果。
本章代码24/Kernel.c测试了外壳程序。

浙公网安备 33010602011771号