如何在旧台式电脑上构建一个小型操作系统?涉及IT技术。

116

我知道写一个操作系统非常复杂,尤其是一个人。

  • 我不指望能建立下一个Linux或Windows。

  • 我知道它会很糟糕、很多错误,并且无法正常工作,但这没关系。

我想用AssemblyC和(一些)C++自己编写所有东西。

这是一个未来的项目,因为我现在忙于其他事情,没有立即的时间,但我想我现在就问一下,这样也许我可以得到很多答案,它可以积累起来成为这种方法的一个有用的资源(我所看到的其他所有内容都涉及构建minix,使用现有的引导程序,或在虚拟启动程序中构建,等等)。

我想用一个旧的桌面计算机配上显示器、键盘和鼠标开始工作,在一个空白的硬盘上。

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

  • 我如何将代码放入计算机?最好用软盘吗?大多数计算机可以使用USB驱动器吗?

  • 我需要哪些驱动程序,并且您能推荐建立这些驱动程序的参考资料吗?

  • 引导程序之后-然后呢?我如何进入保护模式等等。

  • 如何在没有操作系统的情况下管理内存?我只需使用任何我想要的地址吗?不需要初始化吗?

  • 我肯定会遇到什么困扰我迷惑的问题?

  • 如何使它成为命令行操作系统和图形化操作系统?

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

  • 在哪里可以阅读有关设置多任务环境的资料?(例如,同时运行两个类似图形化的命令行)

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

  • 相信我,我知道这是个非常复杂的项目,而且我可能永远都不会完成它或写出任何有用的东西。

    还有许多其他方面我没有提到,如果你想到了什么,请随意添加。

    请每个答案只回答一个主题,例如USB驱动程序,然后列出资源、注意事项等。

    另外,请不要建议建立在其他操作系统或现有代码的基础上。我知道我会阅读很多现有的代码(例如Linux内核、示例资源、现有的驱动程序等),但最终我想自己编写所有内容。我知道我应该建立在别的东西的基础上,而且也有许多其他关于这方面的问题,如果我改变主意并采用那种方法,我可以阅读这些问题。但是这个问题是关于从零开始完成整个项目的。

    有没有关于如何获得图形化界面的建议?不同的视频模式以及如何使用它们等等?


    14
    这是我最大的目标。我非常想编写一个操作系统,只是为了好玩和学习……但过去几年里我一直没有时间。如果你需要帮忙或者只是想与我讨论一些问题,你可以通过 schmeling88@gmail.com 给我发邮件。 - Max Schmeling
    2
    @Max和@Tom,我也遇到了这个bug。我现在正准备开始这个项目 :) - Giovanni Galbo
    2
    现在先不要考虑图形。Unix从未直接支持图形,这并不是什么坏事。:-)但基本上没有简单且可移植的方法来超越800x600,如果我没记错的话。 - Bastien Léonard
    2
    投票关闭,原因是问题过于宽泛。类似于:https://dev59.com/6HVC5IYBdhLWcg3wjx5d || http://stackoverflow.com/questions/2800741/how-to-create-your-own-x86-operating-system-for-modern-pc-computers?rq=1 - Ciro Santilli OurBigBook.com
    1
    为什么?这个问题已经古老了,不再产生任何活动。谁在乎呢? - Carson Myers
    相关问答:通用引导程序开发技巧 / 如何为我的引导程序制作内核? 具有在传统BIOS模式下启动的x86 PC的工作Hello World内核(不是UEFI),具有切换到32位保护模式并运行C内核的引导程序。 - Peter Cordes
    20个回答

    6
    你有一个宏伟的目标,但是执行才是关键。大多数结构化方法(教科书或大学课程)会带你走过整个过程,但是它们提供了很多琐碎的代码,掩盖了你选择的平台的奥妙细节,并让你专注于大局观念:进程调度、内存管理、死锁预防、输入/输出等等。
    我的建议是:降低期望值,从一个基本问题开始。什么是操作系统?
    计算机科学家不会(希望如此)说操作系统是图形用户界面、Web浏览器、USB设备连接方式或任何用户可以看到或触摸的东西。相反,在其最基本的层次上,操作系统是我上面提到的那些东西,它们都属于一个大的范畴:资源管理。
    操作系统只是一个管理计算机硬件资源的程序:内存、CPU和外围设备。
    这里有一个简单的操作系统:一个程序允许用户使用串行连接键入程序(十六进制或二进制)。一旦程序被键入,它就运行该程序。当程序完成时,控制权返回给用户,他们可以再次运行该程序或键入新程序。
    在一个“干净”的体系结构上实现这一点,例如具有64K内存的嵌入式ARM处理器。你可以在学习了ARM的各种细节之后,用汇编语言编写这个程序。然后,你就有了一个操作系统。
    它做到了操作系统应该做的一切:
    - 通过不允许用户覆盖操作系统本身来管理内存。 - 它调度单个进程运行。 - 它处理单个串行外围设备的I/O。
    这给了你一个起点。现在你有很多选择。也许其中之一是允许将两个程序加载到内存中,并让用户决定下一个要运行哪个。
    或者你可以让用户暂停执行一个程序,切换到另一个程序,暂停,然后切换回来。虽然完全是手动的,但这是原始的多任务处理。
    你的选择是无限的,但每一个都是从以前的一步一步迈出的。如果你不把目标定得太高,这是很有趣的!

    6
    请查看MikeOS。它是用易于阅读(注释)的汇编语言编写的相对简单的操作系统。尽管它很简单,但它具有GUI并支持一些网络和多媒体功能。 编辑MenuetOS 是图形化的。它也是用直接的汇编语言编写的,但比MikeOS更为复杂。

    5

    我在StackOverflow上维护了一个资源列表:如何开始操作系统开发。请在您开始冒险时向其中添加新的资源(我即将开始:))。


    4

    许多学校都有操作系统课程,其中包括您描述的大部分内容。我的学校(CMU)用C语言教授操作系统,并且我们编写了内核、文件系统和shell,并提供了引导加载程序的代码。

    不幸的是,我无法在网上找到关于这门课程(15-412)的权威资源,它已随时间发展而演变。但或许人们可以发布链接到那些在网上有良好资源和作业的学校。


    3
    您可以考虑查看《操作系统概念》(作者:Abraham Silberschatz),了解系统编程概念是一项基本要求,深入了解开源操作系统内核(如Linux *BSD和GNU / Linux),特别是早期版本,这些版本可能有更多的文档记录。请参见以下链接:http://www.amazon.co.uk/Operating-System-Concepts-Abraham-Silberschatz/dp/0470233990http://www.amazon.co.uk/Understanding-Linux-Kernel-Daniel-Bovet/dp/0596002130。此外,您还可以通过下面的图片链接深入了解操作系统的内部机制。alt textalt text

    1
    Silbershatz真的非常好,但是非常高级。 - Paul Nathan
    同意;不过,我认为这是根本必要的。文档与 Tanenbaum 的《现代操作系统》(前面提到过)同样重要。 - amaterasu

    3
    关于低级别的图形编程,这里会提供给你很多信息:http://www.osdever.net/FreeVGA/home.htm。(对文本模式也非常有趣。)
    你可能会意识到在PC上有很多让人困惑的东西:x86指令集本身就很复杂,在直接访问硬件时,了解如何在屏幕上写一个字符可能需要相当长的时间。
    不要担心软盘等问题,大部分情况下你会使用类似Bochs或QEmu的仿真器。

    3

    你可能会喜欢this教程,名为“打造你自己的玩具UNIX克隆操作系统”,非常有见地,应该对你有所帮助。

    祝你好运。


    1
    虽然有这样一份深入的教程是很棒的,但其中存在许多初学者经常遇到的错误。只有当你愿意同时打开Intel手册并且思考你正在做什么(即不要复制和粘贴!)时,这个教程才是伟大的。 - Matthew Iselin

    3

    学习A2系统(前身为Oberon系统),获取你可以借鉴的想法。这是一个由两个人构建的图形化操作系统,尽管其中一位是Niklaus Wirth。它于1990年首次发布,速度惊人地快。Gutknecht写了一本书。


    2
    看看Minix。结合《操作系统设计与实现》学习源代码。考虑为该项目做出贡献。我认为Minix是一个非常好的、有前途的操作系统正在开发中。这也是一个资金充足的项目。这意味着,你甚至可以得到报酬来奖励你的贡献!

    1
    感谢BIOS已经内置了许多输入/输出功能,例如更改屏幕模式、更改像素颜色、将文本写入屏幕等等,使得操作变得非常容易。但是,它不包括文件系统支持,这是你必须在操作系统中加入的极少数要素之一。
    BIOS加载硬盘上的第一个扇区并从那里开始执行代码,因此你的操作系统必须放置在硬盘的第一个扇区中的第一条指令处。
    即使你计划使用C ++,我强烈建议你阅读有关汇编程序设计的资料,因为这对于理解硬件工作至关重要。
    此维基百科文章应该可以帮助你开始使用BIOS中断来将文本写入屏幕、从键盘接收键等。 https://en.wikipedia.org/wiki/BIOS_interrupt_call

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接