操作系统是如何“制作”的?

48
创建一个操作系统似乎是一个庞大的项目。那么,任何人如何开始呢?例如,当我将Ubuntu放入驱动器中时,我的计算机如何运行它?(我想这真的是我最想知道的)。或者,从另一个角度来看,仅有多少字节的磁盘才能作为“运行”作为操作系统?对不起,如果这很模糊。我对这个主题一无所知,所以我不能非常具体。我假装对计算机的工作原理知道很多,但对这个主题却完全没有头绪。

4
抱歉,您的第一个问题好像被删除了。我刚写完一个很长的答案,结果在提交时出现了“此问题不存在”的页面,而我又无法返回并恢复旧文本 :(。 - TravisO
5
这就是为什么我从不直接在浏览器页面中进行作曲。据说Opera通过缓存用户输入已经解决了这个问题。 - Chris Noe
@TravisO:这是你要找的答案:http://pastebin.com/m517b4eb9。 - Christian C. Salvadó
4
上次我检查时是通过编写代码实现的。 - NotMe
2
TravisO,我们都感同身受。http://www.ericsink.com/entries/TellYourGeekStory.html - icelava
投票关闭,原因是问题过于宽泛。类似的问题:https://dev59.com/wXVC5IYBdhLWcg3w-WSs?lq=1 - Ciro Santilli OurBigBook.com
25个回答

37

那么,答案就在书中:现代操作系统 - 安德鲁·S·塔能鲍姆是一本非常好的书。下面是封面插图。

最简单但完整的操作系统内核,适合学习或仅出于好奇,是Minix
这里可以浏览源代码

现代操作系统
(来源:cs.vu.nl)


8
光是为了那些双关语,看这张图片就值得了。我很想去看一个有僵尸和餐桌哲学家的马戏团。 - new123456
2
我觉得这张图片里有几个值得鼓掌的地方。非常感谢!这让我的一天都变得美好了!=D - gideon

19

操作系统是一个庞大的话题,如果您想深入了解操作系统的设计和构建方式,我可以推荐一本好书:

操作系统概念

操作系统概念


4
我想我可能在大学时使用过那本书。但是那个版本比现在的旧,上面没有恐龙的图案。 - Alex Baranosky
我也使用了第七版。虽然我喜欢恐龙使用iPod和其他手持电脑,但我认为我更喜欢这个版本的封面 :) - Will Mc
@Will:是的,所有封面上的艺术作品都非常酷,http://codex.cs.yale.edu/avi/os-book/os8/covers-dir/index.html - Christian C. Salvadó
我花了太长时间才能毕业。我使用了第六版,但仍在学校里... - Adam Peck
@compie:谢谢,已经更换了链接和书籍封面的URL。 - Christian C. Salvadó
显示剩余4条评论

12
如果您真的想了解更多,我建议您前往Linux from Scratch,这是一个很好的学习操作系统及其所有组件如何配合运作的地方。如果那里提供的信息太多了,您也可以从维基百科上关于操作系统的文章开始了解。请注意保留原有的 HTML 标签格式。

Linux from Scratch实际上只是一种将各种软件拼凑在一起形成“元”操作系统的方法,它并不教授有关操作系统基础知识的内容,例如任务调度、引导、内存管理等等——所有的计算机科学相关的东西... - Astra
Linux from Scratch不是一个“元”操作系统 - 你确定你熟悉它吗? - Andrew Hare
1
LFS是学习Linux的好工具。但仅限于Linux。我认为你无法通过这种高级工具学习“完整的操作系统内部知识”。所谓高级,是指“远离硬件”。我知道,我曾在虚拟机上尝试过。 - Marcelo MD

11

一台计算机知道在磁盘的特定扇区查找启动指令。然后这些指令将告诉处理器,在给定的处理器中断时,调用特定的代码。例如,定时器触发时调用调度程序代码。当我从设备中获得某些东西时,则调用设备驱动程序代码。

那么操作系统如何设置系统中的所有内容?硬件也有API。它们是为系统程序员编写的。

我已经看过很多裸机操作系统,这确实是绝对的核心。许多嵌入式自制操作系统只是执行这些基本功能,没有其他功能。

其他功能,例如要求应用程序向操作系统请求内存,或需要特殊权限来执行某些操作,甚至进程和线程本身都是可选的,尽管它们在大多数PC架构上被实现。


10

操作系统,简单地说,就是赋予软件管理硬件的工具。显然,一些操作系统比其他操作系统更为复杂。

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

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

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

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

但对于资源受限的简单系统,您实际上并不需要太多的“操作系统”。

例如,许多小型控制器计算机具有非常小的“操作系统”,有些可能只被认为是一个“监视器”,提供的功能仅仅是方便访问串行端口(或终端或LCD显示)。在这种情况下,显然没有太多需要使用大型操作系统的需求。

还要考虑一些像经典Forth系统这样的东西。在这里,您拥有一个具有“操作系统”的系统,它为您提供磁盘I / O,控制台I / O,内存管理以及实际的编程语言以及汇编器,并且这适用于8位机器上少于8K的内存。

