- [OS64位][013]源码阅读:代码清单3-17 保护模式一开
- [C语言]模拟内存物理页,申请连续64个物理页,对应位图置1
- [OS64位][016]源码阅读:代码清单3-25~3-27
- [OS64位][014]源码阅读:代码清单3-18 ~ 3-22
- [OS64位][015]源码阅读:代码清单3-23 ~ 3-24
- [OS64位][005]源码阅读:代码清单3-6 软盘读取 Fu
- [OS64位][009]源码阅读:代码清单3-9 根据FAT表项
- [OS64位][006]源码阅读:代码清单3-7 目标文件搜索
- [OS64位][017]源码阅读:代码清单3-28~3-37 保
- [OS64位][010]源码阅读:代码清单3-10 从FAT12
学习笔记
使用教材(配书源码以及使用方法)
《一个64位操作系统的设计与实现》
http://www.ituring.com.cn/book/2450
https://www.jianshu.com/p/28f9713a9171
代码清单3-17 (程序3-4 loader.asm)
当A20功能开启后,紧接着使用指令CLI关闭外部中断,再通过指令LGDT加载保护模式结构数据信息,并置位CR0寄存器的第0位来开启保护模式。当进入保护模式后,为FS段寄存器加载新的数据段值,一旦完成数据加载就从保护模式中退出,并开启外部中断。整个动作一气呵成,实现了保护模式的开启和关闭。
源码 line :80~103
: 保护模式一开一关,获得寻址1MB以上物理内存的能力
;======= open address A20
push ax
in al, 92h
or al, 00000010b
out 92h, al
pop ax
cli
db 0x66
lgdt [GdtPtr]
mov eax, cr0
or eax, 1
mov cr0, eax
mov ax, SelectorData32
mov fs, ax
mov eax, cr0
and al, 11111110b
mov cr0, eax
sti
1 push ax
… pop ax
- 使用端口
0x92
打开A20地址线
2 lgdt [GdtPtr]
加载到GDTR寄存器
-
dw GdtLen - 1
16位表界限 -
dd LABEL_GDT
32位GDT表线性基地址
3 mov ax, SelectorData32
. . . sti
- 赋予fs寄存器在实模式下寻址1MB(
0x100000
)以上物理内存的特殊能力,即Big Real Mode模式; - 目的是,借助fs寄存器将内核程序移动到1MB(
0x100000
)以上的内存空间;
源码 line :29~40
: 保护模式数据结构信息
[SECTION gdt]
LABEL_GDT: dd 0,0
LABEL_DESC_CODE32: dd 0x0000FFFF,0x00CF9A00
LABEL_DESC_DATA32: dd 0x0000FFFF,0x00CF9200
GdtLen equ $ - LABEL_GDT
GdtPtr dw GdtLen - 1
dd LABEL_GDT
SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT
SelectorData32 equ LABEL_DESC_DATA32 - LABEL_GDT
内存示意图
内存示意图- 内核程序最终要被放到
0x100000
处(注意,这里是五个零)
参考资料
- cli 屏蔽中断 sti 允许中断
[017][x86汇编语言]检测点9.1 :观察 cli、 sti 指令执行 后标志位IF的变化
https://www.jianshu.com/p/68399f293bae
- 打开A20地址线 进入保护模式
[020][x86汇编语言]第11章 进入保护模式
https://www.jianshu.com/p/1d0c583cd46f
- 设置PE位,进入保护模式
cr0
https://wiki.osdev.org/CPU_Registers_x86-64#CR0
- GDTR寄存器 格式 : 32位线性基地址 16位GDT表界限
GDTR寄存器 格式
第三天:Linux内核完全剖析之GDT+LDT+IDT
http://blog.chinaunix.net/uid-29113598-id-5210949.html
网友评论