实模式到保护模式
Loader
加载操作系统或其他软件到内存中
GDT:
全局描述符表 定义了代码段,数据段,显存段的描述符
GDT的第一个条目是空描述符,通常用于对齐
开始时要计算GDT的大小和界限。通过汇编伪指令$计算
GDT_SIZE equ $ - GDT_BASE equ:为一个值定义符号常量,类似C语言中的#define $:当前位置 GDT_BASE:GDT起始地址 用当前大的减去小的,就是大小
GDT中每个描述符占用8字节(64位)
描述符结构
一个段描述符的结构如下:
字段 | 位范围 | 字节数 | 描述 |
---|---|---|---|
段基址低 16 位 | 0-15 | 2 | 段的基地址低 16 位 |
段界限低 16 位 | 16-31 | 2 | 段界限的低 16 位 |
段基址中 8 位 | 32-39 | 1 | 段基地址的中间 8 位 |
段属性 1(访问权限) | 40-47 | 1 | 访问权限和段类型相关标志 |
段属性 2(扩展标志) | 48-51 | 0.5 | 包括段界限的高 4 位 |
段界限高 4 位 | 52-55 | 0.5 | 段界限的高 4 位 |
段基址高 8 位 | 56-63 | 1 | 段基地址的高 8 位 |
总计:64 位 = 8 字节。
8字节包含: 段基址 段界限 属性字段
8 字节的用途详解
1. 段基址(Base Address)
-
32 位地址,用于指定段在内存中的起始地址。
-
分布在描述符的低 16 位、中间 8 位和高 8 位,共 4 字节。
2. 段界限(Limit)
-
指定段的大小范围。
-
20 位值分成两部分:低 16 位(2 字节)和高 4 位(0.5 字节)。
-
高 4 位与段属性字段共享一个字节。
3. 属性字段
-
包含段的类型、访问权限和特权级。
-
比如:
-
可用性:段是否被使用。
-
段类型:代码段、数据段、系统段等。
-
特权级 (DPL):段的访问级别。
-
内存检测
初始化堆栈指针和寄存器,开始内存检测
找到最大可用内存区域
EAX和EDX
EAX:
作为累加器,用于算术和逻辑操作
add,mul,div,imul,idiv等操作
EDX:
辅助寄存器,与EAX配合完成某些复杂操作
主要:
大部分函数用eax存返回值
特定场景:
系统调用:eax作为系统调用号;edx作为传递额外参数的数据寄存器
mov eax, 1 ; 系统调用号:exit
mov ebx, 0 ; 返回值:0
int 0x80 ; 执行系统调用
I/O操作:eax用来传递或接收I/O数据edx用来指定I/O端口地址
mov edx, 0x3F8 ; 串口端口地址
mov al, 'A' ; 数据放入 AL(EAX 的低8位)
out dx, al ; 输出数据到端口
;互相配合用于乘法
mov eax, 0x1234
mov ebx, 0x5678
mul ebx ; EAX = 低32位,EDX = 高32位
;EAX存储低32位,EDX存储高32位
;互相配合用于除法
mov edx, 0 ; 高位清零 被除数可能是一个64位的数,CPU将高32位存储在EDX中,如果被除数本身小于32 ; 位,就需要将EDX寄存器清零,防止残留的高位数据影响结果。
mov eax, 10 ; 被除数
mov ebx, 3 ; 除数
div ebx ; EAX = 商,EDX = 余数
端口0x92
在PC兼容的x86架构中,端口0x92
是系统控制寄存器(System Control Port A)。
它用于控制特定的硬件功能,比如:
-
触发快速复位(Fast Reset)。
-
启用或禁用A20地址线(主要用于内存寻址)。
CR0
CR0
是x86 CPU的重要控制寄存器,负责管理操作模式和一些关键功能。
R0 的第0位(PE位):
-
0
:实模式(Real Mode)。 -
1
:保护模式(Protected Mode)。
PG位
(Paging Enable):
-
0
:关闭分页模式。 -
1
:开启分页模式。
通过按位或操作,将 EAX
的第31位设置为 1
。
CR0
是一个 32 位的寄存器,每个位都有特定的含义。以下是它的主要字段:
位编号 | 名称 | 描述 |
---|---|---|
0 | PE (Protection Enable) | 保护模式使能位。设置为 1 后,处理器从实模式切换到保护模式。 |
1 | MP (Monitor Coprocessor) | 控制协处理器的监视功能,用于与 x87 协处理器配合。 |
2 | EM (Emulation) | 协处理器仿真标志位。设置为 1 时,处理器不支持 x87 浮点指令(通过异常模拟)。 |
3 | TS (Task Switched) | 任务切换标志,用于协助检测 x87 浮点指令是否需要被重新初始化。 |
4 | ET (Extension Type) | 扩展类型标志,始终为 1,表示支持 x87 协处理器。 |
5 | NE (Numeric Error) | 数值错误标志。为 1 时,x87 浮点错误通过异常处理,为 0 时通过外部协处理器的 FERR# 引脚处理。 |
16 | WP (Write Protect) | 写保护标志。为 1 时,用户模式不能写入只读页面(即使页面是可写的)。 |
18 | AM (Alignment Mask) | 对齐掩码标志。配合 EFLAGS 寄存器中的 AC 位,用于检测内存访问是否对齐。 |
29 | NW (Not Write-through) | 非写直通缓存标志。为 1 时,禁止写直通缓存。 |
30 | CD (Cache Disable) | 缓存禁用标志。为 1 时,禁用所有缓存。 |
31 | PG (Paging) | 分页使能标志。为 1 时,开启分页机制。 |
进入保护模式
;把端口0x92的第一位变成1
in al,0x92 ;从I/O端口0x92读取一个字节的数据到al
or al,0000_0010b ;把第一位变为1
out 0x92,al ;写到端口0x92
lgdt [gdt_ptr] ;加载全局描述符表GDT [gdt_ptr]是一个内存地址
;把控制寄存器CR0的当前值加载到通用寄存器EAX中
mov eax,cr0
or eax,0x00000001 ;将第0位设置成1,启用保护模式
mov cr0,eax ;将改写的值写回CR0,从此开始运行在保护模式下
dword:用于声明变量是一个32位的双字数据
页目录表PDT的权限属性PT
通过一系列条目控制虚拟地址到物理地址的映射
页目录条目PDE和页表条目PTE
每个条目是32位(4字节)
通常包含以下字段:
位 | 名称 | 描述 |
---|---|---|
31 | P (Present) | 如果为 1,表示该页目录条目或页表条目有效,指向的页表或物理页面是有效的。 |
30 | RW (Read/Write) | 如果为 1,表示该页或页表条目是可写的;如果为 0,则表示只读。 |
29 | US (User/Supervisor) | 如果为 1,表示该页可以在用户模式下访问;如果为 0,表示只能在内核模式下访问。 |
28 | PWT (Page Write-Through) | 如果为 1,表示该页表缓存为写直通缓存;如果为 0,表示该页表使用写回缓存。 |
27 | PCD (Page Cache Disable) | 如果为 1,禁用缓存;如果为 0,允许缓存。 |
26-23 | Accessed (A) | 如果为 1,表示该页自上次清零后已被访问;否则为 0。 |
22-20 | Dirty (D) | 仅对页表有效。如果为 1,表示该页自上次清零后已被修改。 |
19-12 | Page Table Base Address | 指向物理页表或物理页的地址。 |
11-0 | Reserved | 保留位,通常为 0。 |
inc: 将一个操作数进行递增操作
ret
版权声明:
作者:Paul
链接:https://www.15ivyy.site/index.php/2024/12/04/snsdbhns/
来源:somethingFromPaul
文章版权归作者所有,未经允许请勿转载。
Paul
实模式:16位内存,最多1MB内存。对内存没有保护,硬件也可以直接访问,不支持多任务处理。很老了就是
保护模式:32位或更高寻址理论上支持4GB或者更大内存;操作系统可以防止其他程序访问内存;硬件访问受限,必须通过操作系统访问硬件;能运行多个程序