从图灵机到操作系统的启动

1936年,阿兰图灵提出了一种可计算模型——图灵机。图灵机是从模拟人用纸笔计算的过程得到的灵感。图灵设想只存在于想象中的机器由一个控制器、一个读写头和一根无限长的工作带组成的。纸带起着存储的作用;读写头能够读取纸带上的信息,以及将运算结果写进纸带;控制器则负责对搜集到的信息进行处理。图灵机原理图如下:

根据这个原理,人类设计了第一台电子计算机——ABC计算机。但是ABC计算机实现的是图灵机,导致ABC计算机只能求解线性方程组。后来在冯诺依曼等人的努力下,在宾夕法尼亚大学诞生了世界上第一台通用电子计算机——ENIAC。它是图灵完全的电子计算机,能够重新编程,解决各种计算问题。它于1946年2月14日在美国宣告诞生。冯诺依曼小组提出的“存储程序的思想”为通用图灵机的实体化做出了重要贡献,直到哈佛结构出现之前,所有的计算机都是冯诺依曼结构。

这个体系结构的计算机运行的过程简单说来就是“取指执行”。

操作系统(OS)是介于计算机硬件和应用软件之间的一层软件。操作系统的存在可以使我们更高效的使用硬件。

操作系统主要管理CPU,内存,终端,磁盘以及文件等资源。

计算机的开机的过程到底是怎么样的(Intel X86计算机)。Intel X86 PC开机时CPU处于实模式,实模式寻址CS:IP(CS左移4位,然后加上IP的偏移值就是要寻址的地址),上电以后,CS=0xFFFF,IP=0x0000.(Intel设计的8086是X86的鼻祖,它是16位的,而且CS和IP都是16位的寄存器。)根据寻址规则,CPU要去地址为0xFFFF0的地址去“取指执行”。在0xFFFF0这个地方存放着BIOS程序(Basic input and output system)。然后计算机进入“自检”。BIOS会在系统的0x00000也就是内存刚开始的地方,初始化自己的中断向量表和中断处理程序。接着从0磁道0扇区读入内容到0x7C00处。(0磁道0扇区存是OS的引导扇区)这个扇区总共512字节,它是启动设备后访问的第一个扇区。引导扇区存放着bootsect.s汇编后的代码。CPU从这里执行一段代码后,将这里512字节的内容移动到了0x9000:0x0000处。在这里继续执行,会遇到一个0x13的BIOS中断,该中断是读磁盘扇区的中断。在接下来读取的4个扇区内存放着setup程序。在此期间0x10的BIOS中断加载一个显示到屏幕上,就是我们开机时看到的启动画面。

然后加载了setup模块,setup通过BIOS提供的中断信号,让cpu执行对应的BIOS的中断处理程序,来提取硬件信息,并存放到bootsect.s开始的位置,然后把system的代码移动到0地址处,(但是0x0000这里存放着IDT表,所以这个时候中断被关闭了,然后setup会去设置IDT和GDT,Linux操作系统不使用BIOS提供的中断。CPU有专门的寄存器IDTR来保存IDT在内存中的位置,CPU同时也有专门的寄存器GDTR来保存GDT表的位置。)(这就是前面把bootsect搬移的原因,因为system需要用到这块内存)setup在执行完之前,将CR0这个寄存器的最后一位置位。从而使Intel X86CPU的实模式切换到保护模式(32位模式)。否则根据以前的寻址方式CS左移4位,加上IP,这样最多访问1MB的内存。进入实模式后,寻址方式将会变成:根据CS查表,然后加上IP。(CS和IP都变成了32位寄存器)现在setup执行完毕,跳到0地址处,开始执行system的第一段代码,这个第一部分就是head。head在执行的时候,就会跳到C语言的mian函数处执行。main函数开始执行一系列初始化操作,包括内存,中断,设备,时钟,CPU等。所以操作系统是在CPU的保护模式下运行的。

经过上面一系列的过程,我们的计算机就算正式开机了。


当年8086/8088只有20根地址/数据总线,因此,最大可寻址的内存只有1024KB(1MB),后来的80386将计算机从16位时代带到了32位时代,此时地址/数据总线有32根,可寻址高达4GB的内存空间。但是为了兼容之前的软件,系统 1MB 以下物理内存使用分配上仍然保持与原来一致。只是原来系统 ROM 中的基本输入输出程序 BIOS 一直处于 CPU 能寻址的内存最高端位置处,而 BIOS 原来所在的位置将在计算机开机初始化时被用作 BIOS 的影子(Shadow)区域,即 BIOS代码仍然会被复制到这个区域中。

当计算机上电初始化时,物理内存被设置成从地址 0 开始的连续区域。除了地址从 0xA0000 到 0xFFFFF(640K 到 1M 共 384K)和 0xFFFE0000 到 0xFFFFFFFF(4G 处的最后一 64K)范围以外的所有内存都可用作系统内存。这两个特定范围被用于 I/O 设备和 BIOS 程序。假如我们的计算机中有 16MB 的物理内存,那么在 Linux 0.1x 系统中,0--640K 将被用作存放内核代码和数据。Linux 内核不使用 BIOS 功能,也不使用 BIOS 设置的中断向量表。640K-- 1M 之间的 384K 仍然保留用作图中指明的用途。其中地址 0xA0000开始的 128K 用作显示内存缓冲区,随后部分用于其他控制卡的 ROM BIOS 或其映射区域,而 0xF0000 到1M 范围用于高端系统 ROM BIOS 的映射区。1M--16M 将被内核用于作为可分配的主内存区。另外高速缓冲区和内存虚拟盘也会占用内核代码和数据后面的一部分内存区域,该区域通常会跨越 640K -- 1M 的区域。

由于目前 PC/AT 微机中 BIOS 容量大多有 1MB 到 2MB,因此为了能够执行或访问 BIOS 中超过 64KB 范围而又远远不在 0--1M 地址空间中的其他 BIOS 代码或数据,BIOS 程序会首先使用 32 位访问方式把数据段寄存器的访问范围设置成 4G(而非原来的 64K),这样 CPU 就可以在 0 到 4G 范围内执行和操作数据。此后,BIOS 在执行了一些列硬件检测和初始化操作之后,就会把与原来 PC 机兼容的 64KB BIOS 代码和数据复制到内存低端 1M 末端的 64K 处,然后跳转到这个地方并让 CPU 真正运行在实地址模式下,见图 2-5 所示。最后 BIOS 就会从硬盘或其他块设备把操作系统引导程序加载到内存 0x7c00 处,并跳转到这个地方继续执行引导程序。                                                        --by《Linux内核完全注释》


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值