47

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

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

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

(如果这含糊不清,我很抱歉。我这个主题一无所知,所以我不能很具体。我假装对计算机的工作原理有相当多的了解,但我对这个主题一无所知。 )

4

25 回答 25

36

好吧,答案就在书中:现代操作系统- Andrew S. Tanenbaum是一个非常好的操作系统。下面的封面图。

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

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

于 2008-12-31T21:17:07.927 回答
19

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

操作系统概念

操作系统概念

于 2008-12-31T18:52:58.967 回答
12

如果你真的很好奇,我会引导你从 Scratch 到 Linux,这是一个学习操作系统的完整细节以及所有部分如何组合在一起的好地方。如果这比您正在寻找的信息更多,那么这篇关于操作系统的维基百科文章可能是一个不错的起点。

于 2008-12-31T18:50:43.057 回答
11

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

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

我见过很多简单的操作系统,这确实是绝对核心。有许多嵌入式的本土操作系统,这就是他们所做的一切,仅此而已。

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

于 2008-12-31T18:49:44.947 回答
10

简单地说,操作系统就是使您的软件能够管理硬件的东西。显然,有些操作系统比其他操作系统更复杂。

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

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

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

在现代世界中,由于具有复杂的外围设备、先进的 CPU 架构和大量的资源(GB 或 RAM、TB 的磁盘和非常快的 CPU),操作系统可以为开发人员支持非常强大的抽象(多进程、虚拟内存) ,可加载的驱动程序等)。

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

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

但也可以考虑类似经典的 Forth 系统。在这里,您有一个带有“OS”的系统,它为您提供磁盘 I/O、控制台 I/O、内存管理,以及实际的编程语言和一个汇编程序,这适合一个不到 8K 的内存8位机。

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

CP/M 是一个很好的例子,说明简单的操作系统可以作为抽象层很好地工作,允许可移植程序在大量硬件上运行,但即便如此,系统启动和运行所需的 RAM 也不到 8K。

与现代操作系统使用的 MB 内存相去甚远。但是,公平地说,我们有 MB 的内存,因此我们的生活要简单得多(主要是),功能也多得多。

编写操作系统很有趣,因为让硬件打印“Hello World”一次将数据 1 字节推向某个模糊的 I/O 端口,或者将其填充到某个神奇的内存地址是很有趣的。

获得一个 x86 仿真器,然后聚会,让一个引导扇区说出你的名字。这是一种欢快的款待。

于 2008-12-31T19:03:18.897 回答
4

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

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

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

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

通常,操作系统会从占用大量内存开始(同样,直接从 CPU 获取,因为像“GlobalAlloc”等库命令不可用,因为它们是由尚未加载的操作系统提供的) 并开始为操作系统本身创建结构。

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

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

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

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

于 2008-12-31T20:24:09.733 回答
3

http://en.wikipedia.org/wiki/Linux_startup_process你可能正在寻找这个。 http://en.wikipedia.org/wiki/Windows_NT_startup_process或这个。

于 2008-12-31T18:52:37.157 回答
3

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

为了了解这需要多少工作,有 2 名核心开发人员,但他们在任何时候都有多达 12 名实习生,而且他们仍然需要两年时间才能让操作系统达到可以启动和运行的地步显示 BMP 图像(这是他们用来进行演示的方式)。他们甚至需要做更多的工作才能达到有命令行的程度(大约 4 年)。

于 2008-12-31T18:57:56.163 回答
2

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

于 2008-12-31T18:46:18.370 回答
2

哦,这很有趣。我曾经在某一时刻完成了整件事,并且经历了大部分的演变。

通常,您从小处着手编写新的操作系统。最简单的是引导加载程序,它是一小段代码,可以将一大段代码拉入并运行它。曾几何时,使用 Nova 或 PDP 计算机,您可以通过前面板进入引导加载程序:您通过十六进制数字输入指令十六进制数字。引导加载程序将一些介质读入内存,并将程序计数器设置为该代码的起始地址。

那段代码通常会加载其他内容,但它不是必须的:您可以编写一个旨在在裸机上运行的程序。这种程序本身就可以做一些有用的事情。

