创建操作系统似乎是一个庞大的项目.怎么会有人开始?
例如,当我将Ubuntu弹出到我的驱动器中时,我的计算机如何才能运行它? (我想,这是我真正想知道的.)
或者,从另一个角度来看,磁盘上可能存在的字节数最少,仍然可以作为操作系统"运行"?
(我很抱歉,如果这是模糊的.我只是不知道这个主题,所以我不能非常具体.我假装知道关于计算机如何工作的相当数量,但我对这个主题完全无能为力. )
嗯,答案存在于书中:现代操作系统 - Andrew S. Tanenbaum非常好.下面的封面插图.
最简单但完整的操作系统内核,适合学习或只是好奇心,是Minix.
在这里,您可以浏览源代码.
(来源:cs.vu.nl)
操作系统是一个很大的话题,如果你想深入了解操作系统的设计和构建方式,我可以推荐你这是一本好书:
操作系统概念
如果你真的很好奇,我会指引你从Scratch学习Linux作为一个学习操作系统的完整细节以及所有部分如何组合在一起的好地方.如果这比您正在寻找的信息更多,那么这篇关于操作系统的维基百科文章可能是一个很好的起点.
PC知道查看磁盘的特定扇区以获取启动指令.然后,这些指令将告诉处理器在给定处理器中断时,将调用特定代码.例如,在定期打勾时,调用调度程序代码.当我从设备获取内容时,请调用设备驱动程序代码.
现在,操作系统如何使用系统设置所有内容?硬件硬件也有API.它们是在考虑系统程序员的情况下编写的.
我见过很多简单的操作系统,这真的是绝对的核心.有许多嵌入式本土操作系统,他们所做的一切都没有.
其他功能,例如要求应用程序向操作系统询问内存,或者需要特定操作的特权,甚至是进程和线程本身,虽然在大多数PC架构上实现,但实际上是可选的.
简单来说,操作系统使您的软件能够管理硬件.显然,一些操作系统比其他操作系统更复杂.
在其核心,计算机开始在固定地址执行,这意味着当计算机启动时,它将程序计数器设置为预定义的地址,并且只是开始执行机器代码.
在大多数计算机中,这种"自举"过程会立即初始化已知的外围设备(例如,磁盘驱动器).初始化后,引导过程将使用一些预定义的序列来利用这些外围设备.再次使用磁盘驱动程序,进程可能会从硬盘驱动器的第一个扇区读取代码,将其放入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模拟器,然后派对来获取引导扇区来说出你的名字.这是一种傻笑.