x64_草稿图
2025-07-09 17:35:39 1 举报
手写x64操作系统_草稿图
作者其他创作
大纲/内容
内核态
31
Base Address 15:00
32位
4G
160KB
Processor System Bus
RSDTACPI 2.0
0x134
63
62
61
60
59
58
57
56
55
54
53
52
51
32
XD
忽略
页目录指针表的物理地址(51-32)
0
没有
rflags
中断消息
执行流
4级头表 4-level pt
1.长跳转2.模拟中断返回3.模拟sysret4.模拟sysexit
进入用户态
0x500
中断信号
内核线程
高2G(内核空间)所有进程共享
地址范围描述符结构的Type字段
不跨态,CPU自动压入三个
微内核源码
0xeffff
boot.asm
8259
模式
地址构成
是否用段寄存器
是否分页
权限检查
实模式
段基址 * 16 + 偏移
必须
❌无
❌无特权级
保护模式
段描述符.base + 偏移
可选
段+页表权限
兼容模式(32位)
同上(保护模式)
通常开启
同保护模式
长模式(64位)
线性地址=偏移(+FS/GS base)
❌(除了FS/GS)
仅页表权限为主
LINT1
NMI
1
中断处理过程在目标代码段内的偏移量63~32
0x13a
执行main函数写入软盘
64KB
setup.o
limit
进程一
gdtr寄存器
CR0.PE=1
CPU
Local APIC
0x7c00(内核栈)
0xfffef
获取段基址(如0x00400000)
RSM
INT
虚拟8086模式
SMI#
apiccpu 0
0x10000
0x12d
base
物理内存
4K一个page
0x3ff
setup.asm
256B
段部件段权限检查
屏幕显示
41
RSDTACPI 1.0
1023
send eoi
MMU
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
编译
...
256
ss3
内存
boot.o
32-bit101012分页2级
0x900
2B
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
Base 31:24
G
D/B
L
AVL
SegLimit19:16
P
DPL
S
Type
Base 23:16
PDE
共享内存
rip
0x9000
检测当前CPU是否正在执行任务
解锁
主BIOS区域0xE0000-0x100000
0x7c00
x64内核
4G虚拟内存
进程B
22-31PDT index
恢复运行
0x7bff
pde
写入内存
IPIS
段寄存器
0x7dff
进程二
INTR
1M
物理内存内存条
InterruptMessages
进入x64内核后0x7e00以下的内存都可以覆盖使用
寄存器或状态位
参数用途
CF位
若CF位为0表示调用未出错,CF为1,表示调用出错
EAX
ES:DI
ARDS缓冲区地址,同输入值是一样的,返回时此结构中已经被BIOS填充了内存信息
ECX
BIOS写入到ES:DI所指向的ARDS结构中的字节数,BIOS最小写入20字节
EBX
后续值:下一个ARDS的位置。每次中断返回后,BIOS会更新此值,BIOS通过此值可以找到下一个待返回的ARDS结构,我们不需要改变EBX的值,下一次中断调用时还会用到它,在CF位为0的情况下,若返回后的EBX值为0,表示这是最后一个ARDS结构
当前核是否busy
我们用汇编写的内核源码
5-level paging9999912分页
512B
字节偏移量
属性名称
描述
BaseAddrLow
基地址的低32位
BaseAddrHigh
基地址的高32位
LengthLow
内存长度的低32位,以字节为单位
LengthHigh
内存长度的高32位,以字节为单位
本段内存的类型
LINT0
我们写OS可用
代码
64位模式
RPL
200M
55 aa
是否有调度任务
0xc7fff
Paging Mode
PG in CR0
PAE in CR4
LME in IA32_EFER
Lin.-Addr Width
Phys-Addr Width
Page Sizes
SupportsExecute-Disable
Supports PCIDS and protection keys
32-bit
Up to 40
4KB4MB
No
PAE
Up to 52
4KB2MB
Yes
4-level
48
4KB2MB1GB
64KB-16B
IR0
IR1
IR2
IR3
IR4
IR5
IR6
IR7
虚拟内存
Type值
名称
AddressRangeMemory
这段内存可以被操作系统使用
AddressRangeReserved
内存使用中或者被系统保留,操作系统不可以用此内存
其他
未定义
未定义,将来会用到,目前保留。但是需要操作系统一样将其视为ARR(AddressRangeReserved)
恢复任务上下文
A0
CS
进入内核
1.门2.syscall3.sysenter
扩展BIOS数据区0x40e-0x80e
64内核,用于存储物理内存管理模块
APIC总线或者系统总线
0x08
608KB
跨态,CPU自动压入五个
x86内核
0xb7fff
0xd000
0x1200
0x133
1G物理页
TYPE=1111(0x0F):64位陷阱门
物理内存管理模块(自实现)
中断处理过程在目标代码内的偏移量31~16
TYPE
000000
IST
虚拟内存管理模块(自实现)SLAB、伙伴算法
sched
用户态
程序中使用
1KB
iretq
将任务保存到kpcr
BIOS入口
BIOS代码区
内存映射式IO
显示适配器BIOS
文本模式显示适配器
黑白显示适配器
彩色显示适配器
扩展BIOS数据区
valid
MBR区域boot执行完就可以用这块内存了
BIOS数据区
BIOS填充的中断向量表IVT
0x4ff
100M
GDT表
保留
PAE Paging29912分页3级
setup.oseek=1 count =2
apiccpu 1
0-11物理偏移
4KB页的物理地址(32-12)
PAT
D
A
PCD
PWT
U/S
R/W
所有核会同时响应IPI broadcast
调度其他任务
软盘/硬盘
0xaffff
0xa000
+12
特定用途,我们写OS不可用
高速缓存器
gdtr、idtr32位时代
eflags
Processor #3
48位线性地址 1G物理页
64位
32KB
PTE
BSP
目标代码段描述符选择子
800M
0柱面0磁道0扇区
PDT表
0xbffff
+8
0xc000
cs
系统管理模式
抢锁
Request Privilege Level (RPL)
PG
CD
NW
AM
WP
NE
ET
TS
EM
MP
PE
mov eax. [0x1100]
400M
I/O APIC
调用前输入
中断处理过程在目标代码段内的偏移量15~00
保存正在执行任务上下文
0x1000
8259A从片
端口地址范围
分配说明
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
软盘控制器
0x170-0x177
IDE硬盘控制器
ExternlInterrupts
1024B
注:这里不需要设置时间片,因为没有要调度的任务,让cpu核进入hlt
MADT
位
PE(Protection Enable)
启用保护模式,如果设置,系统运行在保护模式下;如果清除,系统运行在实模式下
MP(Monitor co-processor)
控制协处理器的交互方式,用于管理浮点运算
EM(Emulation)
如果设置,没有安装数学协处理器,所有浮点指令都会引发异常,可以用于模拟一个协处理器
TS(Task Switched)
控制数学协处理器的保存和恢复,用于优化任务切换时的性能
ET(Extension Type)
在386和更早的处理器上,用于表示协处理器的类型(80287或80387).在现代处理器中不再使用
NE(Numberic Error)
启用浮点异常报告
WP(Write Protect)
当设置时,CPU不能写入标识为只读的页面,即使运行在超级用户模式下也是如此,用于支持页面保护
AM(Alignment Mask)
当设置时,对齐检查启用(如果用户级别标志EFLAGS中的AC位也被设置)
NW(Not write-through)
控制缓存写策略,用于禁用写通缓存
CD(Cache Disable)
用于禁用内部缓存
PG(Paging)
启用分页,如果设置,内核分页支持开启,如果清除,分页机制关闭
页目录表的物理地址(32-12)
页目录指针表pdpt
AP
进入死循环(可被中断打断),等待时钟中断调度内核线程
Segment Limit 15:00
页目录表的物理地址(51-32)
时钟
IRQ0
键盘
IRQ1
接联int
IRQ2
串行口2
IRQ3
串行口1
IRQ4
并行口2
IRQ5
软盘
IRQ6
并行口1
IRQ7
4B
EFLAGS.VM=1
6B(idtr)
1B(ap init lock)
6B(gdtr)
1B(已经初始化的CPU数量)
298B一般内存检测不会这么多次
2B(内存检测次数)
16B
12-21PTT index
0x00400000+0x1234=0x00401234
CR3
段寄存器(如DS)选择描述符
线性地址=段基址+偏移
进程A
子功能号:EAX寄存器用来指定子功能号,此处输入为0xE820
ARDS缓冲区:BIOS将获取到的内存信息写入此寄存器指向的内存,每次都以ARDS格式返回
EDX
固定为签名标记0x534d4150.此十六进制数字是字符串SMAP的ASCII码,BIOS将调用者正在请求的内存信息写入ES:D寄存器所指向的ARDS缓冲区,再用此签名校验其中的信息
执行main函数写入软盘/硬盘
内核态R0
一个段大小=64KB
设置时间片
0x9fbff
页部件MMU
类型
作用
举例
逻辑地址
线性地址
经过段机制后的地址
0x00400000+ 0x1234
物理地址
最终访问内存芯片的地址
0x00101234(分页映射后)
0x9ffff
修改任务状态为ready
Bridge
IO APIC
Processor #4
此颜色表示有特定用途,我们写OS也可用
4-legel paging999912分页
8B
30KB
含义
常见用途
代码段寄存器
指向代码所在段
DS
数据段寄存器
默认用于大多数数据访问
SS
栈段寄存器
栈访问默认使用的段
ES
附加段寄存器
string操作中常用
FS
用于线程、CPU本地数据访问
GS
同上,尤其常用于内核
逻辑地址DS:0x1234
index
进程C
8259A主片
CAS2-0
1B
内核
地址范围描述符ARDS
【分页机制】页目录+页表查找
起始
结束
大小
用途
FFFF0
FFFFF
BIOS入口地址,此地址也属于BIOS代码,同样术语顶部的640KB字节,只是为了强调其入口地址才单独贴出来,此处16字节的内容是跳转指令 jmp f000: e05b
F0000
FFFEF
C8000
EFFFF
映射硬件适配器的ROM或内存映射式IO
C000
C7FFF
B8000
BFFFF
用于文本模式显示适配器(也是当前内核中使用的模式)
B0000
B7FFF
用于黑白显示适配器
A0000
AFFFF
用于彩色显示适配器
9FC00
9FFFF
EBDA(Extended BIOS Data Area)扩展BIOS数据区
7E00
9FBFF
622080B约608KB
可用区域
7C00
7DFF
MBR被BIOS加载到此处,共512字节
500
7BFF
30464B约30KB
400
4FF
BIOS Data Area(BIOS数据区)
000
3FFF
Interrupt Vector Table(中断向量表)
RSDP
0xb000
Reset
0x7e00
0x8000
由setup读入内存
pdpte
Interrupt Messages
4级头表项
否
地址0xA0-0xbf
console_write
硬盘
线程栈
gdtr、idtr64位时代
创建内核线程
700M
PTT表
600M
页目录表pdt
段基地址 = 0x100*16
一个段大小=64K(最大)
【段机制】查GDT/LDT
Processor #2
保护键
4KB页的物理地址(51-32)
Reset or RSM
没抢到锁的会进入自旋
地址0x20-0x3f
错误码
创建进程1(init进程)
+0x100
TYPE=1110(0x0E):64位中断门
x86内核system.bin
实时钟
IRQ8
INT0AH
IRQ9
IRQ10
IRQ11
PS2鼠标
IRQ12
协处理器
IRQ13
IRQ14
IRQ15
物理地址=0x00101234
页目录指针表的物理地址(32-12)
AP核启动代码
idt
gdt
第一个页表
第一个页目录指针表
四级头表
64位内核系统数据区
boot.asm | mapped memory bitmap
空闲
x86内核(30个扇区)
setup.asm | no mapped memory bitmap
0x4100
页表的物理地址(51-32)
Table Indicator0=GDT1=LDT
printf
+0
0xf000
ld
0x12c
创建0号idle进程1.shell(Linux)2.图形界面(Windows)
System Chip Set
TLB
0x100
+4
esp3
进程三
用户态R3
由BIOS例程自动读入内存
10M
EFLAGS.VM=0
PCI
TI
2M
指针表项
返回值
Reset or CR0.PE=0
写时复制
io apic
由boot读入内存
CPU处理器运行模式转换图
Processor #1
base、limit、权限
缺页异常
页表的物理地址(32-12)
回到用户态
os kernel
抢到锁的核这时候还没有解锁,这时候其他核还是在自旋
......
0 条评论
下一页
为你推荐
查看更多