一台计算机知道在磁盘的特定扇区查找启动指令。然后这些指令将告诉处理器,在给定的处理器中断时,调用特定的代码。例如,定时器触发时调用调度程序代码。当我从设备中获得某些东西时,则调用设备驱动程序代码。
那么操作系统如何设置系统中的所有内容?硬件也有API。它们是为系统程序员编写的。
我已经看过很多裸机操作系统,这确实是绝对的核心。许多嵌入式自制操作系统只是执行这些基本功能,没有其他功能。
其他功能,例如要求应用程序向操作系统请求内存,或需要特殊权限来执行某些操作,甚至进程和线程本身都是可选的,尽管它们在大多数PC架构上被实现。
操作系统,简单地说,就是赋予软件管理硬件的工具。显然,一些操作系统比其他操作系统更为复杂。
在计算机的核心部分,它会从一个固定的地址开始执行,这意味着当计算机启动时,它会将程序计数器设置为预定义的地址,然后开始执行机器代码。
在大多数计算机中,这个“引导”过程会立即初始化已知的外设(例如,磁盘驱动器)。一旦初始化完成,引导过程将使用一些预定义的序列来利用这些外设。例如,使用磁盘驱动器,该过程可能会从硬盘的第一个扇区读取代码,将其放置在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模拟器,编写引导扇区并让其显示你的名字,这将是一个令人愉快的体验。
基本上...你的电脑可以运行光盘是因为:
BIOS在启动顺序中包括了该光盘设备。
在启动时,BIOS按照顺序扫描所有可引导设备(如软盘驱动器、硬盘和CD-ROM)。每个设备都访问其介质并检查一个硬编码位置(通常是磁盘或CD设备上的扇区),以识别介质,并列出跳转到磁盘(或介质)上指令开始的位置。 BIOS告诉设备将它的磁头(或其他部件)移动到介质的指定位置,并读取一大块指令。 BIOS将这些指令交给CPU。
CPU执行这些指令。在您的情况下,这些指令将启动Ubuntu操作系统。它们也可以是指令来停止,或者加10+20等。
通常,操作系统会首先从CPU直接获取一大块内存(因为像“GlobalAlloc”等库命令由尚未加载的操作系统提供),并开始为操作系统自身创建结构。
操作系统为应用程序提供一堆“功能”:内存管理,文件系统,输入/输出,任务调度,网络,图形管理,对打印机的访问等等。在您“接管”之前,它正在创建/启动所有服务,以便稍后的应用程序可以一起运行,不会彼此覆盖内存,并拥有一个良好的API来访问操作系统提供的服务。
操作系统提供的每个“功能”都是一个大主题。操作系统提供它们,因此应用程序只需要担心调用正确的操作系统库,而操作系统则管理像两个程序同时尝试打印的情况。
例如,如果没有操作系统,则每个应用程序都必须处理另一个程序正在尝试打印的情况,然后“做些什么”,例如打印或取消其他作业等。相反,只有操作系统需要处理这个问题,应用程序只需告诉操作系统“打印这些内容”,操作系统确保一个应用程序打印,而所有其他应用程序只需等待第一个完成或用户取消它。
成为操作系统所需的最少字节其实没有意义,因为“操作系统”可能意味着许多或很少的功能。如果您只想从CD中执行一个程序,那将是非常少的字节。然而,那不是操作系统的定义。操作系统的工作是提供服务(我称其为功能),以允许许多其他程序运行,并管理访问这些服务的程序。这很难,添加共享资源(网络、无线网络、CD刻录机、游戏杆、iSight视频、双显示器等等)会使它变得更加困难。
我看到的最近一个备受重视的操作系统项目是微软研究项目Singularity,它完全使用C#.NET从头开始编写。
为了让你了解需要多少工作量,有2个核心开发人员,但他们每次会有多达十几个实习生,但仍然需要两年时间才能将操作系统引导并显示BMP图像(这是他们用于演示的方式)。在他们甚至能够获得类似命令行的东西之前,需要更多的工作(大约4年)。