本文主要涉及操作系统的简介、硬件结构、内存管理、进程管理、文件系统、设备管理等内容,可以作为学习操作系统的辅助文本记录。撰写本文的目的主要是针对操作系统整体做一个相对完整的梳理,以便后续回顾之用。
本文是第一篇,讲述操作系统的基础知识和操作系统启动。
Q: 操作系统是什么?
A: 操作系统是计算机系统中最基本的部分之一,它管理和控制计算机硬件资源,并为应用软件提供服务。常见的操作系统包括Windows、macOS、Linux等。操作系统的主要功能包括管理计算机的内存和处理器、文件管理、设备管理、用户界面、网络通信等。不同的操作系统在用户界面、文件系统、软件兼容性等方面表现出各自特点,满足不同用户群体的需求。
计算机组成是指计算机硬件系统中各个部件的结构、功能和相互之间的关系。一般来说,计算机组成包括以下几个方面:
冯诺依曼模型:运算器、控制器、存储器、输入设备、输出设备
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)是计算机启动过程中的一个重要步骤,用于检测和初始化计算机的硬件设备。下面是大致的开机自检流程:
BIOS(Basic Input/Output System)是一种固件,通常存放在计算机的主板上的闪存芯片中,并且在计算机启动时被加载到内存中执行。
具体来说,计算机启动时会首先运行BIOS程序。BIOS会完成硬件自检和初始化,然后查找可引导设备(如硬盘、光驱、USB存储等)的引导记录(boot record),并将控制权传递给引导记录中的引导加载程序。引导加载程序进一步的操作系统加载过程,并最终将控制权交给操作系统。
在计算机启动过程中,BIOS程序是在计算机内存中运行的,而不是从磁盘中运行的。一旦BIOS程序完成了它的初始化工作和引导控制权的交接,它就会从内存中退出。
需要注意的是,由于BIOS程序是固化在ROM中的,因此在正常情况下是不会改变的。但是,可以通过刷新(Flash)BIOS来更新或更改BIOS程序。在这种情况下,BIOS程序会从磁盘中读取一个镜像文件到内存中,并用此文件覆盖原始的BIOS程序。
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”。
如果您觉得我写的不错,麻烦给我一个免费的赞!如果内容中有错误,也欢迎向我反馈。