加载启动区
按下开机键的那一刻,在主板上提前写死的固件程序 BIOS 会将硬盘中启动区的 512 字节的数据(0盘0道1扇区),原封不动复制到内存中的 0x7c00 这个位置,并跳转到那个位置进行执行
寄存器
cs代码段
cpu当前执行的代码所在内存的位置 由cs:ip配合指向,cs基址,ip偏移
ds
是一个 16 位的段寄存器,具体表示数据段寄存器。
实模式 :在内存寻址时充当段基址的作用
保护模式:段选择子:存储段描述符的索引
es
扩展段寄存器
ss
栈段基址
sp
栈顶
ss:sp
指令
mov
mov ax,[0x0001]
sub
sub a,b
a=a-b
rep
重复执行后面的指令
rep movw
movw 复制一个字(16位)
将ds:si处复制到es:di处 复制cs次数 一次复制1个字
jmpi
段间跳转指令
jmpi go,0x9000
跳转到0x9000:go 执行
go一个标签
编译成机器码就被编译成一个值,代表他的偏移地址
go:
mov ax,cs
mov ds,ax
最终go=mov ds,ax这段代码的所在内存地址
int
int 0x13中断读取磁盘 其次还需要配置参数
int 0x10 bios显示服务 执行完毕dx h 存储行号,l存储列号
lgdt 存储描述符
lss 栈顶指针指向
中断
中断发起后,CPU 会通过这个中断号,去寻找对应的中断处理程序的入口地址,并跳转过去执行,逻辑上就相当于执行了一个函数。
cli 关闭中断
磁盘数据读取
jnc
jnc ok_load_setup
跳转到ok_load_setup标签
模式的转换
16位实模式转拜年位32位保护模式
gbt 全局描述符表
存在gdtr寄存器中
中断描述符表 idt
a20地址线
地址信号线20位宽度,变成30位可用
_pg_dir 页目录
TSS任务状态段描述符
局部描述符LDT
开启分页机制
分页机制开启后物理地址计算
地址转换过程
由硬件MMU 内存管理单元进行虚拟地址和物理地址映射
页目录表 PDE
页表PTE
分段机制
每个程序提供的单独代码段互不干扰
分页机制
按需使用武力内存
问题
- x86为了让16位下实模式能访问20位,段基地址要左移4位。
积累
mov cx,#256
cx赋值10进制256
加电自检后自动初始化到文字模式,一屏幕25行80列
- system 模块就是除了 bootsect 和 setup 之外的全部程序链接在一起的结果,可以理解为操作系统的全部。