实模式到保护模式

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
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录