如何在一台旧的桌面电脑上构建一个小型操作系统?

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

  • 我并不期望构建下一个 linux 或者 windows。

  • I know it will be horrible, and buggy, and won't work, but that's fine.

我想写一切自己,在 集合C,和(一些) C + +

这是一个未来的项目,因为我现在正忙于其他一些事情,没有时间马上做,但是我想我现在就要问它,所以也许我可以得到很多答案,它可以构建并成为这种方法的有用资源(我看到的所有其他东西都涉及到构建 minix,使用现有的引导程序,在虚拟启动程序中构建它,等等)。

我想设置我的一个老台式机与显示器,键盘和鼠标,并开始工作的 空白硬盘驱动器。

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

  • 我怎样把密码输入电脑?最好用软盘吗?大多数电脑能用 U 盘做到吗?

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

  • After the booting sequence--then what? How do I get into protected mode etc.

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

  • What will I undoubtedly run into that will confuse me?

  • 如何使它既是一个命令行 O/S,又是一个图形化的?

  • 图形化的操作系统是建立在什么基础上的?比如,我该怎么做,一个命令行,有字体,顶部有图片?

  • Where can I read about setting up a multitasking environment? (ie., having two graphical-like command lines running side-by-side).

  • 我要怎么建立一个视窗系统?一旦设置了简单的多任务,我如何在屏幕上显示图形?

相信我,我明白这是一个复杂的 非常项目,我可能永远不会抽出时间来完成它或写任何有用的东西。

还有很多其他的作品我没有提到,如果你想到任何,随时添加这些。

请在每个答案中加入一个“主题”——例如,USB 驱动程序,然后可能是一个资源列表,需要注意的事项,等等。

此外,请不要建议建立了另一个 O/S 或预先存在的代码。我知道我将 大量预先存在的代码(如 linux 内核,或示例资源,现有的驱动程序等) ,但最终我想做所有的写作自己。我知道我的 应该是建立在别的东西之上的,如果我改变主意,走那条路线,我可以读到很多关于这方面的问题。但这次是要从头开始。

Any suggestions on how to get it graphical? Different video modes and how to work with them, etc?

50318 次浏览

Http://www.osdev.org/ 还有 Http://www.osdever.net/

welcome to the OS Development world.

另请参阅 SO 的 标签维基中的其他 x86文档链接: Intel 和 AMD 手册、编译器/汇编器文档以及各种指南。

它还建议使用 BOCHS 或其他虚拟环境进行调试,因为您可以单步启动加载程序并检查寄存器。

我建议至少首先在 Bochs或者其他虚拟机上工作,因为你可以把它带到任何你想要的地方,调试起来更容易(你可以看到硬件的确切状态) ,如果你需要外部帮助来调试,他们可以使用和你完全一样的“硬件”。

我有一个最有用的建议,就是让你自己进入一种能够尽快运行 C 代码的状态——也就是说,启动,设置你的描述符表,然后让你自己到一个安全的地方去运行已编译的 C。如果你想保持理智并继续工作的话,大多数(如果不是全部的话)内核都应该在 C 中。虽然在某些地方需要汇编,但是汇编是乏味的,而且往往难以调试。

Many schools have OS classes that do much of what you describe. My school (CMU) taught OS in C, and we wrote a kernel, file system, and shell, and were provided with code for a boot loader.

不幸的是,我无法在网上找到任何关于这门课程的权威资源(15-412) ,而且它是随着时间的推移而演变的。但是,也许人们可以发布链接的来源和学校的任务,有良好的资源在网上。

check out MikeOS. Its a fairly simple OS written is readable (as in commented) assembly. Even though its fairly simple, it does have a GUI and supports some networking and multimedia.

编辑 : MenuetOS是图形化的,它也是直线式的,但是比 MikeOS 更复杂

我会从小型开始,购买一个8086嵌入式开发工具包,并在此基础上开发一个多任务操作系统。一旦您拥有了内核,并且熟悉了在硬件级别上的工作,您将准备好做一些更具挑战性的事情。

构建一个 VGA 显示器 DOS 克隆是一件相当具有挑战性的事情

specific topics.

我怎样把密码输入电脑?最好用软盘吗?大多数电脑能用 U 盘做到吗?

The BIOS will do elementary bootstrapping.


What drivers do I need, and can you suggest any references to building those?