或者早期的带有BIOS和BDOS的CP/M时代。

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

与现代操作系统使用的MB级内存相比,这相差甚远。但是,公平地说,我们现在有了MB级内存,我们的生活变得更加简单(大多数情况下),并且功能更加完善。

编写操作系统很有趣,因为让硬件打印“Hello World”或将数据一次一个字节地推送到某些晦涩的I/O端口,或者将其放入一些神奇的内存地址中,这些都很有趣。

使用x86模拟器,编写引导扇区并让其显示你的名字,这将是一个令人愉快的体验。


4

基本上...你的电脑可以运行光盘是因为:

BIOS在启动顺序中包括了该光盘设备。

在启动时,BIOS按照顺序扫描所有可引导设备(如软盘驱动器、硬盘和CD-ROM)。每个设备都访问其介质并检查一个硬编码位置(通常是磁盘或CD设备上的扇区),以识别介质,并列出跳转到磁盘(或介质)上指令开始的位置。 BIOS告诉设备将它的磁头(或其他部件)移动到介质的指定位置,并读取一大块指令。 BIOS将这些指令交给CPU。

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

通常,操作系统会首先从CPU直接获取一大块内存(因为像“GlobalAlloc”等库命令由尚未加载的操作系统提供),并开始为操作系统自身创建结构。

操作系统为应用程序提供一堆“功能”:内存管理,文件系统,输入/输出,任务调度,网络,图形管理,对打印机的访问等等。在您“接管”之前,它正在创建/启动所有服务,以便稍后的应用程序可以一起运行,不会彼此覆盖内存,并拥有一个良好的API来访问操作系统提供的服务。

操作系统提供的每个“功能”都是一个大主题。操作系统提供它们,因此应用程序只需要担心调用正确的操作系统库,而操作系统则管理像两个程序同时尝试打印的情况。

例如,如果没有操作系统,则每个应用程序都必须处理另一个程序正在尝试打印的情况,然后“做些什么”,例如打印或取消其他作业等。相反,只有操作系统需要处理这个问题,应用程序只需告诉操作系统“打印这些内容”,操作系统确保一个应用程序打印,而所有其他应用程序只需等待第一个完成或用户取消它。

成为操作系统所需的最少字节其实没有意义,因为“操作系统”可能意味着许多或很少的功能。如果您只想从CD中执行一个程序,那将是非常少的字节。然而,那不是操作系统的定义。操作系统的工作是提供服务(我称其为功能),以允许许多其他程序运行,并管理访问这些服务的程序。这很难,添加共享资源(网络、无线网络、CD刻录机、游戏杆、iSight视频、双显示器等等)会使它变得更加困难。


3

这里可能是你正在寻找的内容。 这里也可以。


请注意,以上链接为英文维基百科,需要使用翻译工具将页面转换为中文。

3

我看到的最近一个备受重视的操作系统项目是微软研究项目Singularity,它完全使用C#.NET从头开始编写。

为了让你了解需要多少工作量,有2个核心开发人员,但他们每次会有多达十几个实习生,但仍然需要两年时间才能将操作系统引导并显示BMP图像(这是他们用于演示的方式)。在他们甚至能够获得类似命令行的东西之前,需要更多的工作(大约4年)。


.NET Micro Framework是一个完整的操作系统,也是由微软研究部门开发出来的。 - ctacke
1
Singularity并不完全是用C#或.NET编写的,而是大部分。 - Lawand
COSMOS也是一种用C#编写的操作系统。 - Mehrdad Afshari

2
基本上,有很多关于什么是操作系统的争论。如果你让每个人都达成一致意见,关于操作系统具体是什么(它只是内核吗?在内核模式下运行的所有内容?Shell是否是操作系统的一部分?X是否是操作系统的一部分?Web浏览器是否是操作系统的一部分?),那么你的问题就得到了回答!否则,你的问题没有具体答案。

2
哦,这是一个有趣的话题。我曾经在某个时候完成了整个过程,并参与了其中的大部分演变。
一般来说,开始编写新操作系统时要从小处着手。最简单的是引导加载程序,它是一小段代码,可以拉取一块代码并运行它。曾经,在Nova或PDP计算机上,您可以通过前面板输入引导加载程序:您逐个十六进制数字输入指令。然后,引导加载程序会将某些介质读入内存,并将程序计数器设置为该代码的起始地址。
那段代码通常会加载其他东西,但不必如此:您可以编写一个旨在在裸机上运行的程序。这种类型的程序自己就能做一些有用的事情。
真正的操作系统更大,有更多的组成部分。您需要加载程序,将它们放入内存并运行它们;您需要提供运行IO设备的代码;随着操作系统变得更大,您需要管理内存。
如果你真想了解它是如何工作的,可以找到Doug Comer的Xinu书籍和Andy Tannenbaum的最新操作系统书籍Minix。

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