操作系统运行过程详解
现代通用计算机系统包括一个或多个 CPU 和若干设备控制器,通过公用总线相连而成,该总线提供了共享内存的访问(图 1 )。每个设备控制器负责一类特定的设备(如磁盘驱动器、音频设备或视频显示器)。CPU 与设备控制器可以并发执行,并且竞争访问内存。为了确保有序访问共享内存,需要内存控制器来协调访问内存。
图 1 现代计算机系统
当计算机电源打开或重启以便开始运行时,它需要运行一个初始程序。该初始程序或引导程序(bootstrap program)通常很简单,一般位于计算机的固件(firmware),如只读内存(Read-Only Memory,ROM)或电可擦可编程只读内存(Electrically Erasable Programmable Read-Only Memory, EEPROM)。它初始化系统的各个组件,从 CPU 寄存器、设备控制器到内存内容。引导程序必须知道如何加载操作系统并且开始执行系统。为了完成这一目标,引导程序必须定位操作系统内核并且加到内存。
一旦内核加到内存并执行,它就开始为系统与用户提供服务。除了内核外,系统程序也提供一些服务,它们在启动时加到内存而成为系统进程(system process)或系统后台程序(system daemon),其生命周期与内核一样。对于 UNIX,首个系统进程为“init”,它启动许多其他系统的后台程序。一旦这个阶段完成,系统就完全启动了,并且等待事件发生。
事件发生通常通过硬件或软件的中断(interrupt)来通知。硬件可以随时通过系统总线发送信号到 CPU,以触发中断。软件也可通过执行特别操作即系统调用(system call)(也称为监督程序调用(monitor call)),以触发中断。
当 CPU 被中断时,它停止正在做的事,并立即转到固定位置再继续执行。该固定位置通常包含中断服务程序的开始地址。中断服务程序开始执行,在执行完后,CPU 重新执行被中断的计算。这一运行的时间表如图 2 所示。
图 2 单个进程执行输出的中断时间表
中断是计算机体系结构的重要部分。虽然每个计算机设计都有自己的中断机制,但是有些功能是共同的。中断应将控制转移到合适的中断服务程序。处理这一转移的直接方法是,调用一个通用程序以检查中断信息。接着,该程序会调用特定的中断处理程序。不过,中断处理应当快捷。
由于只有少量预先定义的中断,所以可以通过中断处理程序的指针表来提高速度。这样通过指针表可以间接调用中断处理程序,而无需通过其他中介程序。通常,指针表位于低地址内存(前 100 左右的位置)。这些位置包含各种设备的中断处理程序的地址。这种地址的数组或中断向量(interrupt vector),对于任一给定的中断请求,可通过唯一的设备号来索引,进而提供设备的中断处理程序的地址。许多不同的操作系统,如 Windows 或 UNIX,都采用这种方式来处理中断。
中断体系结构也应保存中断指令的地址。许多以前的设计只是简单地将中断地址保存在某个固定位置或可用设备号来索引的位置。而现代体系结构将返回地址保存在系统堆栈上。如果中断程序需要修改处理器状态,如修改寄存器的值,则应明确保存当前状态,并在返回之前恢复该状态。在处理完中断之后,保存的返回地址会加载到程序计数器,被中断的计算可以重新开始,就好像中断没有发生过一样。
例如,虽然大多数计算机没有移动单个位的指令,但是有移动单个字节的指令。另一较少使用的单位是字(word),这是一个给定计算机架构的常用存储单位。每个字由一个或多个字节组成。例如,一个具有 64 位寄存器和 64 位内存寻址的计算机通常釆用 64 位(8 字节)的字。计算机的许多操作通常是按字为单位的,而不是按字节为)单位的。
计算机存储与计算机的大多数部分一样,通常按字节或字节组合来计算或操作。每千字节(kilobyte,KB)为 1024 字节,每兆字节(megabyte, MB)为 10242 字节,每十亿字节(gigabyte,GB)为 10243 字节,每兆兆字节(terabyte,TB)为 10244 字节,每千兆兆字节(petabyte,PB)为 10245 字节。计算机制造商通常进行圆整,认为 1MB=106 字节,1GB=109 字节。然而,网络计量则不同,它们通常是按位来计算的(因为网络一次移动一位)。
图 1 现代计算机系统
当计算机电源打开或重启以便开始运行时,它需要运行一个初始程序。该初始程序或引导程序(bootstrap program)通常很简单,一般位于计算机的固件(firmware),如只读内存(Read-Only Memory,ROM)或电可擦可编程只读内存(Electrically Erasable Programmable Read-Only Memory, EEPROM)。它初始化系统的各个组件,从 CPU 寄存器、设备控制器到内存内容。引导程序必须知道如何加载操作系统并且开始执行系统。为了完成这一目标,引导程序必须定位操作系统内核并且加到内存。
一旦内核加到内存并执行,它就开始为系统与用户提供服务。除了内核外,系统程序也提供一些服务,它们在启动时加到内存而成为系统进程(system process)或系统后台程序(system daemon),其生命周期与内核一样。对于 UNIX,首个系统进程为“init”,它启动许多其他系统的后台程序。一旦这个阶段完成,系统就完全启动了,并且等待事件发生。
事件发生通常通过硬件或软件的中断(interrupt)来通知。硬件可以随时通过系统总线发送信号到 CPU,以触发中断。软件也可通过执行特别操作即系统调用(system call)(也称为监督程序调用(monitor call)),以触发中断。
当 CPU 被中断时,它停止正在做的事,并立即转到固定位置再继续执行。该固定位置通常包含中断服务程序的开始地址。中断服务程序开始执行,在执行完后,CPU 重新执行被中断的计算。这一运行的时间表如图 2 所示。
图 2 单个进程执行输出的中断时间表
中断是计算机体系结构的重要部分。虽然每个计算机设计都有自己的中断机制,但是有些功能是共同的。中断应将控制转移到合适的中断服务程序。处理这一转移的直接方法是,调用一个通用程序以检查中断信息。接着,该程序会调用特定的中断处理程序。不过,中断处理应当快捷。
由于只有少量预先定义的中断,所以可以通过中断处理程序的指针表来提高速度。这样通过指针表可以间接调用中断处理程序,而无需通过其他中介程序。通常,指针表位于低地址内存(前 100 左右的位置)。这些位置包含各种设备的中断处理程序的地址。这种地址的数组或中断向量(interrupt vector),对于任一给定的中断请求,可通过唯一的设备号来索引,进而提供设备的中断处理程序的地址。许多不同的操作系统,如 Windows 或 UNIX,都采用这种方式来处理中断。
中断体系结构也应保存中断指令的地址。许多以前的设计只是简单地将中断地址保存在某个固定位置或可用设备号来索引的位置。而现代体系结构将返回地址保存在系统堆栈上。如果中断程序需要修改处理器状态,如修改寄存器的值,则应明确保存当前状态,并在返回之前恢复该状态。在处理完中断之后,保存的返回地址会加载到程序计数器,被中断的计算可以重新开始,就好像中断没有发生过一样。
存储定义与符号
计算机存储的基本单位是位或比特(bit)。每个位可以包含一个 0 或一个 1。所有其他计算机存储都是由位组合而成的。只要位数足够,计算机就能表示各种信息:数字、字母、图像、视频、音频、文档和程序等。每个字节(byte)为 8 位,这是大多数计算机的常用最小存储。例如,虽然大多数计算机没有移动单个位的指令,但是有移动单个字节的指令。另一较少使用的单位是字(word),这是一个给定计算机架构的常用存储单位。每个字由一个或多个字节组成。例如,一个具有 64 位寄存器和 64 位内存寻址的计算机通常釆用 64 位(8 字节)的字。计算机的许多操作通常是按字为单位的,而不是按字节为)单位的。
计算机存储与计算机的大多数部分一样,通常按字节或字节组合来计算或操作。每千字节(kilobyte,KB)为 1024 字节,每兆字节(megabyte, MB)为 10242 字节,每十亿字节(gigabyte,GB)为 10243 字节,每兆兆字节(terabyte,TB)为 10244 字节,每千兆兆字节(petabyte,PB)为 10245 字节。计算机制造商通常进行圆整,认为 1MB=106 字节,1GB=109 字节。然而,网络计量则不同,它们通常是按位来计算的(因为网络一次移动一位)。
所有教程
- socket
- Python基础教程
- C#教程
- MySQL函数
- MySQL
- C语言入门
- C语言专题
- C语言编译器
- C语言编程实例
- GCC编译器
- 数据结构
- C语言项目案例
- C++教程
- OpenCV
- Qt教程
- Unity 3D教程
- UE4
- STL
- Redis
- Android教程
- JavaScript
- PHP
- Mybatis
- Spring Cloud
- Maven
- vi命令
- Spring Boot
- Spring MVC
- Hibernate
- Linux
- Linux命令
- Shell脚本
- Java教程
- 设计模式
- Spring
- Servlet
- Struts2
- Java Swing
- JSP教程
- CSS教程
- TensorFlow
- 区块链
- Go语言教程
- Docker
- 编程笔记
- 资源下载
- 关于我们
- 汇编语言
- 大数据
- 云计算
- VIP视频