https://www.bilibili.com/video/av6538245
介绍本篇博客,旨在记录视频学习的要点,所以格式随意, 方便本人日后自考和回忆,有兴趣的朋友可以评论讨论。
原文地址https://www.cnblogs.com/clockq/p/10318639.html
一、操作系统(OS)描述 1.1 什么是操作系统OS = Kernel + Shell,是介于底层硬件和应用软件之间的一层软件架构。
Shell 主要提供与Users的交互工作(Windows的GUI和Linux的Terminal)
Kernel 主要负责管理计算机的硬件资源
CPU调度器
内存管理 = 物理内存 + 虚拟内存
文件系统管理
中断和设备驱动
Kernel 特征并发(也并行)
共享
虚拟化(cpu,内存 => 进程, 硬盘 => 文件)
异步
1.2 操作系统的发展历史纸带+人工操作系统
多道操作系统
分时操作系统(1/1000 s一次分时)
单用户操作系统
分布式操作系统
计算机的快速发展与各个底层硬件的快速发展是分不开的(CPU的计算能力,IO的读写能力和网络带宽)
二、OS的启动、中断、异常和系统调用 2.1 计算机系统启动流程BIOS = Basic Input/Output System
graph LR A[BIOS]-->B[Bootloader] B --> C[OS] 2.1.1 BIOS启动流程POST = Power-On Self-Test
graph LR A[POST]-->B[启动顺序] B-->C[主引导记录] 2.1.2 主引导记录主引导记录(MBR)= Master Boot Record
graph LR A[MBR]-->B[分区表] B-->C[活动分区] 2.1.3 硬盘启动硬盘启动分为三种情况:
卷引导记录(Win)
扩展分区和逻辑分区(不常见)
启动管理器(Linux的Grub)
卷引导记录(VBR)= Volume boot record
graph LR A[活动分区]-->B[VBR] B-->C[OS]启动管理器模式:
graph LR A[MBR]-->B[Grub] 2.1.4 操作系统启动 graph LR A[Load /boot/kernel]-->B[run /sbin/init] 2.2 中断、异常、系统调用中断:不同硬件设备的计时器或网络中断(外设发起)(异步)
异常:非法指令或其他失败的处理状态(应用程序发起)(同步)
系统调用:应用程序主动向操作系统发出的服务请求(应用程序发起)(同步或异步)
2.2.1 中断处理流程 graph LR A[外设设置中断标记] --> B[保存现场] B --> C[中断程序处理] C --> D[清除中断标记] D --> E[恢复现场] 2.2.2 异常处理流程 graph LR A[保存现场] --> B[异常处理] B --> C[杀死异常程序] B --> D[重启发生异常的程序] C --> E[恢复现场] D --> E[恢复现场] 2.2.3 系统调用处理流程应用程序无法直接操作硬件,需要OS提供的服务接口来间接调用,例:
C语言的printf()函数,执行时会调用OS的write()接口
计算机基本硬件结构 = CPU + 内存 + 外设
CPU = 运算器 + 寄存器 + 控制器 + Cache(L1 + L2)+ 存储管理单元(MMU)
3.2 内存分层体系越是靠近CPU的内存,读取速度越快,由近及远依次是:
CPU寄存器 => Cache => 主存 => 虚拟内存
操作系统在内存管理上要完成的任务:
抽象
逻辑地址空间 != 实际地址空间
保护(隔离)
同时运行多个应用,每个应用有一片独立的地址空间
共享
进程间可以使用共享内存进行交互和数据的传递
虚拟
内存不足可以利用硬盘获得更多的地址空间
3.3 地址空间和地址生成逻辑地址空间:一个运行程序所拥有的内存范围。该地址是相对于当前进程数据段的地址,不和绝对物理地址相干。一个逻辑地址,是由一个段标识符加上一个指定段内相对地址的偏移量,表示为 [段标识符:段内偏移量]。
线性地址:是逻辑地址到物理地址变换之间的中间层。
物理地址空间:硬件支持的地址空间。
逻辑地址------(段机制)------->线性地址------(页机制)------->物理地址。
既然逻辑地址最终要转换为物理地址,那么为何还需要逻辑地址呢?逻辑地址提供了权限检查功能:比如我们设置逻辑地址和物理地址之间的映射关系时,可以设置某块地址是只读的,只写的,只有CPU处于管理模式时才能访问等。这些功能可以让系统的内核,用户程序的运行空间相互独立:用户程序即使出错,也无法破坏内核;用户程序A崩溃了,也无法影响到用户程序B。
3.3.1 逻辑地址生成过程 graph LR A[C程序.c] --> |编译| B[编译程序.s] B --> |汇编| C[汇编程序.o] C --> |链接| D[执行程序.exe] D --> |加载| E[应有载入内存]各个步骤的作用:
编译:C程序代码中,每个指针(变量名、函数名)就代表着一个逻辑地址,但该地址对硬件而言是不友好的,因此先经过编译,将代码转为语法树,通过符号来描述地址。
汇编:经过汇编,将上一步的语法树转为机器语言,使用一段相对连续的,从零开始的地址描述程序。更加接近底层硬件语言。