自己动手写操作系统 - 01 保护模式之段保护
构造段描述符的宏定义
1. 要说到段,那么GDT是不可少的,说到GDT就要说到存储在GDT里的段描述符
2. 那么说到段描述(我可就不困了),它是干什么的呢?甘宁来来的- ,0
3. 段描述符相当于描述一块地(内存),这块地的基址(地在哪儿),这块地的大小(limit),这块地的性质(attribute)
;
; 描述符
; usage: Descriptor Base, Limit, Attr
; Base: dd
; Limit: dd (low 20 bits available)
; Attr: dw (lower 4 bits of higher byte are always 0)
%macro Descriptor 3
dw %2 & 0FFFFh ; 段界限 1 (2 字节)
dw %1 & 0FFFFh ; 段基址 1 (2 字节)
db (%1 >> 16) & 0FFh; 段基址 2 (1 字节)
dw ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh)
; 属性 1 + 段界限 2 + 属性 2 (2 字节)
db (%1 >> 24) & 0FFh ; 段基址 3 (1 字节)
%endmacro ; 共 8 字节
;声明段描述符
[SECTION .gdt] ;创建段描述符表的描述符 和 选择子
;LABEL_GDT: Descriptor 0, 0,0;空描述符
;LABEL_DESC_CODE32:Descriptor 0,SegCode32Len - 1,DA_C + DA_32
;保护模式代码段描述符,32位的
;LABEL_DESC_VIDEO: Descriptor 0B8000,0ffffh,DA_DRW
;存入显存地址和 limit
;段界限 , 属性
LABEL_GDT: Descriptor 0, 0, 0 ; 空描述符
LABEL_DESC_CODE32: Descriptor 0, SegCode32Len - 1, DA_C + DA_32 ; 非一致代码段 无DA_32 会运不成功
LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW ; 显存首地址
;构建段选择子 一块地的信息太多了,用这块地的索引(段选择子)来快速找到这块地
Selector_CODE32 equ LABEL_DESC_CODE32 - LABEL_GDT
Selector_VEDIO equ LABEL_DESC_VIDEO - LABEL_GDT
GDTSegLen equ $ - LABEL_GDT;段描述符和段选择子占用的bytes
GdtLen equ $ - LABEL_GDT ;GDT长度
GdtPtr dw GdtLen - 1 ;GDT limt
dd 0 ;GDT 基址
;初始化段描述符(开始搞这块地了)
[SECTION .s16]
[BITS 16]
LABEL_BEGIN:
;初始化实模式下段寄存器
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0100h
;向全局描述表GDT填写保