一、简单的磁盘引导程序
简单的说明:计算机加电后,BIOS检查硬件等等,BIOS调用19号中断加载磁盘引导程序。
以下用NASM编写的一个简单的磁盘引导程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; '$'表示当前代码行的地址,'$$'表示起始代码地址
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[bits 16] ;说明这是16位代码(可以不写)
org 7c00h ;在运行时将此段程序加载到内存7c00h位置
jmp $ ;循环
times 510 - ($ - $$) 0 ;剩余部分填充0,总大小为512,为0xaa55预留2字节
dw 0xaa55 ;结束标志
二、实模式与保护模式
简单来理解,实模式运行在16位环境下,保护模式运行在32位环境下。32位环境中寻址空间可达4GB,除此之外,32位环境中可以很好的支持多任务。
从执行程序的角度来理解两种模式:
1、实模式
实模式下计算地址方式是通过“16位段地址(寄存器中)*16h+偏移”来实现的。
例如指令的寻址:CS*16h + IP
2、保护模式
保护模式下计算地址的方式是通过“GDT中存储的段地址*16h+偏移”来实现的。32位模式下,16位的段地址被用来寻找GDT的位置。
例如指令的寻址:CS-->GDT代码段位置*16h + IP
解释一下GDT(Global Descriptor Table),看一下他的结构:
从表中可以看出,GDT首先是一个数组结构,每一个条目存储了段的信息。下面就可以来理解保护模式下如何通过描述符表来进行地址计算了:
以上是实模式向保护模式转换的基本原理