操作系统如何“制造”?

时间:2008-12-31 18:43:43

标签: operating-system low-level osdev

创建操作系统似乎是一个大规模项目。怎么会有人开始?

例如,当我将Ubuntu弹出到我的驱动器中时,我的计算机如何运行呢? (我想,这是我真正想知道的。)

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

(如果这很模糊,我很抱歉。我只是不知道关于这个主题,所以我不能非常具体。我假装知道有关计算机如何工作的相当数量,但我对这个问题完全不了解。)

25 个答案:

答案 0 :(得分:36)

嗯,答案存在于书中: Modern Operating Systems - Andrew S. Tanenbaum 非常好。下面的封面插图。

最简单但完整的操作系统内核,适合学习或只是好奇心, Minix
Here您可以浏览source code

Modern Operating Systems
(来源:cs.vu.nl

答案 1 :(得分:18)

操作系统是一个很大的话题,如果你想真正深入了解操作系统的设计和构建方法,我可以推荐你这是一本好书:

Operating System Concepts

Operating System Concepts

答案 2 :(得分:12)

如果你真的很好奇,我会指导你Linux from Scratch作为一个学习操作系统完整细节以及所有部分如何组合在一起的好地方。如果这比您正在寻找的信息更多,那么在操作系统上this Wikipedia article可能是一个很好的起点。

答案 3 :(得分:11)

PC知道要查看磁盘的特定扇区以获取启动指令。然后,这些指令将告诉处理器在给定处理器中断时,将调用特定代码。例如,在定期打勾时,调用调度程序代码。当我从设备获取内容时,请调用设备驱动程序代码。

现在操作系统如何使用系统设置所有内容?硬件硬件也有API。它们是在考虑系统程序员的情况下编写的。

我见过很多裸机操作系统,这真的是绝对的核心。有许多嵌入式本土操作系统,他们所做的一切都没有。

其他功能,例如要求应用程序向操作系统询问内存,或者需要特定操作的特权,甚至是进程和线程本身,虽然在大多数PC架构上实现,但实际上是可选的。

答案 4 :(得分:9)

操作系统简直就是使您的软件能够管理硬件的功能。显然,一些操作系统比其他操作系统更复杂。

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

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

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

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

但是对于一个简单的系统,使用受限资源,你并不需要为“操作系统”提供很多东西。

作为一个简单的例子,许多小型控制器计算机具有非常小的“操作系统”,有些可能只是被视为“监视器”,提供的只是轻松访问串行端口(或终端或LCD显示器) 。当然,在这些条件下对大型操作系统的需求并不大。

但也要考虑类似经典的Forth系统。在这里,你有一个带有“操作系统”的系统,它为你提供磁盘I / O,控制台I / O,内存管理,以及实际的编程语言和汇编程序,这适用于少于8K的内存。 8位机器。

或CP / M的旧时代及其BIOS和BDOS。

CP / M是一个很好的例子,说明一个简单的操作系统可以作为一个抽象层,允许便携式程序在大量硬件上运行,但即使这样,系统也需要不到8K的RAM来启动和运行

与现代操作系统使用的内存MB相差甚远。但是,公平地说,我们拥有MB的记忆,而且我们的生活更加简单(大部分),而且功能更强大,因为它。

编写操作系统很有趣,因为有趣的是让HARDWARE打印“Hello World”一次将数据推送到一些不明显的I / O端口,或将其填入某个魔术存储器地址。

获取一个x86模拟器并开始派对引导部门说出你的名字。这是一种傻笑。

答案 5 :(得分:4)

基本上......您的计算机可以运行磁盘,因为:

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

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

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

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

操作系统为应用程序提供了许多“功能”:内存管理,文件系统,输入/输出,任务调度,网络,图形管理,打印机访问等。这就是你在“控制”之前所做的事情:创建/启动所有服务,以便以后应用程序可以一起运行,而不是踩在彼此的内存上,并为操作系统提供的服务提供了一个很好的API。

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

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

作为操作系统的最少字节数并不真正有意义,因为“操作系统”可能意味着很多或很少的功能。如果你想要的只是从CD执行一个程序,那将是非常少的字节。但是,那不是操作系统。操作系统的工作是提供服务(我一直称之为功能)以允许运行许多其他程序,并管理对程序的这些服务的访问。这很难,你添加的共享资源越多(网络,wifi,CD刻录机,操纵杆,iSight视频,双显示器等等)就越难。

答案 6 :(得分:3)

答案 7 :(得分:3)

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

要想知道需要多少工作,有两个核心开发者,但他们在任何给定的时间都有多达十几个实习生,而且他们还需要两年时间才能让操作系统达到一定程度会启动并显示BMP图像(这是他们用来做演示的方式)。在他们甚至可以达到有命令行的地方(比如大约4年)之前,还需要做更多的工作。

答案 8 :(得分:2)

我无法相信这一点没有被提及......但是一本关于操作系统设计概述的经典书籍是Operating Systems - Design and Implementation由MINIX的创建者Andrew S Tanenbaum撰写。本书中的很多例子也直接面向MINIX。

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

答案 9 :(得分:2)

您可能希望获得 FreeBSD操作系统的设计和实现这本书,以获得非常详细的答案。你可以从亚马逊获得它,或者这个链接到FreeBSD.org的网站看起来像我记得的那本书:link text

答案 10 :(得分:2)

基本上,关于OS实际上的内容有很多争论。如果大家都同意操作系统的具体内容(它只是内核吗?在内核模式下运行的一切?是操作系统的外壳部分?是操作系统的X部分?是Web浏览器是操作系统的一部分吗?),你的问题得到了解答!否则,你的问题没有具体的答案。

答案 11 :(得分:1)

尝试How Computers Boot UpThe Kernel Boot Process和其他相关文章from the same blog,了解计算机启动时所做的简短概述

当计算机的启动严重依赖(可能很明显?)the CPU design和其他“低级别的东西”时,它的作用是什么?因此,很难预测你的计算机在启动时的作用。

答案 12 :(得分:1)

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

一般来说,你从小开始开始编写新的操作系统。最简单的事情是一个bootstrap加载器,它是一小块代码,它可以提取大量代码并运行它。曾几何时,使用Nova或PDP计算机,您可以通过前面板进入引导程序加载程序:您输入十六进制数字指令十六进制数。引导加载程序将某些介质读入内存,并将程序计数器设置为该代码的起始地址。

这段代码通常会加载其他东西,但它不需要:你可以编写一个程序,它意味着在裸机上运行。这种程序本身就有用。

真正的操作系统更大,并且有更多的碎片。你需要加载程序,把它们放在内存中,然后运行它们;您需要提供运行IO设备的代码;随着它变大,你需要管理记忆。

如果您想真正了解其工作原理,请在Doug Comer's Xinu books上找到Tannenbaum和Andy Minix的最新操作系统手册。

答案 13 :(得分:1)

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

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

如今......同样的原则,但硬件越来越复杂; - )

