make os

os · 04-29

项目目标


  1. 项目目录

    Contents

暂定为2个月

  1. 参考资料

    操作系统真相还原

    linux内核完全注释
    自己动手写一个64位操作系统
    orange's 一个操作系统的实现

第一阶段:开始 2.1 设置交叉编译工具链 
    2.2 创建一个Hello World内核 
    2.3 设置一个项目
    2.4 调用全局构造函数 
    2.5 终端支持 
    2.6 栈溢出保护器 
    2.7 多重引导 
    2.8 全局描述符表
    2.9 内存管理 
    2.10 中断
    2.11 多线程内核
    2.12 键盘
    2.13 内核调试器 
    2.14 文件系统支持
3 第二阶段:用户空间 
    3.1 用户空间     
    3.2 程序加载 
    3.3 系统调用
    3.4 操作系统特定的工具链 
    3.5 创建一个C库 
    3.6 分叉和执行
    3.7 命令行解释器 
4 第三阶段:扩展你的操作系统 
    4.1 时间    
    4.2 线程 
    4.3 线程本地存储 
    4.4 对称多处理 
    4.5 二级存储 
    4.6 真实文件系统 
    4.7 图形 
    4.8 用户界面 
    4.9 网络 
    4.10 声音 
    4.11 通用串行总线     
5 第四阶段:自举引导     
    5.1 移植软件
    5.2 移植GCC     
    5.3 在你的操作系统下编译你的操作系统     
    5.4 完全自主托管
6 第五阶段:盈利

第一阶段:开始
在此阶段,我们将设置一个工具链并创建一个基本内核,该内核将成为新操作系统的核心。

设置跨工具链
主条目:GCC 交叉编译器
您要做的第一件事是为操作系统设置交叉编译器。本地系统上的编译器无法为您的操作系统生成程序,因为它尚未发明。首先,您要做的是创建一个编译器,该编译器生成将直接在目标硬件上运行的可执行文件。

创建 Hello World 内核
主条目:裸骨
另请参阅其他平台的裸骨
你的下一个任务是制作一个简单的hello world内核,它能够启动,将消息打印到输出设备,然后无休止地循环。虽然简单且无用,但它将作为真实系统的一个很好的例子和起点,并确认您的测试环境正常工作。

设置项目
主条目:多肉骨架
通过一个基本的工作示例,您的下一个任务是使用您认为合适的任何构建系统设置构建基础结构。在选择技术时要小心,GNU Make比Python更容易移植。

调用全局构造函数
主条目:调用全局构造函数
编译器希望您执行各种程序初始化任务,例如在全局C++对象上调用构造函数。通常,您将使用 kernel_early_main 函数来设置最小的内核功能,然后执行所有这些初始化任务,然后跳转到实际的kernel_main函数。

终端支持
主条目:格式化打印
您经常需要调试操作系统。你最好的朋友是一个printf函数,它能够将字符串和整数打印到屏幕上的类似终端的缓冲区上。尽早将 printf 函数添加到内核中至关重要,因为以后您肯定需要它进行调试。

堆栈粉碎保护器
主条目:堆栈粉碎保护器
考虑安全性和健壮性还为时不早。您可以利用现代编译器提供的可选堆栈粉碎保护器,该保护器可以检测堆栈缓冲区溢出,而不是行为异常(或者如果不幸,什么也没发生)。

多重引导
主条目:多重引导
了解引导加载程序为内核提供了哪些功能和信息很有用,因为这可以帮助您获取内存映射、设置视频模式,甚至内核符号表。

全局描述符表
主条目:全局描述符表
全局描述符表是处理器状态的重要组成部分,因此它应该是初始化的第一件事。甚至在kernel_early之前设置它可能很有意义。

内存管理
主条目:内存管理
内存分配和管理是操作系统中最基本的功能之一。您需要跟踪物理页面帧,使用的虚拟内存范围,并在其上实现堆(malloc,空闲)以供内部内核使用。

