x86单核OS_草稿图
2025-06-20 20:34:13 1 举报
这张“x86单核OS_草稿图”可能指的是一个操作系统的高级设计或概念图,专门针对单核x86架构的处理器。草稿图作为一种视觉记录,强调的是思路和功能的初步布局,而不是详尽无遗的实现细节。这类图通常用不同的颜色或线条代表不同的核心组件,例如内存管理、进程调度、输入输出系统、文件系统等,并可能标注关键数据流或处理器核心的工作状态。 文件类型很可能是图片格式(如JPEG、PNG或PDF),以便于展示设计图纸和概要,易于查看核心操作系统组成部分如何在单核硬件平台上规划和连接。修饰语在描述草稿图时可能强调其概念性、初步性或未完善的特点,指明草图反映的是设计思路的初期阶段,未来可能有较大的调整和补充。
作者其他创作
大纲/内容
进程B
400M
7
6
5
4
3
2
1
0
M7
M6
M5
M4
M3
M2
M1
M0
后面的参数通过栈传参,栈中只压入了一个参数
硬盘驱动
index = 2
显卡
应用年代
使用场景
CGA
1981-1984
早期PC游戏、DOS命令行界面
EGA
1984-1987
工程制图、商业图形
VGA
1987-今(改良)
Windows图形界面、现代BIOS UI
256B
模式
内存地址范围
大小
文本模式
0xB8000~0xBFFFF
32KB
图形模式
0xB8000
通常只用到16KB
进程一
中断号
用途
描述
int 0x80
Linux系统调用入口
用户态程序向内核请求服务
int 3
调试断点
编译器/调试器插入,用于中断调试
int 0x10
BIOS显示服务
控制显卡、打印字符(实模式)
int 0x13
BIOS磁盘服务
扇区读取、写入等(实模式)
int 0x15
BIOS通用服务
比如检测内存、硬件状态
访问页表
ELFLAGS
CS
EIP
实模式下的内存布局
栈
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
Page Base Address
Avail
A
PCD
PWT
U/S
R/W
P
4KB一个Page
0x2000
软件开发人员
通过页表找到物理页框
屏幕驱动
4G虚拟内存
程序头表:高速操作系统如何加载
内存
选择一页换出
段基地址 = 0x100 * 16
idle/init/shell外壳进程、外壳任务(内核态)PCBfunction
0x4000
BSY
RDY
WFT
SKC
DRQ
COR
IDX
ERR
中断事件发生
D位为0表示16为模式
中断消息
住宅还是写字楼
LINT0
1KB
0x1000
内核
开辟栈帧(非必须)
保存上下文(非必须)
初始化开辟的栈帧空间(非必须)
业务逻辑(必须)
恢复上下文(非必须)
释放栈帧(非必须)
引入原因
说明
寄存器位数限制
模块化编程
把程序分为代码段、数据段、栈段,结构清晰
内存保护与管理
提供段界限和权限检查(尤其在保护模式)
支持共享与重定位
不同程序可以映射相同物理段,方便共享和内存重用
控制位
名称
是否常用
PE
保护模式启用
是
实模式->保护模式
PG
分页启用
虚拟内存/页表地址转换
EM
协处理器仿真
禁用硬件FPU
CD/NW
缓存控制
禁用缓存,用于测试或调试
WP
写保护
用户页面写保护增强安全
0x100
机器码
项目
内容说明
BIOS中断定义
BIOS提供的中断调用服务,用于访问硬件
使用方式
INT指令加上对应中断号
实模式程序、引导程序、DOS应用
现代替代
操作系统驱动程序(如Linux kernel驱动)
指向某个页表Page Table
方式
原理
特点
架构适用
软件中断
慢但简单
x86
sysenter
快速系统调用
快,需要设置MSR
syscall
快,现代Linux主流
x86-64
异常
CPU检测错误
被动陷入,自动中断处理
全架构
中断
外设信号
被动进入内核中断服务
call gate
特权们机制
传统机制,现代很少使用
x86实模式/保护模式
0x7c00
30B
文件头:整个文件的基本信息
TLB缓存
公开的接口层(开发者需要理解)
SFNM
BUF
M/S
AEOI
uPM
0xAFFFF
BIOS入口
PDPTE(4)2^2=4
OS功能
依赖CPU的什么机制
进程/线程管理
寄存器、中断、任务切换
内存管理
分页/分段机制
IO管理
中断机制,DMA
文件系统
CPU处理磁盘驱动程序
系统调用
特权级与中断指令
显存
+0x100
PTE
...
起始
结束
FFFF0
FFFFF
16B
BIOS入口地址,此地址也属于BIOS代码,同样属于顶部的640KB字节,只是为了强调其入口地址才单独贴出来。此处16字节的内容是跳转指令jmp f000: e05b
F0000
FFFEF
64KB-16B
C8000
EFFFF
160KB
映射硬件适配器的ROM或内存映射模式IO
C0000
C7FFF
显示适配器BIOS
B8000
BFFFF
用于文本模式显示适配器
A0000
AFFFF
64KB
用于黑白显示适配器
9FC00
9FFFF
用于彩色显示适配器
7E00
9FBFF
622080B约608KB
EBDA(Extended BIOS Data Area)扩展BIOS数据区
7C00
7DFF
512B
MBR被BIOS加载到此处,共512字节
500
7BFF
30464B约30KB
可用区域
400
4FF
BIOS Data Area(BIOS数据区)
000
3FF
Interrupt Vector Table(中断向量表)
用于链接分析
执行流
场景
推荐工具
原因说明
Windows平台下写汇编
MASM
与Visual Studio紧密集成
编写Bootloader/内核
NASM
Linux汇编/教学用途
高级宏/可读性+控制性
宏语法清晰、文档丰富
BIOS填充的中断向量表
溢出标志
大、便宜、慢(几十纳秒~几百纳秒)
PTT(4M)
......
一个段大小 = 64K
CPU架构
时间片较长
时间片较短
上下文切换少,CPU利用率高
响应速度快,适合交互式任务
响应慢,低优先级任务饿死风险高
上下文切换频繁,开销大
0x900
63
62
61
60
59
58
57
56
55
54
53
52
51
50
49
48
47
46
45
44
43
42
41
40
39
38
37
36
35
34
33
32
Reserved (set to 0)
Base Addr
中断处理程序目标代码段描述符选择子
中断处理程序在目标代码段内的偏移量的15~0位
PAT
G
D
0x1100
页号>页表长度?
由BIOS例程自动读入内存
分配器
Buddy Allocator
管理大块物理内存(页框级)
SLAB/SLUB/SLQB
管理小对象(结构体、链表等)
vmalloc
分配虚拟连续、物理不连续的内存
kmalloc
物理地址输出
用户态R3
扩展BIOS数据区
Windows
功能
内存分配
OS以页部件为单位进行物理内存分配
虚拟内存
虚拟地址通过页表映射到页部件,支持\"虚拟大、物理小\"
页面置换
将不常用的页部件换出磁盘(页置换算法如LRU)
页面保护
设置页部件属性(只读、只写、不可执行等)
页共享
多个进程可以共享同一个物理页部件
汇编器
页内偏移(12bit)
Reset or CR0.PE=0
进程A
1G-5G
指令集(ISA)定义了这些机器码的含义
index = 1
ELF Header
Program Header
Section Headers
.text Section
.data Section
.bss Section
。。。
汇编语言
MBR区域boot执行完就可以用这块内存了
ecx
Page Table(1024项)
PTE0
PTE1
参数压栈顺序自右向左
架构名称
类型
主要用途/代表厂商
是否主流
CISC
Intel/AMD电脑、服务器、Windows系统
非常主流
x86-64/x64
x86的64位扩展(Intel64/AMD64)
ARM
RISC
手机、平板、嵌入式设备、M1/M2芯片
RISC-V
开源架构,AI/教育/芯片新贵
快速兴起中
移动设备
开始
Java语言
地址空间隔离
每个进程都有独立的虚拟地址空间
物理内存保护
无法随意访问其他进程的内存
内存映射管理
支持mmap、共享内存等机制
支持虚拟内存
配合页面置换(Swap)实现虚拟内存
提供页级权限
控制读/写/执行权限
页内偏移(Offset)用于在页内定位字节(最多4KB)
中断使能标志
所在位置
速度
容量
作用
寄存器
CPU内部
最快
很小(几十个)
存储正在运算的数据和地址
CPU缓存
CPU芯片中
很快
KB~MB
缓解CPU与内存速度差
主内存(RAM)
主板上
较慢
GB级别
存储程序运行的数据与代码
程序执行中
PTE(512)2^9=512
方向标志
调用前输入
内存已满?
黑白显示适配器
800M
保护模式
服务器
特性
内联汇编
裸函数(__declspec)
独立汇编文件
嵌入位置
C/C++中直接嵌入
纯汇编实现,不带编译器栈帧
完全汇编独立
调用方式
普通函数
需要自己处理栈帧和返回值
用extern调用
支持平台
x86(MSVC)
通用
推荐用途
小段汇编优化
极端控制需求(如hook)
高级底层实现
虚拟8086模式
CPU
控制寄存器
用途描述
CR0
启用分页、保护模式控制
CR2
页面错误地址存储
CR3
页目录基址
CR4
启用SSE、SMEP等扩展功能
CR8(x64)
中断优先级控制
BIOS数据区
用户态
微内核源码
中断信号
裸函数(Naked Function)
定义方式
在C/C++函数体内部嵌入汇编指令
用__declspec(naked)声明函数,完全手写汇编
由谁管理栈帧
编译器自动处理
开发者手动处理(无自动prologue/epilogue)
支持寄存器变量
编译器配合使用
你全权负责
使用范围
小段汇编、插入优化点
完全控制汇编流程、hook、跳板
平台支持
x86(Windows MSVC), GCC支持所有架构
仅支持MSVC x86架构(x64不支持)
调试/维护性
较强,可读性高
较差,写错很容易崩溃
setup.o
0x3000
由setup读入内存
CISC指令集
我们写OS可用
操作系统
mov eax[0x1100]
Request Privilege Level (RPL:)
写入内存
1. CPU提供的关键机制
节区头表: 告诉链接器如何链接
Page-Table Entry(4-KByte Page)
页表基址
有效位
PS
Java虚拟机
嵌入式系统
由调用方平栈
值
段选择子Index位数
13位
段表最大项数
2^13=8192项
每项大小
8字节
GDT总大小上限
Page-Directory-Pointer-Table Entry
对比项
多线程
协程
核心利用率
高(多个线程可上多个核)
低(默认单线程)
自动抢占
是(操作系统抢占式调度)
否(需要显式yield/await)
CPU亲和性
自动分配多个核心
通常只绑定一个核心
适合任务
计算密集(视频编码/图像处理)
IO密集型(网络、磁盘、数据库)
缺点
易产生内存碎片
个段大小不一致,释放难管理
地址计算复杂
多步转换,性能开销较大
不支持虚拟内存
无法灵活进行页面换入换出
动态性差
段表项数量有限,不利于频繁变更
不利于细粒度内存保护
不如分页支持按页设置权限
现代操作系统已基本弃用
常用于兼容、启动阶段的必要配置
0x7DFF
由硬件执行
文本模式显示适配器
压栈内容
用户态指令地址(返回点)
用户态代码段选择子
EFLAGS
标志寄存器
ESP
用户态栈顶指针
SS
用户态栈段选择子
LINT1
执行main函数写入软盘
ICW1格式
地址范围描述符结构ARDS
进程C
页目录索引
10 bits
软盘
GDT是什么
一张在内存中的表,用于描述所有内存段的信息
用来干嘛
提供段的基址、大小、权限等
保护模式必需吗?
是,保护模式下所有内存访问都依赖GDT或LDT
和段寄存器关系
段寄存器存的是选择子,选择子索引GDT条目
现代系统如何用
常配置成\"平坦模型\", 段基址位0,大小为4GB
CPU功能
操作系统如何使用
中断机制
响应硬件时间、系统调用、异常处理
特权级机制(Ring)
实现用户态和内核态隔离,保护系统安全
分页和分段机制
支持虚拟内存和内存保护
定时器中断
多任务调度(时间片轮转)
寄存器与指令集
构建上下文切换、函数调用、驱动控制等基本操作
4G
1M
低地址
55 aa
user program
系统
32位最大内存支持
64位最大内存支持
Windows 32位
3.2~4GB(依版本)
-
Windows 64位
Linux 32位
4GB(PAE: 64GB)
理论支持TB级别(受配置限制)
指令集ISA
BIOS入口地址,此地址也属于BIOS代码,同样属于顶部的640KB字节,只是为了强调其入口菜单独贴出来,此处16字节的内容是跳转指令jmp f000:e05b
64KB·16B
系统BIOS范围是F0000~FFFFF共640KB,为说明入口地址,将最上面的16字节从此处去掉了,所以此处终止地址是0XFFFEF
映射硬件适配器的ROM或内存映射式I/O
B0000
B7FFF
copy_process()
BIOS代码区
Table Indicator0 = GDT1 = LDT
setup.oseek = 1 count = 2
1023
偏移
越界中断
从片 ICW3格式
页目录索引(PDI)
影响因素
CPU寻址能力
位数决定了最大可寻址内存
OS内核设计限制
是否支持PAE、是否64位
主板硬件/固件支持
内存插槽、最大容量、芯片组限制
MMIO内存映射影响
某些设备会占用部分物理内存地址空间
CPU恢复上下文
0柱面0磁道0扇区
esp
个人电脑
0xEFFFF
C++
printpython
esp + 4
boot.o
IO端口
读操作
写操作
0x1F0
Data(16bit)
0x1F1
Error
Precomp(不用)
0x1F2
Sector Count
0x1F3
LBA low
0x1F4
LBA mid
0x1F5
LBA high
0x1F6
Device/Head
0x1F7
Status
Command
0x3F6
Alternate Status
Device Control
PTT表
esp
创建0号idle进程1.shell(Linux)2.图形界面(Windows)
ebp
修改访问位和修改位
10bitsDirectory
L2 Cache(二级缓存)
页表(Page Table)
存储虚拟地址到物理地址的映射
指向当前使用的页目录(或PML4)
TLB
页表缓存,加速虚拟地址的转换
CR0.PG
打开分页的开关位
控制是否启用扩展分页
中断处理程序在目标段内的偏移量的31~16位
DPL
TYPED1111
未使用
页表机制
分配内存
Local APIC
高2G(内核空间)所有进程共享
系统/平台
典型时间片长度
Linux(默认CFS)
3ms到100ms之间
10ms到20ms
RTOS(实时系统)
可配置,通常1ms以内
Android
macOS
与BSD类似,约10ms左右
符号标志
系统管理模式
CISC(Complex Instruction Set Computer)
RISC(Reduced Instruction Set Computer)
指令集大小
指令多、复杂,种类多
指令少、简单,种类少
指令长度
可变长度(如1~15字节,x86)
定长指令(如ARM、RISC-V: 4字节)
执行周期
单挑指令执行周期较多
大多指令一个周期完成
硬件复杂性
高: 需解码多种复杂指令
低:指令解码简单
编译器负担
大,需要编译器将复杂操作拆分成多个简单指令
存储空间使用
通常较省(单条指令功能强)
相对多(需多条指令完成相同功能)
流水线实现难度
高,因指令长度不一致
易于实现,结构统一
能效比(性能/功耗)
相对较低
更高,适合移动设备
LTIM
ADI
SNGL
IC4
类别
示例
硬中断
键盘输入、网卡数据到达、定时器等
来自外部设备
软中断
由程序主动发起
异常中断
除零错误、非法访问
由CPU检测错误引发
可屏蔽中断(IRQ)
大部分设备中断
可以被进制(CLI)
不可屏蔽中断(NMI)
内存故障、硬件紧急信号
无法屏蔽,必须处理
超级计算机
0x500
用户态进入内核态委托内核帮我们操作硬件
PTE(4KB页表)
valid
32-bit101012分页
64位模式
页目录索引(PDI)用于选择页目录中的一项
虚拟地址(32位)
低32位
内核态
4-level paging999912分页
用汇编写的微内核源码
10-12G
ICW4格式
项
数值
页大小
4KB
每个页表项数
1024
每个页表映射
4MB
页目录项数
总共映射
1024 X 4MB = 4GB
协程适合
IO密集型
非常适合
异步非阻塞,不切内核上下文,效率极高
CPU密集型
不适合
无法抢占,不能并行,多核利用率低,调度受限
实时处理(嵌入式)
谨慎
协程调度不可控、不可抢占,不适合强实时需求
物理内存管理模块位图
页表区域
boot(一个扇区)
内核区域
系统数据区
setup(两个扇区)
优点
内存隔离
每个进程有独立的虚拟空间
物理内存不足时可以换页
防止内存碎片
页大小固定,易于管理
实现按需加载(懒加载)
程序运行时才加载相关页面
物理内存
ebx
esi
edi
0x9fbff(内核栈顶)
页部件(Page Frame)
本质
物理内存的一块区域
存储虚拟页和物理页部件之间映射的表结构
存储位置
在RAM中
通常页存在于RAM中
实际存放程序/数据的地方
映射虚拟地址->物理页部件
跳转中断向量表
通用寄存器
存储操作数/中间结果
EAX、EBX、ECX、EDX(x86)
指令相关寄存器
指令流控制
EIP/RIP、FLAGS
段寄存器
分段内存访问(已较少使用)
CS、DS、ES、FS、GS、SS
控制分页、内存管理等(系统用)
浮点/MMX/SIMD
浮点/多媒体/向量计算
ST(0)~ST(7)、XMM0~XMM31等
特殊寄存器
系统级调试、中断等控制
GDTR、IDTR、TR、DRx等
该页被修改否
虚拟地址
内存驱动
system.out.printlnjava
0x1200
找到最终物理地址
从物理页框+Offset定位最终物理地址
奇偶标志
JCC指令
中文含义
英文原意
检查符号位
典型C应用
JE/JZ
若为0则跳转;若相等则跳转
jump if equal
ZF=1
if(i==j);if(i==0);
JNE/JNE
若不为0则跳转;若不相等则跳转
jump if not zero;jump if not equal
ZF=0
if(i != j); if (i !=0);
JS
若为负则跳转
jump if sign
SF=1
if (i < 0);
JNS
若为正则跳转
jump if not sign
SF=0
if (i > 0);
JP/JPE
若1出现次数为偶数则跳转
jump if Parity(Even)
PF=1
(null)
JNP/JPO
若1出现次数为奇数则跳转
jump if not parity(odd)
PF=0
JO
若溢出则跳转
jump if overflow
OF=1
JNO
若无溢出则跳转
jump if not overflow
OF=0
JC/JB/JNAE
若进位则跳转;若低于则跳转;若不高于等于则跳转
jump if carry; jump if below; jump if not above equal
CF=1
if(i < j);
JNC/JNB/JAE
若无进位则跳转;若不低于则跳转;若高于等于则跳转
jump if not carry; jump if not below; jump if above equal
CF=0
if(i>=j);
JBE/JNA
若低于等于则跳转;若不高于则跳转
jump if below equal; jump if not above
ZF=1或CF=1
if(i <= j);
JNBE/JA
若不低于等于则跳转;若高于则跳转
jump if not below equal; jump if above
ZF=0或CF=0
if(i >j);
JL/JNGE
若小于则跳转;若不大于等于则跳转
jump if less; jump if not greter equal jump
SF != OF
if (si < sj);
JNL/JGE
若不小于则跳转;若大于等于则跳转
jump if not less; jump if greater equal
SF=OF
if(si >= sj);
JLE/JNG
若小于等于则跳转;若不大于则跳转;
jump if less equal;jump if not greater
ZF !=OF或ZF=1
if (si <= sj);
JNLE/JG
若不小于等于则跳转;若大于则跳转
jump if not less equal; jump if greater
SF=OF且ZF=0
if(si > sj)
区域名
作用说明
ZONE_DMA
适用于DMA(Direct Memory Access)设备
ZONE_NORMAL
可被常规内核使用
ZONE_HIGHMEN
高端内存,仅用于用户空间,内核空间不可直接映射
Mac M1芯片, ARM芯片
Reset or RSM
编译
sys_fork() or clone()
段最大大小
实模式
偏移地址是16位,最大偏移是0xFFFF
最多4GB
段描述符中Limit + G位可控制更大范围
节点
.text
程序代码
.data
已初始化的全局变量
.bss
未初始化的全局变量(运行时清零)
.rodata
只读数据(字符串常量)
.symtab
符号表
.strtab
字符串表
.real.text
重定位信息
主存(RAM)
高地址
AP
我们用汇编写的微内核源码
机器码(0和1)
物理内存管理模块(自实现)
否
处理器运行模式转换图
比内存块,但比L1慢(共享)
index = 3
硬盘、SSD等
地址分配
写时复制
主片 ICW3格式
施工队C
伪指令
功能说明
SECTION/SEGMENT
section .text
GLOBAL
声明符号为全局,供链接器使用(如_start)
global _start
EXTERN
声明外部符号(如调用C函数)
extern printf
ORG
指定起始地址(如bootloader使用)
org 0x7c00
EQU
定义常量
BUF_SIZE equ 512
TIMES
重复生成一条指令或数据
times 510 db 0
ALIGN
对齐数据或指令到指定边界
align 16
INCBIN
包含二进制文件内容
incbin \"kernel.bin\"
%define
定义宏(文本替换)
%define CR 0x0D
%include
包含其他源文件
%include \"macros.inc\"
resb 64
进位标志
EFLAGS.VM=0
汇编
0 | 3
内容
全称
Executable and Linkable Format
Linux/Unix下的标准程序文件格式
常量类型
可执行文件、目标文件、共享库、core dump
查看工具
readelf、objdump、nm
关键组成
ELF Header、Program Header、Section Header、各段
PAE Paging29912分页
Page-Directory Entry(2-MByte Page)
D位为1表示32为模式
Physical Page Frame(4KB)
0xBFFFF
由被调用方平栈
Page-Directory Entry(4-KByte Page Table)
端口地址范围
分配说明
0x000~0x01F
8237A DMA控制器1
0x1F0~0x1F7
IDE硬盘控制器0
0x020~0x03F
8259A 可编程中断控制器1
0x278~0x27F
并行打印机端口2
0x040~0x05F
8253/8254A 定时计数器
0x2F8~0x2FF
串行控制器2
0x060~0x06F
8042 键盘控制器
0x378~0x37F
并行打印机端口1
0x070~0x07F
访问CMOS RAM/实时时钟RTC(Real Time Clock)端口
0x3B0~0x3BF
单色MDA显示控制器
0x080~0x09F
DMA页面寄存器访问端口
0x3C0~0x3CF
彩色CGA显示控制器
0x0A0~0x0BF
8259A可编程中断控制器2
0x3D0~0x3DF
彩色EGA/VGA显示控制器
0x0C0~0x0DF
8237A DMA控制器2
0x3F0~0x3F7
软盘控制器
0x0F0~0x0FF
协处理器访问端口
0x3F8~0x3FF
串行控制器1
0x170~0x177
IDE硬盘控制器1
12-21PTT Index
形成物理地址
3扇区
存储级别
访问延迟(单位:CPU周期)
L1 Cache
3~5
L2 Cache
10~20
L3 Cache
20~50
内存(RAM)
100~300
SSD/硬盘
10万以上
PDE(4KB页表)
Intel/MASM/NASM
AT&T
将ebx放入eax
立即数加法
访问内存地址
PDPTE0
PDPTE1
PDPTE2
PDPTE3
PDT
RISC指令集
RSM
字段名
含义
SS0
特权级0的栈段选择子
ESP0
特权级0的栈顶地址
模型
示例语言
1:1
每个协程绑定一个线程(资源消耗大)
传统线程库
N:1
多个协程绑定一个线程(无法并行)
Python asyncio、Lua
M:N
多个协程分配到多个线程(高效调度)
Go(goroutine调度器)
共享内存
PDE(512)2^9=512
OCW1格式
NMI
内存映射式IO
线程(Thread)
协程(Coroutine)
所在层级
操作系统层
用户程序层(通常由语言或框架实现)
是否可并行
支持多核并行
默认单线程,不能并行
创建开销
高(涉及内核、栈分配)
低(只需要保存少量上下文)
上下文切换开销
高(进入内核态,保存全部寄存器状态)
低(纯用户态切换)
切换方式
被操作系统强制抢占
自己主动yield/await
调度器
操作系统调度器
自定义调度器(如Go runtime、asyncio)
典型用途
CPU密集型、需要并行的场景
IO密集型、高并发连接(如网络服务)
0x7BFF
edx
0x4FF
加上偏移形成物理地址
null
code段描述符
data段描述符
TSS描述符
INTR
高速缓存器
1B
内核进入用户态
L3 Cache(三级缓存)
APIC总线或者系统总线
SS3(用户态段选择子)
ESP3(用户态栈顶指针)
EFLAGS(中断标志)
CS3(用户态代码段)
EIP(用户态指令地址)
缩写
中文
Page Directory Table
页目录表
管理多个页表,索引页表的地址
PT
Page Table
页表
管理多个页框,映射虚拟页到物理页
PTT
Page Table Table
非标准术语
通常是误称或重复表述,应指Page Table
0x9FBFF
各个段/节内容
架构
物理寻址位宽
可支持的最大物理内存
x86(32位)
4GB(无PAE)/64GB(PAE)
x86_64(64位)
最多支持52位物理地址线
4PB(理论上)但实际受限于主板/OS
ARMv8-A 64位
最多48~52位寻址
理论256TB以上
异常号
#DE
除0异常
除法除以0
#DB
调试异常
单步执行、断点命中
#NMI
非屏蔽中断
硬件专用,紧急中断
#BP
断点异常
INT3指令触发
#OF
溢出异常
INTO指令触发
#BR
边界范围异常
BOUND指令检查数组越界
#UD
非法指令
执行未定义的CPU指令
#NM
协处理器不可用
FPU/NMX/SSE不可用时触发
#DF
双重故障
CPU处理异常时再次异常(严重)
#TS
无效的TSS
切换任务失败
#NP
段不可用
加载段时失败(保护模式)
#SS
栈段错误
栈溢出或访问非法栈段
#GP
通用保护错误
权限错误、访问非法内存、GDT\\LDT越界等
#PF
页错误(Page Fault)
虚拟地址无效或权限不足(虚拟内存核心)
#MF
浮点错误
FPU执行错误
#AC
对齐检查
内存访问未对齐(x86默认不开启)
#MC
机器检查
CPU硬件故障(如ECC错误)
#XF
SIMD浮点异常
SSE执行错误
中断处理完成
GDTR
32位
含义和来源
最初指16位的8086处理器,后来泛指整个x86架构(包括32位和64位)
指基于x86向后兼容的64位扩展架构,由AMD于1999年提出
AMD64
AMD给它的官方名字,早期主导者
Intel 64
英特尔对其兼容实现的称呼(最早叫EM64T)
x64
是x86-64的简写商品名,微软和市场常用说法
Program Header Table
Section Header Table
.text /.data / .bss
比较项
MASM/NASM(Intel风格)
AT&T风格(GNU系列,如gas)
操作数顺序
寄存器前缀
无:eax.ebx
立即数前缀
无: 10
有: $10
指令后缀
无:mov
有:movl (表示操作数大小)
地址前缀
CPU(中央处理器)
操作系统(Operating System)
硬件
软件
执行指令,处理数据
管理资源,调度程序,控制系统运行
任务重点
做\"计算\"和\"控制\"
管\"谁来计算\"、\"什么时候计算\"
选择
插入关键路径的汇编优化
完整控制函数指令执行流程(如钩子、Shellcode)
裸函数
实现系统及API、跳板函数、hook、调试辅助
一般性能优化、访问CPU指令(如rdtsc、cpuid)
S7
S6
S5
S4
S3
S2
S1
S0
陷阱门描述符格式
ICW2格式
物理页地址
200M
esp + 8
1024B
寄存器或状态位
参数用途
CF位
若CF位为0表示调用未出错,CF为1,表示调用出错
EAX
字符串SMAP的ASCII码0x534d4150
ES:DI
ARDS缓存区地址,同输入值是一样的,返回时此结构中已经被BIOS填充了内存信息
ECX
BIOS写入到ES:DI所指向的ARDS结构中的字节数,BIOS最小写入20字节
EBX
后续值:下一个ARDS的位置,每次中断返回后,BIOS会更新此值,BIOS通过此值可以找到下一个待返回的ARDS结构,我们不需要改变EBX的值,下一次中断调用时还会用到它,在CF位为0的情况下,若返回后的EBX值为0,表示这是最后一个ARDS结构
类比方式
操作系统vs用户
线程由操作系统管理,协程由程序自己管理
高铁vs地铁
线程像高铁:成本高、效率高,但换乘复杂,协程像地铁:轻量、频繁调度,但不能跨城运行
608KB
Intel芯片
进程二
通过页目录找到页表
....
0x3FF
BSP
位段
位数
31~30
PDPTE索引
29~21
PDE索引(页目录表项)
20~12
PTE索引(页表表项)
11~0
页内偏移
物理内存内存条
将一页从外存换入内存
0x9FFFF
Reset
属性
虚拟地址宽度
32位(4GB)
物理地址宽度(PAE)
36位
每个页大小
4KB(或2MB大页)
每个页表项地址字段宽度
24位(x 4KB)
可寻址物理内存上限
2^24 x 4KB = 64GB
地址位宽
20位
可寻址空间
2^20=1MB(1048576字节)
实际内存可能更大
是,但实模式下无法直接访问
超过1MB如何访问
内核线程把CPU的执行流包装成任务体系
IRQ号
中断源
IRQ0
定时器(PIT)
控制操作系统时间片
IRQ1
键盘
用户案件输入
IRQ2
可编程中断级联(PIC)
从片接入点
IRQ3
串口COM2
通讯设备中断(旧设备常见)
IRQ4
串口COM1
同上
IRQ5
LPT2或声卡
打印机或音频中断
IRQ6
软盘读写中断
IRQ7
LPT1
打印机(并口1)
IRQ8
实时时钟(RTC)
CMOS时钟中断
IRQ9
可编程中断重定向
映射给ACPI或网卡
IRQ10~15
网卡、USB、硬盘等
PCI/USB/SATA设备中断
CPU架构实现
C语言
修改快表
最快、最小、最贵(纳秒级)
字节偏移量
属性名称
BaseAddrLow
基地址的低32位
BaseAddrHigh
基地址的高32位
LengthLow
内存长度的低32位,以字节为单位
LengthHigh
内存长度的高32位,以字节为单位
Type
本段内存的类型
页在内存?
前两个参数使用寄存器传参
esp + 12
esp + 16
根据所提交的地址所在范围将地址映射到不同的存储设备
MMU
段基址
段寄存器 x 16
从描述符中读取(32位)
段大小限制
最大64KB(偏移16位)
最大4GB(20位Limit + 粒度)
段长度单位
字节
字节(G=0)或页(G=1)
高32位
地址变换结束
G位
实际克表示的段最大大小
Limit单位字节(Byte)
最大段大小为1MB(2^20字节)
Limit单位为4KB(页)
最大段大小为4GB(2^20 x 4KB)
模块
页框(Page Frame)
物理内存最小分配单位,通常为4KB
虚拟页->物理页的映射
管理策略
位图、链表、伙伴系统、Slab等
kmalloc、vmalloc、slab、buddy
隔离机制
虚拟内存+页保护权限+页表管理
缺页异常
10 bitsTable
标志
用途示例
CF(Carry)
无符号加法进位或减法借位
多字节加法、逻辑移位
ZF(Zero)
运算结果为0时置位
SF(Sign)
结果为负时(最高位为1)
判断正负
OF(Overflow)
有符号运算溢出
溢出判断
PF(Parity)
偶位验位(结果中最低字节的奇偶)
极少用
DF(Direction)
串指令方向控制位
如MOVS, LODS串处理指令
IF(Interrupt)
中断是否允许
操作系统控制硬件中断
AF(Auxiliary Carry)
辅助进位(主要用于BCD)
DAA指令相关,现已较少使用
是否需要修改CR0
切换到保护模式
设置PE位
启用分页机制(虚拟内存)
设置PG位
禁用缓存(调试)
设置CD/NW位
支持浮点运算
清除EM位
由boot读入内存
CPU(运算核心)
特定用途,我们写OS不可用
L1 Cache(一级缓存)
64位
ID2
ID1
ID0
页部件MMU
PDPI:2
文件类型
可执行文件
最终编译出来能运行的程序(如bin/ls)
可重定位文件
.o文件,未链接的目标代码
共享目标文件
.so文件,动态链接库
核心转储
程序崩溃时生成的内存快照
输出printf
代码
第31位PG开启分页,PE表示保护模式
存储页表根地址(页目录或PML4地址)
控制是否启用PAE、全局页等扩展特性
0x20000
问题
保护模式如何解决
实模式下段最大只能64KB
保护模式用20位Limit + G位突破限制
如何实现段最大4GB
为什么现在系统段都是4GB
便于构造\"平坦内存模型\",用分页做隔离
分段机制
分页机制
地址连续性需求
高
不需要连续
内存粒度
粗(段)
精细(页)
虚拟内存支持
不便
原生支持
多任务隔离
有限
强隔离(独立页表)
程序共享
难
容易(页映射)
是否现代主流机制
是(所有现代OS使用)
位
Protection Enable
开启保护模式(从实模式进入,保护模式必须设置)
MP
Monitor Coprocessor
控制WAIT/FWAIT是否检查协处理器状态
Emulation
设为1时,禁用协处理器,启用软浮点仿真
TS
Task Switched
控制浮点协处理器在任务切换时的使用
ET
Extension Type
标识使用哪种类型的协处理器(一般=1)
NE
Numeric Error
启用浮点异常(与INT 16中断机制相关)
Write Protect
在内核态也不能写用户只读页(页保护)
NW
Not Write-through
禁止write-through缓存策略
CD
Cache Disable
禁用CPU缓存(调试/测试用)
Paging
开启分页机制(需要在保护模式下启用)
LBA
DRV
Head Number
段部件段权限检查
0x1000 | 3
寄存器示例
FPU
ST(0)~ST(7)
80位浮点栈式寄存器
MMX
MM0~MM7
多媒体扩展(已被SSE替代)
SSE
XMM0~XMM15(x64到XMM31)
SIMD(128位),用于浮点/向量运算
AVX
YMM0~YMM31
SIMD(256位)
AVX-512
ZMM0~ZMM31
SIMD(512位)
12 bitsOffset
修改页表
511
Linux
硬件(芯片逻辑电路)
SMI#
4KB页框
内存条
语法维度
MASM示例
NASM示例
区别说明
数据定义
myVar BYTE \"hello\"
myVar db 'hello'
NASM使用更简洁的db、dw等指令
宏定义
MYMACRO MACRO ...ENDM
%macro....%endmacro
NASM使用%macro标准语法
段定义
.data / .code
section .datasection .text
MASM使用传统DOS风格;NASM类UNIX
符号处理
支持结构体、堆栈帧较复杂
更注重裸机编程、空值粒度更细
用于运行加载
创建进程1(init进程)
将该页写回外存
继续执行原程序
页表项(PTE)
user_entry
地址映射
将虚拟地址转换位物理地址
内存保护
通过页表权限防止非法访问
支持分页机制,实现进程隔离核内存扩展
性能优化
使用TLB缓存地址映射
操作系统依赖
操作系统必须配置页表核开启MMU
功能类型
常见调用用途
INT 10h
视频服务
设置分辨率、输出字符、滚屏等
INT 13h
磁盘服务
读取/写入软盘或硬盘
INT 14h
串口通信
访问串口,比如调试串口打印
INT 15h
杂项服务
各种辅助功能(如等待、内存检测)
INT 16h
键盘服务
读取键盘输入
INT 17h
打印机服务
向并口打印输出数据
INT 1Ah
时间与CMOS服务
获取系统时间、访问实时时钟
页目录项(PDT)
编译器
Type值
AddressRangeMemory
这段内存可以被操作系统使用
AddressRangeReserved
内存使用中或者被系统保留,操作系统不可以用此内存
其他
未定义
未定义,将来会用到,目前保留,但是需要操作系统一样将其视为ARR(AddressRangeReserved)
返回值
提交地址
EFLAGS.VM=1
从外存中找到缺页
执行中断程序
检测接口
INT 0x15 E820(推荐), 或0x88(老)
目标
获取所有物理内存段及属性
多次调用,直到EBX=0
应用
初始化页管理、构建页表、内核堆分配等
CR0.PR=1
0x7e00
OF
DF
IF
TF
SF
ZF
AF
PF
CF
启动IO硬件
用于选中页目录中的某一项
页表索引(PTI)
用于选中页表中的某一项
业内偏移
页内地址偏移,页大小=2^12=4KB
0-11物理偏移
保存CPU现场
工程材料
fork
x64(64位)
RAX
累加器,通常用于返回值
RBX
基址寄存器
RCX
计数器(如循环)
EDX
RDX
数据寄存器
ESI
RSI
源索引寄存器
EDI
RDI
目标索引寄存器
EBP
RBP
栈基址寄存器
RSP
栈顶指针寄存器
R8~R15
x64新增的8个寄存器
页表索引
ROM
缺页中断处理
8259
0xC7FFF
对比点
MASM(微软汇编器)
NASM(开源跨平台)
平台
Windows专用
跨平台(Win/Linux)
风格
微软风格,稍复杂
Intel风格,简洁一致
编译格式
COFF/OBJ
ELF/BIN/COFF等
宏系统
强但语法冗长
简洁、结构清晰
裸机支持
不强
强(支持.bin)
学习资源
相对少
很多,广泛教学使用
页目录项(PDE)
区间
范围
0-31
0x00-0x1F
CPU异常
32-47
0x20-0x2F
外设硬件中断(IRQ)
48-255
0x30-0xFF
软件中断/用户自定义中断
CPU检查快表
os kernelseek = 3 count = 60
600M
os kernel
层级结构
地址支持
32位分页
2层(PD+PT)
4GB虚拟/4GB物理
PAE分页
3层
4GB虚拟/64GB物理
64位分页
4层
256TB虚拟/64TB物理
方面
共同特点
内核调度
都是用户态调度,不会触发内核线程调度,更轻量
可控切换
都支持手动切换执行权,不会像线程那样被系统打断
状态保存
都可以保存上下文(寄存器+栈),实现挂起和恢复
高并发适合
都非常适合高并发IO密集型任务,效率远高于线程
运行于线程中
都可以在一个线程中运行多个协程/纤程
RISC指令架构
更慢(微秒~毫秒),不直接参与运算
IO APIC
index = 0
PDE0
PDE1
5-level paging999912分页
协程Coroutine
纤程Fiber
定义来源
源于编程语言/抽象模型,如Python/Go/C++
Windows操作系统定义的概念Windows Fiber
调度机制
通常是框架调度(如Go Scheduler)
必须由用户手动调度(如SwitchToFiber)
控制流语法支持
语言可能提供await/yield等原生语法支持
通常需要调用API手动切换控制权
底层抽象
语言层级抽象,和线程无强制绑定
Windows中每个Fiber运行在一个线程上
栈空间
每个协程可以分配独立栈或共享栈池
每个纤程是一个完整的栈(固定或动态大小)
与线程的关系
多协程可以映射到少量线程(M:N模型)
一个线程需要线转为fiber才能执行纤程
场景使用
多用于语言层的异步编程(如Python/Go)
多用于底层调度场景,如游戏引擎、系统内核
创建内核线程
T7
T6
T5
T4
T3
单步标志
零标志
PDT表
CPU从外存读缺页
CISC架构
出品方
微软官方(Miscrosoft)
开源项目(Netwide Assembler)
诞生时间
1981年,历史悠久
1996年,偏现代、开源社区维护
适用平台
Windows专属
跨平台(Windows、Linux、macOS)
页表地址
进程三
22-31PDT Index
显卡标准
发布年代
分辨率范围
色彩数
显存大小
Color Graphics Adapater
1981年
320X200/640X200
最多4色
16KB
Enhanced
1984年
640X350
最多16色
Video Graphics Array
1987年
640X480(图形)720X400(文本)
最多256色
256KB
PDE
工程图纸
真正执行ISA的硬件结构设计
权限等级
执行内容
谁来控制切换
低权限
普通应用程序
操作系统+CPU特权机制
高权限
操作系统核心、驱动程序
操作系统控制
体系结构
支持分页级数
2级/3级/4级分页
4KB、2MB、4MB
多级页表
支持4KB~64KB页
Intel x86芯片
寄存器(Register)
0x3000 | 3
2. OS使用CPU实现的关键功能
指令指针
存储下一条执行指令地址(x86)
RIP
x64版本(64位)
存储运算结果的标志位
虚拟内存管理模块(自实现)SLAB、伙伴算法
Segment Selector
是什么?
面向架构
关键特点
Microsoft汇编器
微软官方工具,语法贴近Intel文档
Netwide汇编器
开源、跨平台,语法也偏Intel风格
汇编语法风格(不是汇编器)
一种CPU架构(含汇编指令)
用于移动设备、嵌入式等,输入RISC架构
指向物理页框 base address
地址总线
数据总线
方向
单项(CPU->设备)
双向(CPU↔设备)
选择地址
传输数据
位数影响
决定最大可寻址空间
决定每次能传输的数据大小
此颜色表示有特定用途,我们写OS也可用
页表索引(PTI)用于选择页表中的一项
页目录项个数
地址字段宽度
支持的物理地址空间
普通32位分页
PDE 1024
4字节
20(31~12位表示页表地址)
2^20 x 4KB=4GB
PAE模式
PDE 512
24位(高4位+低20位)
2^24 x 4KB=64GB
base、limit、权限
gdtr寄存器
页(Page)
虚拟内存的基本单位,一般大小为4KB
物理内存的基本单位,也通常为4KB
存放虚拟页->物理页框的映射关系
CR3寄存器
存储当前页目录表的物理地址
TLB(Translation Lookaside Buffer)
页表缓存,加快地址转换速度
Index
TI
RPL
do_fork()
上手难度
高(微软风格冗长、文档少)
低(语法直观,教程丰富)
汇编+链接流程
偏传统,需用link.exe
教学/实验使用广泛性
较少(主要在Windows教程中)
高(如操作系统课程、裸机开发)
特征
显示输出接口
RCA/TTL
DE-9(9针 D-Sub)
15针VGA(D-Sub)
字符模式支持
80x25
80x25 / 720x400
扫描频率
固定(~15.75kHz)
更高
可变(31.5kHz)
兼容性
向下兼容CGA
向下兼容EGA、CGA
BIOS支持
基本
增强
更全面(VESA后更灵活)
编译器/汇编器
屏幕驱动、显卡驱动
700M
地址总线位宽
16位
2^16=64KB
2^20=1MB(8086)
2^32=4GB(x86)
2^36=64GB(部分x86 PAE)
指令集规范
内核态R0
页表项在快表中
CPU保存上下文
保留
AM
开启分页
Page-Directory Base Address
Reserved
Res
0xFFFEF
PDI:9
高级语言(C/C++)
CISC指令架构
100M
维度
默认输出格式
.obj(COFF)
.obj/.bin/.elf/.ext等
支持裸机输出
不方便
非常方便(常用于Bootloader、内核)
与C配合(Win)
完美兼容MSVC
可配合MSVC/ MinGW
与C配合(Linux)
不支持
非常方便配合GCC
页表项索引(PTI)
代码段
DS
数据段
栈段
ES/FS/GS
扩展段(常用于线程局部存储)
0xB7FFF
子功能号; EAX寄存器用来指定子功能号,此处输入位0xE820
ARDS缓冲区:BIOS将获取到得内存信息i写入此寄存器指向得内存,每次都以ARDS格式返回
ARDS结构的字节大小:用来指示BIOS写入的字节数,调用者和BIOS都同时支持的大小是20字节,将来也许会扩展此结构
fork()
GDT表
printkLinux内核
32位逻辑地址
彩色显示适配器
辅助进位标志
ld
中等快,中等容量(100KB~1MB)
转换+权限检查
施工队A(汇编)
施工队B
CPU架构(x86等)
0 条评论
下一页
为你推荐
查看更多