自己动手写操作系统 - 01 保护模式之段保护

这篇博客详细介绍了如何在自己动手写操作系统时实现保护模式的段保护,包括构造段描述符、段描述符结构、初始化代码以及段寻址过程,通过寄存器操作存储段信息,并对段描述符属性进行了说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自己动手写操作系统 - 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值