简单计划一下。 首先要选好工具链,配好开发环境。 搞好这一套之后先进入64位模式。 然后设计一下内存空间的分布,开启页表。 然后实现printf和字符驱动,打印调试信息。 这一套搞好以后,开始设计虚拟内存的数据结构和接口,实现。 然后设计用户内存空间的分布,设计用户进程的数据结构,准备进入用户空间。 然后配置简单的中断处理,让用户能够访问系统调用。 然后开启时钟,进行用户任务的抢占式调度。 现在,将之前的所有东西理清楚,做得完整一些。 然后开启多核,开始实现内核锁。 然后实现IPC。 然后实现文件系统和shell。
2022.4.27 项目开工了。22:30前写了第一版README,开始配环境。
2022.5.1 现在进了64位模式,配好了qemu和gdb调试。物理机和qemu都能跑,但vmware fusion不能跑,神秘。 现在急需支持更大的可执行文件,然而BIOS只会帮我们搬运第一个sector。6.828的解决方案是把elf文件直接存在第2个sector上,我觉得这不太合理。于是决定做一个文件系统。准备做FAT32,最大的缺点是不支持Unix权限管理。目前阶段只要做出来第一个扇区的格式和读取文件两个功能就够了。应该是可以用C写这个逻辑的,不知道一个扇区装不装得下。 所以下一步工作:
- 实现第一个扇区的格式
- 用C语言实现读取逻辑,然后将汇编和C链成一个文件
2022.7.30 现在放弃了在第一个扇区内实现文件系统的想法,选择将内核代码直接append在MBR后面,然后硬编码内核代码的位置,来加载内核。即便如此,MBR的空间也所剩无几了。 现在先在32位模式下读取并进入了内核,然后在进入内核的C代码前进入了64位模式,并配置了简单的页表和简单的GDT。 下一步的工作(几项并列):
- 搞一套C语言调用汇编语言的库,用来加载各种非通用寄存器
- 细粒度配置的GDT, LDT, IDT
- printk函数
- 设计内存空间,细粒度配置页表
2022.9.16 kpgtbl映射到所有物理页的工作完成了。也许可以更简单地,在kpgtbl中用huge page。下一步:将内核移到高地址区,分配地址空间。初始化pageinfo,实现allocpage,walk_pgtbl的在制定pgtbl中分配页面的功能等虚拟内存的内核准备。 上面的虚拟内存相关准备做好之后,就可以准备进入用户态了。
2022.10.5 现在已经进入了用户态,能够加载并运行用户程序,并且已经实现了一些有意思的功能:错误处理,系统调用,copy-on-write。
还欠缺的功能:
- 时钟中断实现抢占式调度
- 文件系统
- shell
- 多核
- IPC
- 网络协议栈
- 写一些测试用例
需要完善的功能:
- 一个丰富的库
- printf
- memcpy
- 增加一些系统调用
- 添加各种中断处理
- 让内核更健壮
- 浮点数支持
- 书写文档,提高代码可读性和规范性
闲的没事干可以写点文档,专门写OS的工作时间可以搞下时钟中断。