任何不直接进行 CPU/内存操作的东西。任何不直接在 CPU 参考手册中的东西。


在启动顺序之后——然后呢? 我如何进入保护模式等等。

Protected mode will be part of the boot sequence.

然后开始进行多任务处理,并弄清楚如何启动进程。


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

正确。您最终可能需要整理一个虚拟内存系统。


What will I undoubtedly run into that will confuse me?

没有调试工具,没有 IO


如何使它既是一个命令行 O/S,又是一个图形化的?

看看 Windows 3.1和 Linux,尤其是 X 窗口。


图形化的操作系统是建立在什么基础上的?比如,我该怎么做,一个命令行,有字体,顶部有图片?

查查 X 个窗口。


最后的建议: 学习 linux/x 窗口。它并不完美,但是它提供了对 one方法的理解。也学习嵌入式系统。

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

拿一本 Andrew Tanenbaum 关于操作系统的书。这是我们在大学操作系统课上用过的:

现代操作系统 PDF

亚马逊上的现代操作系统

尽管封面很可笑,但这本书读起来很棒,尤其是对于教科书来说。Tanenbaum 确实是这方面的专家,他对操作系统如何在引擎盖下工作的解释很清楚,也很容易理解。这本书主要是理论,但我相信他也有一本书,讨论了更多的实现。我从来没有读过,所以我不能评论它。

That should help you bone up on process management, memory management, filesystems, and everything else your OS kernel needs to do to get it up to a bootable state. From that point on it's basically a matter of writing device drivers for the hardware you need to support, and offering implementations of the C library functions to make kernel calls for things like opening files and devices, reading and writing, passing messages between processes, etc.

阅读 x86汇编文件(假设您是为 x86机器设计此文件)。这应该可以回答您关于在处理器操作模式之间移动的许多问题。

如果您具备任何电子方面的知识,那么开始为有大量文档的嵌入式设备编写操作系统可能会更容易,因为它通常比 x86个人电脑更简单。我也一直想编写自己的操作系统,我正在从 Digilent 开始为 本发展局编写一个微内核嵌入式操作系统。它可以从 Xilinx 运行 MicroBlaze 软核处理器,Xilinx 有非常详细的文档。它也有一些内存,闪存数据存储,LED,开关,按钮,VGA 输出等。编写简单的驱动程序有很多事情可以做。

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

只要确保无论您选择的目标是什么,都有一个现成的、经过良好测试的编译器。你需要同时编写一个操作系统和一个编译器。

您可能喜欢 这个教程命名为“滚动您自己的玩具 UNIX 克隆操作系统”,它非常有见地,应该帮助您的方式。

Good luck.

如果你不介意使用硬件虚拟化,有一门课程(书 + 讲座 + 软件)将带你“从纳德到俄罗斯方块”。你创建一个完整的计算机系统完全自己从(为了这些目的原子,并给出)电子 NAND 门,直到建立操作系统,语言,最后编码一个简单的游戏在您的个人机器。

我认为这是一个很好的主意,我完全打算很快陷入其中。这本书出人意料的便宜,我相信这门课程是在麻省理工学院教授的。我无法想象没有什么感觉比拥有一个完整的,完整的知识整个系统你从头开始建立自己的感觉更好。

链接: http://www1.idc.ac.il/tecs/

At its lowest level the minimum that an operating system needs to be able to do is to drive a system's hardware in some way and somehow load an execute some sort of "user code." If you're going to start with a PC then you need to write code that can be loaded by it from some device or another. Older PCs have a BIOS in firmware which determines how the hardware performs some initialization (at least video, keyboard, and some form of storage or boot loader). (Update October 2017: Newer PCs have EFI or UEFI firmware ... which is largely a pedantic difference; the serve the same purposes for this discussion).

因此,首先要了解如何在目标系统上使用 BIOS 或其他固件的底层细节。也就是说,学习如何编写 BIOS 可以加载和执行的程序。它最终将变形为您的引导加载程序。从小事做起。只要得到一个程序,打印: “你好,莱纳斯”直接从固件启动过程(在软盘,或 USB 拇指驱动器,将是一个良好的开端... 或在硬盘驱动器,如果你喜欢)。

从那里,我建议编写一个非常简单的串行驱动程序... 更新您的启动加载程序,以初始化一些串行端口,并开始从那里下载。然后它就可以执行它拉过的代码。从那里编写一个引导程序,它可以写入另一组块(我们还没有实现文件系统... 甚至没有分区表解析; 所以我们首先只处理磁盘上的原始块范围)。

