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
测试了外壳程序。