操作系统如何“制造”?

创build一个OS似乎是一个巨大的项目。 怎么会有人开始呢?

例如,当我将Ubuntupopup到我的驱动器中时,我的电脑如何才能运行它? (我猜这是我真正想知道的。)

或者,从另一个angular度来看,磁盘上可能存在的最小字节数量仍然是“运行”的操作系统?

(对于这个问题,我很遗憾,我对这个问题一无所知,所以我不能说得很具体,我假装知道计算机是如何工作的,但是我对这个问题却一无所知。 )

那么,答案就在书中: 现代操作系统 – Andrew S. Tanenbaum是一个很好的例子 。 下面的封面插图。

Minix是适用于学习或者只是好奇的最简单但完整的操作系统内核。
在这里你可以浏览源代码 。

现代操作系统~ast/books/mos2/big_cover.jpg

操作系统是一个巨大的话题,如果你想深入了解操作系统是如何devise和构build的,这是一本好书,我可以向你推荐最好的东西:

操作系统概念

操作系统概念

如果你真的好奇,我会指导你从头开始学习Linux,作为一个学习操作系统完整知识的好地方,以及如何把所有的东西放在一起。 如果这是更多的信息比你正在寻找那么这个维基百科关于操作系统的文章可能是一个很好的开始。

PC知道要查看磁盘的特定扇区以获得启动指令。 这些指令会告诉处理器,在给定的处理器中断时,将调用特定的代码。 例如,在周期性的时间点上,调用调度程序代码。 当我从设备中获取某些东西时,请调用设备驱动程序代码。

现在操作系统如何设置系统的一切? 那么硬件的API也有。 他们是与系统程序员一起写的。

我已经看到了很多纯粹的操作系统,这真的是绝对的核心。 有许多embedded式的本土操作系统,这是他们所做的,没有别的。

其他function,例如要求应用程序询问操作系统的内存,还是需要某些操作的特殊权限,甚至是进程和线程本身,实际上都是可选的,尽pipe在大多数PC体系结构上都实现了这些function。

操作系统简而言之就是让您的软件能够pipe理硬件。 显然有些操作系统比其他操作系统更复杂。

计算机的核心是开始在一个固定的地址执行,这意味着当计算机启动时,它将程序计数器设置为一个预定义的地址,并开始执行机器代码。

在大多数计算机中,这个“引导”过程立即初始化已知的外围设备(如磁盘驱动器)。 一旦初始化,引导进程将使用一些预定义的序列来利用这些外设。 再次使用磁盘驱动程序,该进程可能会从硬盘驱动器的第一个扇区读取代码,将其放在RAM中的一个已知空间中,然后跳转到该地址。

这些预定义的顺序(CPU的启动,磁盘的加载)允许程序员在CPU启动的早期部分添加越来越多的代码,随着时间的推移最终可以启动非常复杂的程序。

在现代世界中,操作系统通过复杂的外设,先进的CPU架构和庞大的资源(GB或RAM,磁盘TB,以及非常快的CPU),可以为开发人员提供相当强大的抽象(多进程,虚拟内存,可加载的驱动程序等)。

但是对于一个简单的系统来说,在资源有限的情况下,对于一个“操作系统”你并不需要太多的工作。

举一个简单的例子,许多小型控制器计算机具有非常小的“操作系统”,有些可能简单地被认为是“监视器”,提供的不仅仅是方便地访问串行端口(或terminal或LCD显示器)。 当然,在这种情况下,大型操作系统的需求并不是很多。

但也要考虑一些经典的Forth系统。 在这里,你有一个带有“OS”的系统,它给你磁盘I / O,控制台I / O,内存pipe理,加上实际的编程语言以及汇编程序,而且这个function适用于小于8K的内存8位机器。

或者使用其BIOS和BDOS的CP / M的旧日。

CP / M是一个很好的例子,简单的操作系统可以很好地作为一个抽象层,使得可移植程序可以在大量的硬件上运行,但是即使这样,系统也只用了不到8K的RAM来启动和运行。

与现代操作系统使用的内存大小相差甚远。 但是,公平地说,我们拥有MB的记忆力,而且我们的生活要简单得多(大部分),而且function也要多得多。

编写一个操作系统很有趣,因为有趣的做法是让硬件打印“Hello World”每次将数据从一个不明显的I / O端口中逐出1个字节,或者将其填充到某个魔术内存地址中。

获取一个x86模拟器,并开始派对来说出你的名字。 这是一个吉祥的款待。

基本上…你的电脑可以运行磁盘,因为:

BIOS包含引导顺序中的该磁盘设备。