中断
主条目:中断
内核需要处理硬件发送的异步事件才能正常运行。

多线程内核
主条目:多线程内核
最好在内核开发的早期进行多线程处理,否则最终会重写内核的某些部分。当我们稍后添加流程时,我们当然需要它。

键盘
主条目:键盘
您的操作系统肯定需要支持从计算机操作员读取输入,以便它可以根据他的意愿调整其行为。

内部内核调试器
主条目:内部内核调试器
对于多线程内核来说,尽早具有内置的调试工具非常有用。你可以有一个魔术键来停止整个内核,并将用户转储到带有命令行界面的迷你内核进行调试。它可以知道调度程序用于列出所有线程和执行调用跟踪的数据结构。

文件系统支持
主条目:文件系统,初始化虚拟硬盘
尽早支持文件系统并使用初始化虚拟硬盘将文件传输到操作系统会很有用。

第二阶段:用户空间
在此阶段,我们将你的操作系统扩展到用户空间,并添加对程序的支持,这足以让你的项目有资格成为小型操作系统。在此阶段的早期,您需要处理系统调用、程序加载、内存管理和返工系统部分。

用户空间
主条目:用户空间
到目前为止,您的进程器一直在内核模式下运行,代码能够执行所有操作。进程通常没有任何权限运行,除了能够执行代码并使用其指定的内存。实现用户空间的第一部分是将处理器切换到用户模式。

程序加载
主条目:动态链接器
您需要完成的第一个任务是将程序加载到内存中。这涉及解析程序标头,在正确的虚拟地址分配内存以及将段的内容复制到正确的虚拟地址。您还需要根据重新定位表填写GOT中的条目。

系统调用
主条目:系统调用
您现在可以将程序加载到内存中并切换到使用模式。进程使用系统调用与内核通信,这是您要添加的下一个功能。

特定于操作系统的工具链
主条目:操作系统专用工具链
由于您的操作系统现在正在成为真正的操作系统,因此是时候将其视为操作系统了。我们希望向交叉编译器介绍您的操作系统及其约定,以便我们可以轻松地交叉编译程序。

创建 C 库
主条目:创建 C 库
此时,您可以决定使用现有的 C 库或编写自己的 C 库。如果你走自定义路线,你将需要设置一些交叉编译器需要libgcc的基本功能。完成此操作后,您现在可以轻松地交叉编译程序。

分叉和执行
主条目:叉子
随着基本程序的加载到位,我们几乎可以创建一个多任务操作系统了。缺少的基元是允许进程创建新进程。标准的Unix原语是fork,它允许进程创建自己的完美副本。然后,此副本能够调用程序加载程序,并将其自己的内存替换为另一个程序映像的内存。

壳
主条目:壳牌
这是您的操作系统中非常令人兴奋的一点。它能够运行程序并创建新进程。到目前为止,系统的行为可能在编译时确定。通过编写 shell,您可以运行多个程序并决定在运行时运行哪个程序。这是您达到许多新手梦寐以求的水平的点:具有工作命令行的基本操作系统。

第三阶段:扩展操作系统
有了这些基本功能,您现在可以开始编写操作系统及其所有精彩功能了。您将添加游戏、编辑器、测试程序、命令行实用程序、驱动程序以及您能想象到的任何内容。你的技能和想象力是这里的极限。您可以将其中许多功能延迟到操作系统中的稍后,然后几乎按任何顺序进行。

时间
主条目:时间
时间在计算中是一个复杂的概念,但是现代操作系统应该具有将时间戳转换为解析时间并返回的功能,以及提供系统时钟(实时,单调时间,用户CPU时间等)和这些时钟上的计时器,事件在到期时发生。

线程
主条目:线程
操作系统应公开线程 API,例如 pthreads。

线程本地存储
主条目:线程本地存储
线程局部变量需要运行时支持。