一个真正的操作系统更大,并且有更多的部分。您需要加载程序,将它们放入内存并运行它们;您需要提供代码来运行 IO 设备;随着它变大,您需要管理内存。

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

于 2008-12-31T18:52:33.740 回答
2

您可能想要获取FreeBSD 操作系统的设计和实现一书以获得非常详细的答案。你可以从 Amazon 或者这个指向 FreeBSD.org 网站的链接在我记忆中看起来像这本书:link text

于 2008-12-31T19:19:14.437 回答
2

尝试使用同一博客中的计算机如何启动内核启动过程和其他相关文章,简要了解计算机启动时的功能。

当计算机的启动严重依赖(可能很明显?)CPU 设计和其他“低级东西”时,计算机会做什么;因此,很难预测您的计算机在启动时会做什么。

于 2008-12-31T19:53:09.377 回答
2

我不敢相信这没有被提及...但是操作系统设计概述的经典书籍是由 MINIX 的创建者 Andrew S Tanenbaum 撰写的操作系统 - 设计和实现。书中的许多示例也直接针对 MINIX。

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

于 2009-01-01T09:26:12.790 回答
1

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

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

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

于 2008-12-31T18:51:02.650 回答
0

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

如果您真的想了解更多关于此的信息,我建议您阅读一本书...关于微控制器,尤其是您在 c 中为 8051 等创建一个小型操作系统的书。或者学习一些 x86 程序集并创建一个非常小的“引导加载程序操作系统”。

于 2008-12-31T18:52:04.273 回答
0

你可能想看看这个问题

于 2008-12-31T19:33:29.977 回答
0

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

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

如何开始操作系统开发

于 2008-12-31T20:28:39.273 回答
0

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

于 2008-12-31T22:54:50.507 回答
0

我的看法是,它就像你自己的生活。起初,你知道的很少——仅仅够相处。这类似于 BIOS 提供的内容——它知道的足够多,可以查找磁盘驱动器并从中读取信息。当你上小学时,你会学到更多东西。这就像将引导扇区读入内存并获得控制权。然后你上高中,这就像操作系统内核加载。然后你去上大学(司机和其他申请) 。当然,这是你容易崩溃的地方。 呵呵。

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

于 2009-01-01T03:56:24.110 回答
0

通读这里将使您了解创建 Linux https://netfiles.uiuc.edu/rhasan/linux/需要什么

于 2009-01-01T09:17:43.073 回答
0

另一个可以放在一个磁盘上的非常小的操作系统是 QNX(当我很久以前最后一次看到它时,整个操作系统,带有 GUI 界面、Web 浏览器、磁盘访问和一个内置的 Web 服务器,都可以放在一个软盘驱动器上) .

从那以后我就没有听到太多关于它的消息,但它是一个实时操作系统,所以它的设计速度非常快。

于 2009-03-18T19:19:55.673 回答
0

实际上,有些人访问一所四年制大学是为了对此有一个粗略的了解。

于 2009-10-08T15:02:11.133 回答
0

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

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

于 2014-05-02T17:55:04.800 回答
0

首先,阅读阅读和阅读,什么是操作系统;那么不同操作系统的用途/类型/性质/目标/需求/是什么。部分链接如下;新手会喜欢这些链接:

现代操作系统- 这给出了关于通用操作系统的想法。

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

Wiki OS - 提供关于不同领域中使用的不同操作系统及其用途的想法(操作系统的对象/功能。)

让我们大致了解一下操作系统包含的内容(不是复杂的Linux 或 Windows)

操作系统需要一个 CPU,并且要在其中转储代码,您需要一个bootloader. 操作系统必须具有要实现的目标,并且这些目标必须在称为Kernel 内部的包装器中定义,您可以拥有scheduling time并且ISR's (取决于您需要制作的目标和操作系统)

于 2016-12-15T16:23:16.190 回答
0

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

我忍不住还要参考 youtube 上的“编写你自己的操作系统”视频系列,因为我是制作它的人 :-)

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

于 2017-03-13T11:51:06.210 回答