文章目录
- 前言
- 前置基础知识
- 计算机组成
- CPU
- 磁盘
- 内核
- 中断、异常、系统调用
- 局部性原理
- 启动操作系统
- 计算机加电是如何正常执行服务的?
- 开机自检
- BIOS(Basic Input/Output System)
- BootLoader
- 小结
前言
本文主要涉及操作系统的简介、硬件结构、内存管理、进程管理、文件系统、设备管理等内容,可以作为学习操作系统的辅助文本记录。撰写本文的目的主要是针对操作系统整体做一个相对完整的梳理,以便后续回顾之用。
本文是第一篇,讲述操作系统的基础知识和操作系统启动。
Q: 操作系统是什么?
A: 操作系统是计算机系统中最基本的部分之一,它管理和控制计算机硬件资源,并为应用软件提供服务。常见的操作系统包括Windows、macOS、Linux等。操作系统的主要功能包括管理计算机的内存和处理器、文件管理、设备管理、用户界面、网络通信等。不同的操作系统在用户界面、文件系统、软件兼容性等方面表现出各自特点,满足不同用户群体的需求。
前置基础知识
计算机组成
计算机组成是指计算机硬件系统中各个部件的结构、功能和相互之间的关系。一般来说,计算机组成包括以下几个方面:
- 中央处理器(CPU):负责执行程序指令和控制计算机的操作。CPU由运算器、控制器和寄存器等部件组成。
- 存储器:用于存储程序指令和数据。根据读写速度和容量大小,可以分为内存和外存(如硬盘、固态硬盘等)。
- 输入设备:用于将外部数据输入到计算机中,如键盘、鼠标、扫描仪等。
- 输出设备:用于将计算机处理后的结果输出到外部,如显示器、打印机、音箱等。
- 总线:用于传输数据和信号,是计算机中各部件之间的通信桥梁。
- 控制器:负责从存储器中读取指令,并将指令传输给CPU中的运算器进行相应的计算操作。
- 运算器:执行计算操作,包括算术、逻辑运算和移位等。
- 寄存器:用于暂时存储CPU中的数据和指令,如程序计数器、指令寄存器、通用寄存器等。
- 缓存:用于提高CPU访问存储器的速度,减少存取延迟和提高系统效率
冯诺依曼模型:运算器、控制器、存储器、输入设备、输出设备
CPU
64位CPU和32位CPU的位数指的是CPU的位宽
64位的CPU的地址总线一般是48位,而32位CPU的地址总线一般是32位;之所以64位的地址总线目前是48位的原因是,用不到这么多地址总线暂时,多了也会增加开销。
硬件的 64 位和 32 位指的是 CPU 的位宽,软件(包含操作系统,操作系统也算是软件)的 64 位和 32 位指的是指令的位宽。
CPU位宽是指一次可以计算数据的bit数。 有CPU在计算时,数据需要先保存在寄存器中,因此CPU位宽一般就是指寄存器的位数。 如32CPU一次可以计算32bit的数据,64位CPU一次可以计算64bit的数据。
-
32位操作系统的内存寻址上限是4GB(即2^32个地址),这也意味着最大可寻址的内存空间为4GB。然而,实际可用的内存会小于4GB,因为其中一部分地址空间会被保留用于硬件映射,比如显卡内存、系统 BIOS 等。
-
在实际应用中,32位操作系统能够有效管理的内存通常在3GB到3.5GB之间,具体取决于硬件和操作系统的配置。为了充分利用更多内存,现代计算机系统通常会采用 64 位操作系统。 64 位操作系统可以支持非常大的内存空间,通常上限是几TB甚至更高。
-
1 k B = 2 10 B i t 1kB = 2^{10}Bit 1kB=210Bit, 4 G B = 2 32 B i t 4GB = 2^{32}Bit 4GB=232Bit
磁盘
CPU Cache用的是SRAM(Static Random-Acess Memory, 静态随机存储器)的芯片,一旦断电数据丢失。
内存使用的是DRAM(Dynamic Random-Acess Memory,动态随机存取存储器)的芯片。之所以叫做动态是因为是使用电容存储数据,电容会随时间不断漏电,因此要定时刷新电容,从而称之为动态存储。
寄存器、CPU Cache、内存在断电后数据都会丢失。而SSD/HDD则不会。
SSD(Soild-state Disk)固态硬盘,结构和内存类似,但是内存读写速度大概是SSD的10~1000倍;
HDD(Hard Disk Drive)机械硬盘,物理读写,比内存慢10w倍左右;
内核
**内核(Kernel)**是操作系统最核心的部分,它是操作系统的核心模块,负责管理计算机系统的硬件和软件资源,并提供给其他应用程序访问硬件的接口。内核可以看作是操作系统与硬件之间的桥梁,它处理中断、调度任务、内存管理、设备驱动等底层操作,为上层应用程序提供稳定、高效的运行环境。
内核产生的原因主要有以下几点:
- 硬件资源管理:计算机系统的硬件资源(例如处理器、内存、磁盘、网络等)需要统一管理和分配。内核负责协调和管理这些资源,确保每个应用程序能够合理、安全地使用硬件资源。
- 提供抽象接口:不同的硬件设备有不同的工作方式和指令集,为了让应用程序开发者更加方便地编写程序,内核提供了抽象接口,屏蔽了底层硬件的细节,使得应用程序不需要关注具体的硬件实现细节,只需要调用内核提供的接口就可以完成相应的操作。
- 多任务处理:现代操作系统支持多任务处理,即在同一时间片内可以并行运行多个程序。内核负责任务的调度和切换,确保每个任务都能在适当的时间获得执行,从而实现了多任务的效果。
- 安全和稳定性:内核具备对系统资源进行保护和隔离的能力,可以防止不同应用程序之间的相互干扰,同时也能够保护系统免受恶意软件的攻击。内核还负责处理和恢复一些系统错误和异常,提高系统的稳定性和可靠性。
内核更像是一个中间人来对接应用和硬件设备,是应用连接硬件设备的桥梁。
Q: 内核是怎么工作的?
A: 内核具有很高的权限,可以控制 cpu、内存、硬盘等硬件,而应用程序具有的权限很小,因此大多数操作系统,把内存分成了两个区域:
- 内核空间,这个内存空间只有内核程序可以访问;
- 用户空间,这个内存空间专门给应用程序使用;
用户空间的代码只能访问一个局部的内存空间,而内核空间的代码可以访问所有内存空间。因此,当程序使用用户空间时,我们常说该程序在用户态执行,而当程序使内核空间时,程序则在内核态执行。
应用程序如果需要进入内核空间,就需要通过系统调用。
中断、异常、系统调用
-
中断可以分为多种类型,包括外部中断(来自外设)、**内部中断(由处理器内部发出)**以及软件中断。外部中断是指来自计算机外部设备的信号,如键盘、鼠标、硬盘控制器等设备发出的请求,需要处理器立即暂停当前的工作,转而处理来自外部设备的任务。内部中断是指处理器内部的事件引起的中断,例如除法错误、地址错误等。而软件中断是由执行指令产生的中断,通常用于系统调用或异常处理。
-
异常也来源于应用程序,但来源于不良的应用程序,是由于非法指令或者其他坏的处理状态(如:内存出错等);
-
系统调用来源于应用程序,是应用程序主动向操作系统发出服务请求,系统调用是操作系统与应用程序的接口
-
响应:
- 中断:操作系统会持续运行,对用户程序是透明的,我们感受不到,就像在打字的时候不断发生着中断;
- 异常:操作系统会杀死进程或重新执行
- 系统调用:操作系统会等待或持续进行各种操作。
-
处理时间
- 中断:异步
- 异常:同步
- 系统调用:异步或同步
**什么意思啊?**我看别人的解释是“处理时间是否同步,要看应用程序是否需要等待即时反馈,如果需要就是同步,不需要就是异步”
Q:系统调用与函数调用的区别?
A: 系统调用涉及到切换用户态和内核态,因为操作系统内核运行在特权模式下,而应用程序通常运行在用户态。
为了内核和用户态的区别,系统调用会有堆栈的切换和特权级的转换;
函数调用时没有堆栈切换;
因此,系统调用比一般常规函数调用的执行开销大。
局部性原理
局部性原理: 程序在执行过程中的一个较短时期,所执行的指令地址和指令的操作数地址分别局限在一定区域。
-
时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短时期内;
-
空间局部性:当前指令和邻近的几条指令,当前访问的数据和临近的几个数据都集中在一个较小区域内;
-
分支局部性:一条跳转指令的两次执行,很有可能跳转到相同的内存位置;
启动操作系统
计算机加电是如何正常执行服务的?
- 加电自检(Power-On Self-Test, POST):当你打开电脑电源后,计算机会进行自检程序。这个过程检查计算机硬件设备是否正常运作,包括内存、CPU、硬盘、显卡等。
- 启动BIOS:自检完成后,计算机将启动基本输入输出系统(Basic Input Output System, BIOS)。BIOS是存储在计算机主板上的固件,它负责初始化和配置硬件设备,并提供基本的操作系统启动功能。
- POST显示和系统配置界面:BIOS会将特定信息显示在屏幕上,比如计算机型号、硬件信息等。同时,你还可以通过按下指定键(通常是Del、F2或F10)进入BIOS设置界面,对计算机进行配置,如设置启动顺序、调整时钟频率等。
- 启动引导加载程序(Boot Loader):在BIOS完成系统硬件初始化和配置后,它会从硬盘中读取引导加载程序。引导加载程序是一个小型程序,负责加载磁盘中的操作系统的核心文件到内存中。
- 操作系统启动:引导加载程序会读取操作系统的核心文件,如Windows的NTLDR或GRUB(GNU GRand Unified Bootloader)等。这些核心文件负责初始化操作系统的各个模块,并将控制权交给操作系统。
- 操作系统初始化:操作系统开始启动并加载系统服务、设备驱动程序等。在这个阶段,计算机会完成一系列初始化和配置工作,为用户提供操作系统的功能和界面。
- 用户登录:一旦操作系统初始化完成,系统会显示用户登录界面。用户可以输入用户名和密码来登录操作系统,并开始使用计算机的各种功能。
开机自检
开机自检(Power-On Self-Test,POST)是计算机启动过程中的一个重要步骤,用于检测和初始化计算机的硬件设备。下面是大致的开机自检流程:
- 电源供电:当计算机通电时,电源会向主板和其他硬件设备提供电力。
- 初始化CPU:主板会对CPU进行初始化,包括设置工作频率、缓存等参数,并验证CPU的正常运行状态。
- 检查系统内存:主板会检查安装的内存模块,确保它们的类型、容量和速度等参数正确,并执行一些内存控制器的测试。
- 初始化基本硬件:主板将逐个检测和初始化连接到主板上的各种硬件设备,例如硬盘、光驱、显卡、网卡等。它会验证设备是否存在、设置设备的初始状态,并确保与设备的通信正常。
- 显示引导信息和错误:在开机自检期间,如果发现任何硬件问题或错误,主板会尝试通过报警声音、在显示屏上显示错误信息或使用指示灯等方式来提示用户。
- 执行BIOS和POST扩展:BIOS(Basic Input/Output System)会被加载到内存中执行,并执行更高级别的自检操作,例如检测和初始化其他外部设备。
BIOS(Basic Input/Output System)
BIOS(Basic Input/Output System)是一种固件,通常存放在计算机的主板上的闪存芯片中,并且在计算机启动时被加载到内存中执行。
具体来说,计算机启动时会首先运行BIOS程序。BIOS会完成硬件自检和初始化,然后查找可引导设备(如硬盘、光驱、USB存储等)的引导记录(boot record),并将控制权传递给引导记录中的引导加载程序。引导加载程序进一步的操作系统加载过程,并最终将控制权交给操作系统。
在计算机启动过程中,BIOS程序是在计算机内存中运行的,而不是从磁盘中运行的。一旦BIOS程序完成了它的初始化工作和引导控制权的交接,它就会从内存中退出。
需要注意的是,由于BIOS程序是固化在ROM中的,因此在正常情况下是不会改变的。但是,可以通过刷新(Flash)BIOS来更新或更改BIOS程序。在这种情况下,BIOS程序会从磁盘中读取一个镜像文件到内存中,并用此文件覆盖原始的BIOS程序。
BootLoader
Q: 引导加载程序BootLoader一般存放在哪里?
A: 引导加载程序(Boot Loader)的存放位置取决于操作系统和计算机的配置。以下是常见的几种存放位置:
- 主启动记录(Master Boot Record, MBR):在大多数传统的BIOS系统中,MBR位于硬盘的第一个物理扇区(磁道0、扇区1)。MBR中包含引导加载程序的代码,以及分区表和硬盘签名等信息。
- UEFI系统分区(Unified Extensible Firmware Interface System Partition, ESP):在使用UEFI固件的计算机上,引导加载程序通常存储在ESP分区中。ESP分区是一个FAT文件系统分区,包含了引导加载程序、操作系统文件以及其他相关配置文件。
- 分区引导扇区(Partition Boot Sector):在某些情况下,引导加载程序可能会存储在每个分区的引导扇区中。这种情况下,每个分区都有自己的引导加载程序。
引导加载程序(Boot Loader)在正常情况下是存放在计算机的硬盘中。
具体来说,在传统的BIOS系统中,引导加载程序通常存储在硬盘的主启动记录(Master Boot Record, MBR)中,也就是硬盘的第一个物理扇区。该扇区的容量很小,通常为512字节,足够存放引导加载程序的代码和必要的信息。
当计算机上电启动时,BIOS会读取硬盘的MBR,并将控制权交给MBR中的引导加载程序。引导加载程序进程进一步的操作系统加载过程,负责加载操作系统核心文件并将控制权交给操作系统。
然而,在某些情况下,为了实现更灵活的引导方式,可以使用其他方式将引导加载程序存放在其他位置,例如UEFI系统分区(ESP)或者各个分区的引导扇区。这种情况下,引导加载程序可能不仅仅存放在硬盘中,还可能存储在固件芯片中或其他可写入存储设备中。
需要注意的是,引导加载程序在启动时会被加载到计算机的内存中执行,而不是直接从硬盘中运行。一旦引导加载程序将控制权交给操作系统,操作系统将会继续从硬盘或其他存储设备中加载更多的文件和程序到内存中。
小结
本节主要操作系统的基础知识以及启动操作系统的一些问题。文中部分图片来自“小林coding”。
如果您觉得我写的不错,麻烦给我一个免费的赞!如果内容中有错误,也欢迎向我反馈。