At that point your boot loader should be able to pull new code across the serial line, dump it into a partition (yes, implement partition table handling of some sort ... whether it conforms to standard PC conventions is up to you at this point), and execute it.

从那里你应该能够工作在更复杂的功能。在这个基础上,您可以编写和编译一个新的“内核”... ... 重新启动您的测试平台,并将新的内核部署到其中。

(你的引导装载程序应该接收一些信号,比如通过连续握手行的 BREAK 作为命令,跳过下载,只引导现有映像; 它也应该以这种方式处理一些超时)。

从那里写一个非常简单的终端层和命令外壳?文件系统?实现命令来下载内核以外的新的可执行内容(文件或某种类型的对象)。诸如此类。

当然,您可以使用 PC 键盘和视频(分别是 BIOS INT 0x16h 和 INT 0x10H 之类的东西,如果我没记错的话)开始使用控制台驱动程序。但是,我建议从串行驱动程序开始,因为这样您就可以从任何其他现有(功能性)系统自动化构建/部署/测试周期。由于您的新操作系统将作为一个交叉编译的项目启动,因此对于您来说,有一个简化的方法来处理它是必不可少的。

我不知道你想把你的项目做到什么地步。一个相当令人印象深刻的目标是实现“自我托管”如果你能创建一个简单的汇编器/编译器,允许你使用你的新操作系统(重新)构建、链接和引导到你的新操作系统的工作版本... 那么你已经实现了这个目标。(请注意,这不是一个必要条件。许多嵌入式系统永远不会自托管,这并没有什么错)。

I see plenty of good references to OS development sites, so I'll describe a different approach:

如果你想体验用裸机实现操作系统,有比旧电脑更好的硬件选择。使用 PC 架构,您将花费大量的时间编写围绕其30年设计历史的无趣工件的代码。例如,项目的引导装载程序部分可能已经耗尽了许多勇敢的程序员的精力。

例如,您需要一组驱动程序来从磁盘和/或网络读取内核。然后需要代码才能进入保护模式。在这一点上,您需要另一组驱动程序!很少的工作,你做得到芯片进入保护模式将转让后,点。你想运行它在一个不同的 PC +-4年,你将需要另一套驱动程序。

研究自举 ARM 或其他32位“嵌入式”芯片。便宜的开发板可供选择,或者您可以自己焊接!有些内置了以太网和 usb。我认为您将会在一个理智的、非硬壳的架构中获得更多的乐趣,并且最终可能获得一些可重用的技能。

研究 A2系统(以前称为 Oberon 星系)的想法,你可以窃取。这是一个图形操作系统建立只有两个人,虽然承认一个是尼克劳斯沃思。1990年左右首次发行,速度惊人的好。有一本古特内克特的书。

看看 迷你。与“ Operating Systems Design and Implementation”一起学习源代码。考虑对项目做出贡献。我认为 Minix 是一个非常好的,有前途的操作系统。这也是一个资金充足的项目。这意味着,你甚至可能得到报酬,你的贡献!