对称多处理
主条目:SMP
尽早向内核添加对多个 CPU 的支持是一个非常好的主意,否则您可能需要重做很多内核,因为它在许多地方都没有准备好 SMP。

辅助存储
主条目:中学
您可能希望支持常见的块设备,如硬盘、光盘、软盘以及您的操作系统需要支持的任何存储设备。

真实文件系统
主条目:文件系统
尽早添加适当的文件系统支持是个好主意。

图形
主条目:如何设置图形模式
真正的操作系统不是在基本文本模式下运行的,而是具有位图图形。编写真正的图形驱动程序是一项繁重的工作,尽管某些虚拟机提供了一些有用的快捷方式。

用户界面
主条目:用户界面、合成
您当然需要用华丽的图形和可用的用户界面给操作系统开发社区留下深刻印象。

联网
主条目:网络
网络支持的用途是显而易见的,因此您可能希望这样做。

声音
主条目:声音
声音是计算体验的重要组成部分,根据您的需求,您可能希望在通用硬件上支持声音。

通用串行总线
主条目:USB
如果您需要与现代外围设备通信,您可能需要一个 USB 堆栈并支持各种常见的 USB 控制器。

第四阶段:引导
您现在已准备好基本操作系统,可以进入下一个级别。在此阶段,我们将开始将软件移植到您的操作系统上,以便您可以自托管。当您设置特定于操作系统的工具链时,您已经开始努力实现自托管,现在得到了回报。

移植软件
主条目:跨移植软件
虽然并非所有软件都易于移植,但大多数Unix软件都带有自动生成的配置脚本。您可以使用 --host=mycpu-myos 选项为这些脚本提供,如果您的操作系统提供了所需的功能,则可以将软件交叉编译到您的操作系统上。您已经遇到了如何在设置特定于操作系统的工具链时移植软件的示例。虽然交叉编译软件的难度差异很大,但您会希望使用相同的过程来适应新包。

移植海湾合作委员会
主条目:将 GCC 移植到您的操作系统
在设置特定于操作系统的工具链时,您已经开始移植 binutils 和 gcc。我们将完成该过程并将它们交叉编译到您的操作系统上,以便它可以编译 C hello world 程序。

在您的操作系统下编译您的操作系统
下一个任务是移植整个构建系统。你可能需要移植GNU Make,移植一些命令行实用程序(coreutils)或编写自己的,移植一个真正的shell或完成你的等等。您可能还需要修复操作系统中的许多错误,以便编译器正常运行。您将需要处理如何将新编译的版本传输到永久存储上,以便重新启动计算机将运行下一个版本。您的操作系统现在将质量为自编译。

完全自托管
现在您可以在操作系统下构建整个操作系统,您还需要能够完成其余的工作。您还需要能够在操作系统下构建编译器。您需要能够在操作系统下进行开发,因此您将移植自己喜欢的文本编辑器或编写一个。您需要网络,以便可以将最新版本(基于自身构建)发布到互联网上。您将移植大量程序,库,游戏以及您想要的任何其他内容,以便整个开发过程可以在您的操作系统上进行。您现在可以卸载原始操作系统并将其替换为新的辉煌操作系统。

第五阶段:利润
您现在已经成功地创建了一个真正的操作系统,它是完全自托管的,并且让整个操作系统开发社区羡慕不已。你已经移植了quake,拥有OpenGL程序,一个有效的浏览器,一个蓬勃发展的贡献者社区,并取得了很大的成功。现在,您可以从自己的操作系统重新开始并开发下一个操作系统。

关键事项

  • 不偷懒
  • 不放弃
  • 注重体验过程,而非结果

    里程碑

    整个项目中,关键节点的里程碑计划。

人员安排

输入项目的所有干系人,包括内部和外部干系人。
人员岗位
@black项目工程师
@bing辅助

风险提示

对公司战略、项目结题、法务风险问题进行提示,并说明应对措施。
Theme Jasmine by Kent Liao