在启动时,BIOS按顺序扫描所有可启动设备,如软盘驱动器,硬盘驱动器和CD ROM。 每个设备访问其媒体并检查硬编码的位置(通常是磁盘或光盘设备上的某个扇区),以find标识该媒体的指纹,并列出要在指令启动的磁盘(或介质)上跳转到的位置。 BIOS告诉设备将其头(或其他)移动到介质上的指定位置,并阅读大量指令。 BIOS将这些指令交给CPU。

CPU执行这些指令。 在你的情况下,这些指令将启动Ubuntu操作系统。 他们也可以指示停止,或者加10 + 20等。

通常情况下,一个操作系统将开始通过占用大量的内存(同样,直接从CPU,因为像'GlobalAlloc'等库命令不可用,因为它们是由尚未加载的操作系统提供)并开始为操作系统本身创build结构。

操作系统为应用程序提供了一系列“function”:内存pipe理,文件系统,input/输出,任务调度,networking连接,graphicspipe理,打印机访问等等。 这就是在你获得控制权之前所做的事情:创build/启动所有的服务,以便以后的应用程序可以一起运行,不会压在彼此的内存上,并且对操作系统提供的服务有一个很好的API。

操作系统提供的每个“function”都是一个很大的话题。 操作系统提供了所有的应用程序,所以应用程序只需要担心调用正确的操作系统库,操作系统pipe理的情况下,如果两个程序试图同时打印。

例如,没有操作系统,每个应用程序将不得不处理另一个程序正在尝试打印的情况,并且“做某些事情”像打印,或者取消其他工作等。相反,只有操作系统必须处理它应用程序只是说,操作系统“打印这东西”和操作系统确保一个应用程序打印,所有其他应用程序只需要等到第一个完成或用户取消它。

作为操作系统的字节数量最less并不合理,因为“操作系统”可能意味着很多或很less的function。 如果你只想从CD执行一个程序,这将是非常非常less的字节。 但是,这不是一个操作系统。 操作系统的工作是提供服务(我一直称之为function),以允许运行许多其他程序,并pipe理对这些程序服务的访问。 这很难,你添加更多的共享资源(networking,wifi和CD刻录机,游戏杆,iSightvideo和双显示器等)就更难了。

我见过的最近的操作系统项目之一是一个名为Singularity的MS Research项目,它从头开始完全用C#.NET编写。

要想知道需要多less工作,有两个核心开发者,但是他们在任何时候都有多达十几名实习生,而且还需要两年的时间才能让操作系统达到启动的阶段显示BMP图像(这是他们如何使用他们的演示文稿)。 在他们甚至可以到达有命令行的地方(比如大约4年)之前,花了更多的工作。

基本上,关于操作系统实际上有很多争论的。 如果你让所有人都同意了操作系统的具体内容(它只是内核吗?在内核模式下运行的所有东西都是操作系统的shell部分?是操作系统的X部分?Web浏览器是操作系统的一部分?),你的问题回答! 否则,你的问题没有具体的答案。

您可能希望获得FreeBSD操作系统的devise和实现一书非常详细的答案。 你可以从亚马逊网站上获得,或者这个链接到FreeBSD.org的网站,就像我记得的那样: 链接文本

我不敢相信这一点还没有被提及…但是一本关于操作系统devise的经典书籍是由MINIX的创始人Andrew S Tanenbaum编写的操作系统 – devise和实现 。 本书中的很多例子都直接面向MINIX。

如果您想了解更多, OS Dev是一个很好的开始。 特别是维基。 这个网站充满了信息,以及为小型项目/业余爱好编写个人操作系统的开发人员。 这也是一个很好的学习资源,因为OSDev上有很多人在同一个船上,他们想学习操作系统。 你最终也可能自己尝试一下!

操作系统(OS)是控制硬件的软件层。 硬件越简单,操作系统越简单,反之亦然;-)

如果在微型计算机的早期阶段,你可以将操作系统装入一个16K ROM,并硬连接主板,以便在ROM地址空间开始执行机器代码指令。 然后,这个“引导”过程将加载其他设备(如键盘,显示器,软盘驱动器等)的驱动程序的代码,几秒钟之内,您的设备将被启动并准备使用。

现在…相同的原理,但更多和更复杂的硬件;-)

哦,这是一个有趣的。 我已经完成了所有的事情,并经历了很大一部分演变。

一般来说,你从小开始写一个新的操作系统。 最简单的是一个引导加载程序,它是一小段代码,将一段代码引入并运行。 曾几何时,使用Nova或PDP电脑,您可以通过前面板input引导加载程序:通过hex数input指令hex数。 引导装载程序将某些介质读入内存,并将程序计数器设置为该代码的起始地址。

那块平常的代码加载了别的东西,但是它不必:你可以编写一个程序来运行在裸机上。 这种程序本身就是有用的。

一个真正的操作系统更大,并且有更多的部分。 你需要加载程序,把它们放在内存中,然后运行它们。 您需要提供代码来运行IO设备; 随着它越来越大,你需要pipe理内存。

