感谢AlgorithMan的视频教程 作者主页 视频教程
项目仓库 github

23.12.26
初始化项目
新建makefile kernel.cpp loader.s linker.ld
初始化loadkernel printf函数

23.12.27
编译出的内核grub识别不到,持续debug中
在实体机上安装arch,遇到是识别不到引导问题,用uefi shell启动发现是安全启动的原因,关闭后使用uefi shell可以打开grubx64.efi

23.12.29
找到原因:是archLinux的问题,arch Linux的grub找不到/boot/下的内核,尝试使用Ubuntu后可以找到。
使用ubuntu的grub进入内核后系统无法输出
仍在寻找原因

23.12.30
makefile可将系统编译为iso镜像
使用virtualbox运行iso镜像后可以正常显示

一小步,一大步
继续开发
添加类的构造函数
添加了一些数据类型
添加.gitignore文件

24.1.1
写到GDT表,不是很懂,找了一天资料

24.1.2
系统初始化时添加GDT表。

24.1.4
添加port类,优化printf函数

24.1.5
添加idt表
在执行sti汇编指令激活idt表时出现系统崩溃错误,找了一两个小时原因
最后在b站用户あいゆき 分享的编写时的问题集合中找到了解决方案
是在gdt的构造函数中的i数组元素位置反了,翻过来就解决了

24.1.6
添加键盘驱动,但是没有正确执行0x21号键盘中断,
排查了好久错误是由于idt表中的handlers数组的0x21位置没有正确被赋值,导致一直执行空中断,
但是键盘驱动的构造函数就已经给传入的idt表参数的handles数组赋值了,idt表的handles在赋值后仍然为空。
在主函数中给handles的0x21处赋上键盘驱动的指针后可以正常响应键盘中断

优化了一下:
将keyboard类放在idt类友元类中,把handles数组继续放回protected域中,提高安全性

24.1.7
添加鼠标驱动,写的过程中遇到了些小问题
问题一:覆盖过的区域未还原默认值,直接在执行之前把旧的值归为零解决
问题二:上个问题的延续,归为零的内存地址不能再次覆盖,用printf找了半天显存默认值,找到了0x0720这个值,只要把覆盖过的区域归为这个值就可以再次覆写。
问题三:指针覆盖过的地方会直接归为0x0720这个值导致数据丢失,新建了个pre变量寄存指针覆盖之前遇到的值,把覆盖过的地址归为pre的值就可以解决。

24.1.8
添加驱动管理类,将鼠标驱动挪到驱动管理类里时出现bug,鼠标指针在向左或向上移动时边界限制没有起作用
排查一小时发现是定义xy时类型错误,有符号的xy定义为了unsigned,导致x<0判定不起作用 优化项目结构,添加命名空间
24.1.9
添加pci控制类

24.1.10
初始化基地址寄存器

24.1.11
初始化vga驱动,在屏幕上填充蓝色

24.1.12
初始化gui的键盘鼠标操作逻辑

24.1.13
初始化window类,开发时遇到两个问题:
1、鼠标移动没有正确执行
发现是参数类型不兼容,从int改到uint_8后解决
2、窗口颜色没有被正确绘制

debug时添加了一些注释
发现是putpixel函数在调用getcolorindex时有问题,getcolorindex函数中设置的if判断出错,更改后可以正确打印颜色

24.1.14
初始化多线程功能

写多线程时又出了问题,在多任务管理中添加任务后却没有执行
找了好几个小时原因
刚开始以为是我写的逻辑出了问题,把那段代码又从头到尾读了一遍,按逻辑来讲是没问题
中断也能正确调用到多任务处理函数,根据esp来切栈也没有问题,栈中的cp si也正确,但是就是没能运行到多线程管理类中添加的线程
最后发现是多线程管理类在挂在在中断管理类时没有正确挂载上,以为完全没问题的地方出了问题
上个键鼠驱动没挂载上中断也是因为这个问题,历史遗留问题了算是
这几小时改来改去算是把多线程切换完全搞明白了

24.1.15
初始化内存管理类,可以动态分配内存
代码开始添加注释,以便后续差错

24.1.16
初始化网卡驱动时出现bug,
中断表执行不到网卡的中断,找了一天原因,居然是HandlerInterrupt函数打成了HandleInterrupt,所以会在调用中断时没有反应,
一开始以为内存分配的有问题,后来又以为是中断表写的有问题,之后又把写过的涉及到的所有文件全部排查了一遍,最后才看见是函数名打错了
以为这种错误直接会编译不通过的,看来就算通过编译了也要注意这些低级错误
另外也找到了驱动挂不上中断的原因,是因为驱动执行父类InterruptHandler的构造函数时参数传过去后变成0,暂时没找到解决办法

24.1.17
完善网卡驱动,增加收发缓冲区功能

24.1.18
初始化ATA驱动,可以在硬盘的一个扇区中读写数据并且刷新扇区

24.1.19
初始化syscalls,增加了0xA0号中断,可以使用
movl $4, %eax
movl $str, ebx
int $0x80
汇编指令来调用系统打印,传参时eax为调用号,ebx为打印的数据

24.1.20
新加etherframe类,对以太网数据包有收发操作

24.1.21
支持arp协议

24.1.22
支持ipv4协议

24.1.23
支持icmp协议

24.2.10
支持udp协议
成功实现GTOS和其他操作系统之间的udp通信

添加内网穿透和端口转发后可以实现虚拟机内的GTOS在公网上开启udp服务