操作系统概述
操作系统简介
- 操作系统是做什么的?
操作系统(英语:operating system,缩写作 OS)是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。
本质上来说这句话没什么用,可以简称为操作系统很重要的学计算机软件软件
os 的作用
Os 是用户与计算机硬件之间的接口
Os 处于应用用户和计算机硬件之间
os 是系统资源的管理者
为了方便用户对系统资源的使用,OS将计算机资源抽象为一组数据结构及操作命令(对象),然后再设
计出对这些抽象资源的管理软件,然后再将这些管理软件逐层覆盖在计算机硬件之上,于是便形成了一层
层的虚机器。这些虚机器是逐层系统软件覆盖在裸机上而成的逻辑计算机。os 是计算机资源的抽象
用于对计算机的操作多用于io处理上
第一层抽象i/o设备的管理
第二层抽象对文件的管理
第三层抽象对图形界面的管理
os 启动过程
此段在x86 pc 实模式下进行加载
开启电源的时候,cpu 处于实模式
实模式与保护模式对应
实模式的寻址方式实cs:ip (cs 左移4位 + ip)
开机时ip 又计算机硬件设计者设计
开机时cs=0xffff ip=0x0000寻址0xfff0
该地址通过(cs 左移4位 + ip),实模式下寻址而来检查ram,键盘。。。。
将磁盘0磁道0扇区中读出一个扇区也就是512 byte,放入0x7c00
这个512 就是系统的引导区设置cs=0x7c00 ip=0x0000
总的来说boot的工作就是读setup 和system
本质上来说,就只有两个问题
- 将操作系统读入内存
- 初始化操作系统
保护模式下的地址翻译和中断处理
在实模式中,也就是16位的寻址方式,通过cs<<4+ip 进行寻址
保护模式也就是32位模式
在这之前需要知道gdt 是什么
gdt
简介
gdt : global described table
GDT 是 x86 和 x86-64 体系结构中用来实现内存分段(memory segmentation)的重要数据结构。它是一个表,存储了段描述符(Segment Descriptor),每个描述符定义了内存段的基地址、大小和访问权限等信息。
GDT 的作用是在保护模式下帮助 CPU 通过段选择器(Segment Selector)访问特定的内存段。每个段可以配置为代码段、数据段或系统段,支持灵活的内存管理和保护机制。
组成结构
段描述符(Segment Descriptor)
段描述符是 8 字节的数据结构,包含以下字段:
基地址(Base Address):内存段的起始地址。
段界限(Limit):定义段的大小。
访问权限(Access Rights):控制段的访问模式(如只读、可执行等)。
GDTR 寄存器
GDTR 是一个专门的寄存器,用于存储 GDT 的地址和大小。
格式:
- Base:GDT 的基地址。
- Limit:GDT 的大小(最大 64KB)。
寻址方式
- 加载 GDT (全局描述符表)
使用 lgdt 指令来加载 GDT 的基地址和大小到 GDTR (全局描述符表寄存器)。
当保护模式被激活后,CPU 将自动使用 GDT 中的描述符来进行段落转换。
- 段选择器 (Segment Selector)
段选择器是一个 16 位的值,用于指向 GDT 表中的条目。
Index (13 位): 它指定了 GDT 表中的描述符位置。
TI (1 位): 表示描述符是在 GDT (0) 还是 LDT (1) 中。
RPL (2 位): 请求者特权级别 (Ring Privilege Level)。
段选择器可以通过 mov 或 jmp 指令加载到段寄存器中,比如 CS (代码段), DS (数据段), SS (堆栈段) 等。
- CPU 寻址过程
CPU 从段寄存器读取段选择器。
根据段选择器中的索引找到 GDT 中相应的描述符。
利用描述符里的基地址与偏移量计算得出线性地址: 线性地址 = 基地址 + 偏移量
操作系统的接口
本质就是一些操作函数
系统调用
举个例子为什么使用whoami 进行查找我的身份,不能直接mov 或者jmp 到对应的name 的字符串
因为操作系统内部有很多固定的,或者比较珍贵的东西,如果直接可以获取不能保证操作系统的安全调用
那么我该如何获取对应的身份信息? -> 只能通过操作系统给出某一个api,根据调用具体的某一个api获取相对应的数据
内核态和用户态
只要将内核态和用户态相互隔离就可以保证安全性
如何区分内核态和用户态
可以发现所有地址,都需要使用段寄存器
CPL 和 DPL
CPL 用于表示当前内存的权限等级
DPL 用于表示需要跳转的权限等级
所以0 表示内核态
CPL 通过cs 中的一个部分用于展示现在的特权级
所以每一条指令都会检查 DPL >= CPL
中断
中断时进入内核态唯一的方法
比如现在需要执行whoami 或者是open file 之内的
就需要出发中断,然后根据不同指令做出对应的操作
只有一个中断可以进入到内核 0x80