每周氢氧化物#02 —闪光和金

您好,欢迎回到Weekly Hydroxide ,这是一系列博客文章,我们(Andrei Dimitriu和我)讨论实验性操作系统Hydroxide的当前状态。

上周我们讨论了Hydroxide背后的一些概念以及我们对该项目的构想,本周我们将最终探讨一些技术知识!

这篇博客文章涵盖了氢氧化物开发的最后一个月。

氢氧化物的开发于2018年11月10日星期六开始。 第一次提交已经包含内核的可引导版本。

它具有GDT和IDT初始化,PIC重新映射(工作中断所必需),应急处理,PIT初始化,一个简单的PS / 2键盘驱动程序(可打印键入的字符)和一个基本的VGA帧缓冲驱动程序。

让我们进入第一次提交的肮脏技术细节!

GDT(全局描述符表)设置非常简单; 我们仅使用单个代码选择器和单个TSS(任务状态段)选择器,因为我们的目标是不使用分段的x86_64体系结构。 GDT仍必须初始化才能正常工作。

IDT(中断描述符表)控制中断处理(此时仅适用于PIT和键盘)。 我们使用它来处理由CPU或与计算机连接的硬件直接触发的异常和信号。 它也可用于处理“软”中断,这些中断不是由硬件引起的,而是由用户发出“ int”汇编指令引起的。

在这一点上,我感到不得不感谢phil-opp,他令人惊叹的Rust板条箱和内核开发指南对管理裸机编程的丑陋细节以及在短时间内使系统启动和运行非常有帮助。

通过设置IDT和重新映射PIC,实现键盘和VGA帧缓冲驱动程序非常简单。 对于我们在一个Hydroxide开发人员编写的另一个基于Rust的内核的驱动程序之上构建的帧缓冲区,键盘是从汇编代码(也是从Hydroxide开发人员的先前项目)移植过来的。

那就是代码借用结束的地方。

在氢氧化物开发的第一周,我们累计完成了55次提交。

这是我们大致按顺序执行的操作:

  • 修复VGA帧缓冲区的滚动
  • 重写和重构大量的PS / 2键盘驱动程序
  • 添加PCI设备搜索
  • 通过KBC(键盘控制器)实现CPU复位
  • 重构大多数PCI代码以使其干净且可扩展
  • 在特定的硬件接口之间添加更多抽象
  • 开始为标识映射内存区域进行分页
  • 编写CMOS(互补金属-氧化物-半导体)接口
  • 通过CMOS进行POST(开机自检)检查
  • 编写一个RTC(实时时钟)接口
  • 通过RTC实施日期,时间和日期时间结构
  • 开始编写BGA(Bochs图形适配器)驱动程序
  • 添加堆内存映射和自动链表堆分配器

在本周结束时,我们的堆破裂了,BGA设备无法工作,并且分页和内存映射出现了问题。

然而,那是一个很棒的一周,我们完成了很多工作,尤其是PCI,分页和内存分配工作为进一步发展和向内核添加越来越多的功能提供了良好的基础。

在接下来的两周内,我们修复了堆并分配了内存。 有了这个强大的工具,我们专注于通过BGA驱动程序实现模式切换,并向用户展示漂亮的彩色文本屏幕。

我们实现了HAL(硬件抽象层),并将BGA驱动程序转变为可正确管理的PCI设备。

然后,我们将VGA终端与设备结构集成在一起,实现了串行设备打印,并调整了print和println宏以写入设备,而不是直接使用VGA帧缓冲区。

这项更改还使我们能够实现优先级的内核日志记录,该日志记录将所有日志消息写入COM1串行设备,以便于调试,并通过现在称为tty0的帧缓冲区将所有信息和更高优先级的消息打印到屏幕。

在完成所有以设备为中心的工作之后,我们决定对我们新的基于BGA的1280×720终端有所兴趣,并为ANSI / VT100转义码编写了一个解析器。 最终,我们终于能够以32位色深将高分辨率的彩色消息打印到屏幕上。

在最近的提交中,我们为抢先式多任务处理奠定了基础,因此希望下周能够向您展示一些实际的进展。 在最初努力使上下文切换正常工作之后,我们最终使两个线程在打印到屏幕时并行运行,而不会彼此死锁或触发内核崩溃。

我们还计划编写VFS(虚拟文件系统)以使将来的文件系统实现成为可能,并且与改进现有的多任务代码一起,我们希望过渡到用户领域并实现模块加载。

与往常一样,您可以在这里找到项目:GitHub上的Hydroxide OS
感谢您的阅读,我们希望下周再见!