答案 14 :(得分:0)

您可能需要查看this question

答案 15 :(得分:0)

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

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

How to get started in operating system development

答案 16 :(得分:0)

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

如果你想要了解更多关于这一点的信息,我会推荐阅读一本关于微控制器的内容......尤其是那些用80或类似内容在c中创建小型操作系统的内容......或者学习一些x86程序集并创建一个非常小的“bootloader OS”。

答案 17 :(得分:0)

您问您可以将多少字节放在磁盘上并仍然作为操作系统运行?答案取决于您对操作系统的期望,但我所知道的最小有用的操作系统适合1.7兆字节。它是Tom's Root Boot磁盘,如果小型操作系统具有适合一张软盘的“救援”应用程序,这是一个非常好的。回到每台机器都有软驱而不是每台机器都有CD-ROM驱动器的日子里,我经常使用它。

答案 18 :(得分:0)

我认为它就像你自己的生活。首先,你知道的很少 - 只是足够相处。这类似于BIOS提供的内容 - 它足够了解磁盘驱动器并从中读取信息。然后,当你上小学时,你会学到更多东西。这就像引导扇区被读入内存并被赋予控制权。然后你去高中,这就像操作系统内核加载。然后你上大学(司机和其他申请。)当然,这是你有责任CRASH的。他是。

底线是越来越多的功能层被缓慢加载。操作系统没有什么神奇之处。

答案 19 :(得分:0)

通过这里阅读将了解创建Linux所需的内容 https://netfiles.uiuc.edu/rhasan/linux/

答案 20 :(得分:0)

适用于一个磁盘的另一个非常小的操作系统是QNX(我很久以前看过它,整个操作系统,带有GUI界面,网络浏览器,磁盘访问和内置的Web服务器,适合一个软驱)。

从那时起我就没有听过太多关于它的内容,但它是一个实时操作系统,因此设计得非常快。

答案 21 :(得分:0)

实际上,有些人访问了一所4年制的大学,对此有了一个大致的想法..

答案 22 :(得分:0)

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

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

答案 23 :(得分:0)

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

Modern OS - 这给出了关于一般操作系统的想法。

Start of OS - 这提供了MAKE OS真正需要的基础知识,我们如何制作它以及如何自己修改现有的操作系​​统开源代码。

Wiki OS - 了解不同领域中使用的不同Os及其用途(操作系统的对象/功能)。

让我们一般性地了解操作系统包含(不是complexLinux或Windows)

操作系统需要CPU并在其中转储代码,您需要bootloader。 操作系统必须具有满足的目标,并且必须在称为Kernel的包装器中定义这些目标 你可以在里面scheduling timeISR's (取决于你需要制作的目标和操作系统)

答案 24 :(得分:0)

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

我也忍不住在youtube上引用“编写你自己的操作系统”视频系列,因为我是那个人: - )

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