最重要的是,如果你想让它在真正的硬件上运行,你绝对需要一份处理器手册的副本。英特尔的手册(http://www.intel.com/products/processor/manuals/)是非常宝贵的。从切换模式(real/protected)到虚拟内存管理(如果您选择这么做的话) ,再到生成系统调用(如果您开始使用用户模式的话) ,它们会遍历所有内容。最重要的是非常详细地解释了一些必须设置才能运行的东西,比如 TSS 和段寄存器,大多数操作系统文本不讨论这些东西,因为它们更关心高层次的概念而不是处理器特定的细节。

你可能想看看 操作系统概念,作者: Abraham Silberschatz-理解系统编程的概念是一个基本的要求,看看操作系统 linux * BSD 和 GNU/Linux的 F/OSS 内核内部,特别是早期版本,它们可能有更多的文档。译自: 美国《科学》杂志网站(http://i.stack.imgur.com/z1d8k.jpg)原著: http://i.stack.imgur.com/z1d8k.jpg 原著: http://i.stack.imgur.com/z1d8k.jpg 原著: http://i.stack.imgur.com/z1d8k.jpg alt text

你可能会对 操作系统开发系列@BrokenThorn 感兴趣。

我在 StackOverflow: 如何开始操作系统的开发上维护一个资源列表。请添加新的资源,因为你开始你的冒险(我即将开始:)

你有一个雄心勃勃的目标,但是执行是关键。

大多数的结构化方法(教科书或者大学课程)都可以帮助你完成整个过程,但是它们提供了大量的本质代码,掩盖了你选择的平台的神秘细节,让你可以专注于宏观的想法: 进程调度、内存管理、死锁预防、 I/O 等等。

我的建议是: 减少你的期望,从一个基本的问题开始。

什么是操作系统?

计算机科学家(希望)永远不会说操作系统是一个图形用户界面,或者是一个网页浏览器,或者是一种连接 USB 设备的方式,或者是任何用户可以看到或触摸到的东西。相反,操作系统最基本的层次就是我上面提到的那些东西。它们都属于一个大伞: 资源管理。

操作系统不过是一个管理计算机硬件资源的程序: 内存、 CPU 和外围设备。

下面是一个简单的操作系统: 程序允许用户使用串行连接键入程序(十六进制或二进制)。一旦输入了程序,它就会运行该程序。程序完成后,控制权返回给用户,用户可以在其中再次运行程序或键入新的程序。

在一个“干净”的架构上完成这项工作,比如一个内存为64K 左右的嵌入式 ARM 处理器。你可以在学习了几天 ARM 的来龙去脉之后在汇编中编写代码。还有 瞧!,你已经有了一个操作系统。

它做了操作系统应该做的所有事情:

  • 它通过不让用户覆盖操作系统本身来管理内存。
  • 它调度要运行的单个进程。
  • 它处理对单个串行外设的 I/O。

这为您提供了一个可以开始的基本框架。你现在有很多选择。也许其中之一是允许将两个程序加载到内存中,并让用户决定下一个运行哪个程序。

Or you could let the user suspend execution of one program, switch to the other, suspend, and switch back. This is rudimentary multitasking, even though it's entirely manual.

Your choices are unlimited but each one is a baby step from what you had before.

如果你不把你的目标定得太高,那会很有趣的!

关于低级图形编程,这将为您提供大量信息: http://www.osdever.net/FreeVGA/home.htm。(文本模式也很有趣。)

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

You will realize that on PC there's an awful lot of stuff that is unclear: the x86 instruction set itself is complicated, and when you get direct access to hardware, it can take quite a while before you understand how to write a single character on screen.

不要担心软盘之类的东西,大多数时候您将使用一个仿真器,比如 Bochs 或 QEmu。

尝试阅读一个小型的、基本的开源操作系统的代码,比如 MikeOS。

或者,我建议采取以下步骤(应该很有趣!) :

  1. 编写一个虚拟机。定义所有的处理器指令,以便您了解系统的内部和外部。接口它与 SDL 的键盘,鼠标,屏幕,音频访问。让它保持简单,这样你就可以一次性把所有的事情都记在脑子里。它不需要是最先进的虚拟机,只需要能够模拟“真正的”计算机的功能。
  2. 为虚拟机的处理器编写一个汇编程序。请记住,这个汇编程序不一定是用虚拟机语言编写的程序,而是任何可以将汇编语言转换为机器代码的程序。
  3. 定义一个可执行格式,并编写一个简单的链接器。
  4. 现在你已经拥有了编写操作系统的所有部分!用汇编语言写,汇编... 等等。.你不需要这么复杂的引导过程,只需要让你的机器先运行你的操作系统。

对于编写一个简单的操作系统来说,上面的步骤可能看起来有点愚蠢,但是,嘿,它非常有趣。

这很简单,因为 BIOS 已经内置了很多输入/输出功能,可以用来改变屏幕模式、改变像素颜色、将文本写入屏幕等等。但是,它不包括对文件系统的支持,这是您必须在操作系统中包含的极少数内容之一。

BIOS 加载硬盘上的第一个扇区并从那里开始执行代码,因此必须将操作系统与硬盘上第一个扇区中的第一条指令放在一起。

这篇维基百科文章应该让你开始 BIOS 中断写文本到屏幕上,接收键盘键和其他东西。 Https://en.wikipedia.org/wiki/bios_interrupt_call

即使您计划使用 c + + ,我也强烈建议您阅读汇编编程,因为了解硬件是如何工作的至关重要。