如果你想真正了解它是如何工作的,请查找Doug Comer的Xinu书籍 ,以及Andy Tannenbaum关于Minix的最新操作系统书籍。

尝试“计算机启动方式” , “内核启动过程”以及来自同一博客的其他相关文章,以简要介绍计算机启动时的function。

当计算机的启动严重依赖于CPUdevise和其他“低级别的东西”(可能是显而易见的)的时候,它究竟做了什么? 因此,在启动计算机时,很难预测您的计算机的function。

那么你有什么东西将芯片的启动链接到一个“BIOS”,然后到一个操作系统,这通常是一个非常复杂的任务,由许多代码服务完成。

如果你真的想知道更多关于这个,我会推荐读一本书……关于微型控制器,尤其是一个你创build一个小型操作系统在C为8051或类似的..或学习一些x86汇编,并创build一个非常小的“引导程序操作系统“。

你可能想看看这个问题 。

操作系统是一个程序,就像您编写的任何其他应用程序一样。 这个程序的主要目的是它允许你运行其他程序。 现代操作系统利用现代硬件来确保程序不会相互冲突。

如果您有兴趣编写自己的操作系统,请查看我自己的问题:

如何开始操作系统开发

你问你有多less字节可以放在磁盘上,仍然作为一个操作系统运行 ? 答案取决于你期望的操作系统,但是我知道的最小的有用操作系统适合1.7兆字节。 这是汤姆的根启动磁盘,这是一个非常好的,如果适合在一张软盘上的 “救援”应用程序的小型操作系统。 早在每台机器都有软驱的时代,并不是每台机器都有一个CD-ROM驱动器,我经常使用它。

我认为这就像你自己的生活。 起初,你知道的很less,只是够相处而已。 这与BIOS提供的类似 – 它足够了解磁盘驱动器并从中读取信息。 那么当你上小学的时候你还会学到更多的东西。 这就像引导扇区被读入内存并被赋予控制权。 然后你去高中,这就像操作系统内核加载。 然后你去上大学(司机和其他应用程序) 。当然,这是你有责任的冲突点。 呵呵。

底线是越来越多的能力层缓慢加载。 操作系统没有任何魔力。

通过这里阅读将给你一个想法,以创buildLinux https://netfiles.uiuc.edu/rhasan/linux/

另一个适合于一个磁盘的非常小的操作系统是QNX(当我最后一次查看它时,整个操作系统与GUI界面,networking浏览器,磁盘访问和一个内置的web服务器,适合一个软盘驱动器) 。

从那以后,我没有太多的了解,但它是一个实时的操作系统,所以它的devise非常快。

实际上,有一些人访问了四年制大学,对此有一个粗略的想法。

其核心是操作系统非常简单。 下面是操作系统成功的初学者指南:1.使用调度程序来pipe理CPU,该调度程序决定要调度哪个进程(程序的运行实例)。 2.pipe理内存以决定哪些进程使用它来存储指令(代码)和数据(variables)。 3.pipe理磁盘驱动器,报警器,键盘,鼠标等I / O接口。 现在,超过3个要求需要stream程沟通(而不是打!),与外部世界互动,帮助应用程序做他们想做的事情。 要深入了解它如何做,请阅读恐龙书:)

所以,只要你设法处理所有的硬件资源,你就可以使操作系统尽可能小。 当你启动时,BIOS告诉CPU开始读取bootloader(加载驻留在内存中的固定地址的OS的第一个函数 – 就像小C程序的main())。 然后创buildfunction和stream程,并启动大爆炸!

首先是阅读和阅读,什么是操作系统; 那么不同操作系统的用途/types/性质/目标/需求/是什么? 一些链接如下: 新手将享受这些链接:

现代操作系统 – 这给了一般操作系统的想法。

操作系统的启动 – 这给了我们操作系统真正需要的基础知识,我们如何做到这一点,以及如何自己修改操作系统的开源代码。

Wiki操作系统 – 提供有关不同的操作系统在不同领域的使用和使用(操作系统的对象/function)的想法。

一般来看,操作系统包含了什么(不是精密的Linux或Windows)

操作系统需要一个CPU,并在其中转储代码,你需要一个bootloader 。 操作系统必须有满足的目标,这些目标必须定义在一个叫做Kernel的包装器中。你可以有scheduling timeISR's (取决于你需要做的目标和操作系统)

操作系统发展很复杂。 有一些网站,如osdev或lowlevel.eu(德语)致力于这个话题。 还有一些书,其他人已经提到过。

我也忍不住在YouTube上参考“编写你自己的操作系统”video系列,就像我做的那样:-)

请参阅https://www.youtube.com/playlist?list=PLHh55M_Kq4OApWScZyPl5HhgsTJS9MZ6M