这可能是徒劳的,因为我知道编写一个操作系统非常复杂(尤其是自己编写).

  • 我不希望构建下一个linux或windows.

  • 我知道这会很可怕,而且会有马车,而且不会起作用,但那很好.

我想自己写所有的东西,在AssemblyC和(一些)C++中.

这是一个future 的项目,因为我现在正忙于其他事情,没有时间,但我想我现在应该问一下,所以也许我可以得到很多答案,它可以建立并成为这种方法的有用资源(我所看到的其他一切都涉及到构建minix、使用现有的 bootstrap 加载程序、在虚拟 bootstrap 程序中构建它等等).

我想在我的一台旧台式机上安装一个显示器、键盘和鼠标,然后开始在一个blank硬盘上工作.

我想学习如何编写我自己的 bootstrap 加载程序(我已经找到了很多关于这方面的资源,但是为了完整起见,请仍然添加一些好的)、我自己的USB驱动程序(如果有必要)、CD驱动程序(如果有必要)等等,一切从头开始.

  • 我怎么把代码放到电脑上呢?最好是用软盘吗?大多数电脑能从U盘上做到这一点吗?

  • 我需要什么样的驱动程序,你能推荐一些关于构建这些驱动程序的参考资料吗?

  • 在启动序列之后——然后呢?如何进入保护模式等.

  • 如何在没有操作系统帮助的情况下管理内存?我想用什么地址就用什么地址?不需要初始化吗?

  • 毫无疑问,我会遇到什么让我困惑的事情?

  • 我怎样才能使它既是命令行操作系统,又是图形化操作系统?

  • 图形O/S是建立在什么基础上的?比如,我该怎么做,一个命令行,上面有字体和图片?

  • 我在哪里可以读到关于设置多任务环境的内容?(即,有两个并排运行的类似图形的命令行).

  • 我该如何设置一种窗口系统?一旦设置了简单的多任务处理,如何在屏幕上显示图形?

相信我,我知道这是一个复杂的项目,我可能永远也不会go 完成它或写任何有用的东西.

还有很多我没有提到的其他作品,如果你想起来了,也请随意添加.

请在每个答案上写一个"主题"——例如,USB驱动程序,然后可能是一个资源列表,需要注意的事情,等等.

此外,请不要建议使用其他O/S或预先存在的代码.我知道我会编写很多预先存在的代码(比如linux内核,或者示例资源,现有的驱动程序等等),但最终我想自己完成所有的编写工作.我知道我是在其他东西的基础上建立起来的,如果我改变主意走这条路,还有很多其他的问题,我可以阅读.但这一切都是从零开始的.

有没有关于如何将其图形化的建议?不同的视频模式以及如何使用它们,等等?

推荐答案

第一件事.读,读,读,读,读.在实现自己的操作系统之前,您需要对操作系统的工作原理有一个明确的了解.

拿一本安德鲁·坦恩鲍姆(Andrew Tanenbaum)关于操作系统的书.这是我们在大学操作系统课上使用的:

Modern Operating Systems PDF

Modern Operating Systems on Amazon

尽管封面滑稽可笑,但这是一本很棒的书,特别是对于一本教科书来说.Tanenbaum确实是这方面的专家,他对操作系统如何在引擎盖下工作的解释清晰易懂.这本书大部分是理论,但我相信他还有一本书讨论了更多的实现.不过,我从来没有读过,所以我不能 comments 它.

这将有助于你专注于进程管理、内存管理、文件系统,以及你的操作系统内核需要做的一切,以使其达到可 bootstrap 状态.从那时起,基本上就是为需要支持的硬件编写设备驱动程序,并提供C库函数的实现,以进行内核调用,比如打开文件和设备、读写、在进程之间传递消息等等.

阅读x86汇编(假设您是为x86机器设计的).这应该能回答你关于在处理器操作模式之间切换的很多问题.

如果您有Electron 知识,那么从编写包含大量文档的嵌入式设备的操作系统开始可能会更容易,因为它通常比x86 PC更简单.我也一直想编写我自己的操作系统,我正从编写Digilent的This Development Board微内核嵌入式操作系统开始.它可以运行Xilinx的软核MicroBlaze处理器,该处理器有非常详尽的文档.它还有一些RAM,闪存数据存储,LED,switch ,按钮,VGA输出等等.有很多东西可以用来编写简单的驱动程序.

嵌入式设备的好处之一还在于,您可以在很长一段时间内避免编写VGA驱动程序.在我的例子中,Digilent开发板有一个板载UART,所以我可以有效地使用串行输出作为我的控制台,以最小的麻烦启动并 bootstrap 到命令行.

只要确保您 Select 的任何目标都有一个现成的、经过良好测试的编译器即可.您确实希望同时编写操作系统和编译器.

C++相关问答推荐

使用sd-设备列举设备导致seg错误

从C函数调用asm函数时生成错误的BLX指令(STM32H753上的gcc)

什么C代码将确定打开的套接字正在使用的网络适配器?

为什么输出不是从上到下C

从组播组地址了解收到的数据包长度

C编译器是否遵循restrict的正式定义?

如何跨平台处理UTF-16字符串?

我无法让LLDB正确运行我的可执行文件

在C语言中,在数学运算过程中,为什么浮点数在变量中的行为不同

C++中矢量类型定义和数据保护的高效解决方案

如何在GET_STRING输入后对少数几个特定字符串进行C判断?

C将数组传递给函数以修改数组

Linux分段故障(核心转储)

如何使用空元素块声明指针数组

&stdbool.h&q;在嵌入式系统中的使用

浮点正零何时不全为零?

使用替代日历打印日期

与 C 相比,C++ 中无副作用的无限循环的好处是 UB?

创建 makefile 来编译位于不同目录中的多个源文件

Clang 是否为内联汇编生成了错误的代码?