标签:
第二天总结
学习内容:寄存器(eflags,IDTR,GDTR,CR0),bootsect应用的相关知识及其流程,gdt
实验:实践boot相关功能,移动位置,加载扇区,建立gdt以及idt,进入实模式,跳转到gas编译的head第一条语句
总结:1,理论bootsect到setup
a,被加载的bootsect移动到0x9000,借助int 0x13中断将setup加载到自身后面
b,加载system到0x1000处,避免覆盖bios中断。之后跳到setup执行
2.加载head代码
1 mov dx, 0x0000 使drive=0 head=0 track=0 sector=2 2 mov cx, 0x0002 3 mov ax, #HEADSEG es:bx确定目的地址 4 mov es, ax 5 xor bx, bx 6 mov ax, #0X200+HEADLEN ah读扇区功能号,al为读取的个数 7 int 0x13
3.移动加载的代码到0:0
cli 将if清零 关中断,将覆盖bios中断描述符表 mov ax, #HEADSEG 配置ds:si ->es:di mov ds, ax xor ax, ax mov es, ax mov cx, #0x0200 sub si, si sub di, di rep movw
vm | rf | 0 | nt | iopf | of | df | if | tf | sf | zf | 0 | af | 0 | pf | 1 | cf |
3,加载GDT和IDT的基址寄存器GDTR与IDTR
lidt idt_48 lgdt gdt_48
gdt: .word 0,0,0,0 每一行为段描述符
.word 0x07ff,0x0000,0x9a00,0x00c0 根据段描述符 基址 0x0000 0000 8mb长 代码段下一个为数据段
.word 0x07ff,0x0000,0x9200,0x00c0
idt_48: .word 0
.word 0,0
gdt_48: .word 0x7ff
.word 0xfc00+gdt,0
基地址(31-24) | 属性 |
属性 | 基地址(23-16) |
段基址 | 15-0 |
段限长 | 15-0 |
32位线性基地址 | 16位表长度 |
32位线性基地址 | 16位表长度 |
IDTR以及GDTR分别记录着IDT以及GDT表的首地址。之后可以通过指定第几项来查找段的相关信息。
4,进入实模式并跳转
mov ax,#0x0001 lmsw ax 改变cr0寄存器pe位数值,进入保护模式 jmpi 0, 8 8=1000 即执行gdt表第二项段描述符所指向的代码,也就是加载的head 同时ip=0
PG | PE(一位) |
当PE位置1时,进入保护模式,当PG置位启用分页基址
描述符(十三位) | T (一位) RPL(两位 | 段基址限长属性(为隐藏部分) |
8=1000 即 T=1 (在gdt中查找) RPL=0(特权级为零)描述符为1代表是 gdt[1]之后即执行32位的指令
标签:
原文地址:http://www.cnblogs.com/starfarmingl/p/4693433.html