[OS64位][016]源码阅读:代码清单3-25~3-27

2019-05-18  本文已影响0人  AkuRinbu

学习笔记

使用教材(配书源码以及使用方法)
《一个64位操作系统的设计与实现》
http://www.ituring.com.cn/book/2450
https://www.jianshu.com/p/28f9713a9171

源码文件

1、进入保护模式前需要准备的系统数据结构

代码清单3-25 Line 29~40 :开启保护模式需要的系统数据结构 GDT 表

[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

代码段和数据段的段基地址都设置在0x 0000 0000地址处
段限长为0x ffff ffff即段可以索引 0~4 GB内存地址空间

CODE32 代码段 TYPE=1010 可读、可执行 DPL=00
DATA32 数据段 TYPE=0010 读、写 DPL=00

SelectorCode32 这里具体数值就是0x08
SelectorData32 这里具体数值就是0x10

代码清单3-26 Line 712~721 : 处理中断和异常需要 IDT 表

;=======    tmp IDT

IDT:
    times   0x50    dq  0
IDT_END:

IDT_POINTER:
        dw  IDT_END - IDT - 1
        dd  IDT

2、模式切换,从实模式到保护模式

代码清单3-27 Line 479~494 :模式切换

;=======    init IDT GDT goto protect mode 

    cli         ;======close interrupt

    db  0x66
    lgdt    [GdtPtr]

;   db  0x66
;   lidt    [IDT_POINTER]

    mov eax,    cr0
    or  eax,    1
    mov cr0,    eax 

    jmp dword SelectorCode32:GO_TO_TMP_Protect

参考资料

[019][x86汇编语言]段描述符、段选择子格式(检测点11.1)
https://www.jianshu.com/p/0ec493a0287c

cr0
https://wiki.osdev.org/CPU_Registers_x86-64#CR0
上一篇 下一篇

猜你喜欢

热点阅读