#:训练训练课程以建立操作系统。从头开始,仅使用AMD和Intel的资源。
仍处于alpha舞台
该存储库尚未抛光,在Alpha阶段仍然必须考虑。该代码应该编译和工作,但是发短信只是我在编码和研究时提到的初稿。
与其他教程有什么不同?
那里有很多教程,我提出的很大一部分也涵盖了那里。那为什么要打扰呢?我特别喜欢并受到这些的启发:
- 菲尔·托多(Phil Todo):链接
- Intermezzos:todo:链接
这个版本有什么不同?当我学习新事物时,我常常会感觉到我不知道/学习如何在下一次完全自己做的事情。我不知道这是我学习的方式还是在编写教程时很容易省略的典型事情。这是我想定期想知道的一些观点(我可能会错过其他必要的东西来弥补这一点)
- 提供一些更多细节,详细说明什么是一致的约定,什么是标准,什么是体系结构。我仍然记得当我少年时期开始学习编程时,我就像是“嗯……计算机怎么知道主要的功能必须首先称为“功能”,而我的朋友或老师都不是新的。那只是“魔术”。这些事情困扰着我,我想去一切。
- 指向标准并从那里工作。我不会提出您仅复制的完成解决方案。我们采用标准,实际上查找事项。就像我们想在ARM皮层而不是您的X86_64机器上运行代码一样,我们必须这样做。或者,构图不同,如果我们将是第一个编写教程的人,我们将如何使该引导程序运行,中断或CPU首先进入64位模式怎么办?
- 做两次。我会首先走对准则,这有助于了解正在发生的事情,然后我们使用工具避免每次进行地面工作。
- 中间步骤和“检查点”
- 首先给出大纲 - >查看大图
- 将示例列入真实代码 - >例如,第一个内核箱实际上是Linux的构建方式
- 我们开始使用的每个
dependency的替代方案/选择。对我来说,如果我想遵循一个教程,并且许多外部图书馆都会做我真正想学习的魔力,那真是令人沮丧。
大纲
我想做的事情的粗略轮廓。希望以或多或少的时间顺序。关键是我们可以做很多事情,以至于实际上很难选择一条路径。
首先,我想更好地了解启动过程。在引导加载程序跳入之前会发生什么。实际上滚动自己的引导加载程序(链接到OSDEV)本身就是一项巨大的任务。
我的计划是稍微探索启动过程中的早期阶段。这样做的目的是了解并欣赏引导加载程序为我们做的事情。最后,我想对不同的处理器模式,它们提供的内容以及如何切换到32位保护模式有一个粗略的了解。具体的目标是能够切换到受保护的模式并打印Hello World!到屏幕。在汇编中实现的所有内容,不使用引导加载器。
之后,我计划切换并使用grub作为引导加载程序。并从那里继续。
tl; dr
- 写一个最小的可启动图像。
- 以16位实际模式打印
Hello World引导加载程序。 - 手动切换到32杆保护模式并打印
Hello World 。 - 手动切换到64箱长模式
- 使用grub作为引导程序,并打印
Hello World 。 - 切换到长模式(再次)。
- 跳入
C ,打印Hello World 。 - 堆
- 实现VGA视频驱动程序。
- 中断(第1部分) - 在ASM中告诉CPU在哪里可以找到处理程序
- 中断(第2部分) - 将代码从10。移动到C
- 实施更好的处理程序
- 调试
- 处理中断/异常
- 实现内存分页。
- 重新映射内核
未指定:
后来...
- 文件系统
- 过程
- 调度
- 系统调用
- 探索堆栈,引发堆栈溢出和异常
- 通过UART与GDB连接(用于调试和嵌入式预览)
- 跨编译到手臂处理器的某些(或多个)零件。 (我有一个STM和Infineon板,闲置了)
预先Quesits?
没有任何。说真的,不要害怕。本教程的全部目的是从头开始发展所有必需的知识。我假设只有一个条件,那就是您可以进行适当的编程。到了不错的情况,我的意思是您至少已经听说过堆栈和堆,并且可以用某种语言提高效率。我想那应该足够了。毕竟,我们并不是在尝试在这里开发下一个一代主流操作系统,而是在业余爱好层面上进行修补。
我可以向您保证的一件事:即使您永远不会再触摸此代码,也永远不会写OS。体验将改变您对正在进行的系统的理解。从内核水平的发展中获得的知识在您的职业生涯中传播,例如种子,而洞察力将在最出乎意料的时刻被证明是有用的。
刮擦板(从这里进行无组织的想法)
想法
- 如果您在第一个512字节之后放置说明,CPU会怎么办?他们被执行吗? (CPU处于16位实际模式)
大纲
- 引导加载 - >两个选择滚动或使用现有的,例如grub。
- 16位模式
- 输入32位保护模式
- 输入64位长模式
- 输入c
- 编写内存管理器模块
周期0-环境与跨补偿工具链
- 您可以跳过一些步骤。在开始编写C代码之前,我们不需要交叉汇编工具链。
- 开始在$ home下的某个地方构建工具链
- 确保环境变量的范围正确
- 诸如“没有权限创建目录
/usr/lib/i686-elf ”之类的错误表示$PREFIX未正确设置。 - 我们没有得到“真正的”准骨CPU,我们面前仍然有BIOS。它以实际模式初始化CPU并用CPU交给我们。
周期0-引导加载程序
资源
- nasm文档https://www.nasm.us/xdoc/2.14.02/html/nasmdoc3.html
- 英特尔手册