美文网首页
[OS64位][013]源码阅读:代码清单3-17 保护模式一开

[OS64位][013]源码阅读:代码清单3-17 保护模式一开

作者: AkuRinbu | 来源:发表于2019-05-14 18:35 被阅读0次

学习笔记

使用教材(配书源码以及使用方法)
《一个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 axpop ax
  • 使用端口0x92打开A20地址线
2 lgdt [GdtPtr] 加载到GDTR寄存器
  • dw GdtLen - 1 16位表界限
  • dd LABEL_GDT 32位GDT表线性基地址
3 mov ax, SelectorData32 . . . sti
  • 赋予fs寄存器在实模式下寻址1MB0x100000)以上物理内存的特殊能力,即Big Real Mode模式;
  • 目的是,借助fs寄存器将内核程序移动到1MB0x100000)以上的内存空间;

源码 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

相关文章

网友评论

      本文标题:[OS64位][013]源码阅读:代码清单3-17 保护模式一开

      本文链接:https://www.haomeiwen.com/subject/bgkeaqtx.html