保护模式——参考自ORANGE’S:一个操作系统的实现

在看代码之前需要搞清楚什么是保护模式,保护模式下段选择子的作用、寻址过程,可以如果忘记了可以参考下面文章然后再看代码

1、http://blog.csdn.net/rosetta/article/details/8933200



%include	"pm.inc"	; 常量, 宏, 以及一些说明

org	07c00h
	jmp	LABEL_BEGIN

[SECTION .gdt]
; GDT
;                              段基址,       段界限     , 属性
LABEL_GDT:	   Descriptor       0,                0, 0           ; 空描述符
LABEL_DESC_CODE32: Descriptor       0, SegCode32Len - 1, DA_C + DA_32; 非一致代码段
LABEL_DESC_VIDEO:  Descriptor 0B8000h,           0ffffh, DA_DRW	     ; 显存首地址
; GDT 结束

GdtLen		equ	$ - LABEL_GDT	; GDT长度
GdtPtr		dw	GdtLen - 1	; GDT界限
		dd	0		; GDT基地址

; GDT 选择子
SelectorCode32		equ	LABEL_DESC_CODE32	- LABEL_GDT
SelectorVideo		equ	LABEL_DESC_VIDEO	- LABEL_GDT
; END of [SECTION .gdt]

[SECTION .s16]
[BITS	16]   ;告诉操作系统运行在实模式下
LABEL_BEGIN:
	mov	ax, cs
	mov	ds, ax
	mov	es, ax
	mov	ss, ax
	mov	sp, 0100h     ;不知道这句话意?

	; 初始化 32 位代码段描述符
	xor	eax, eax;清空EAX,为下面做准备,16位物理地址=段地址*16+偏移地址
	mov	ax, cs        ; 获取CS段地址
	shl	eax, 4         ; 左移4位等于*16
	add	eax, LABEL_SEG_CODE32;加上偏移地址,这句话执行完EAX内存是逻辑地址
	                             ;在实模式下逻辑地址等于物理地址
	mov	word [LABEL_DESC_CODE32 + 2], ax;EAX低16位保存段基地址1 ,参考Descriptor宏
	shr	eax, 16
	mov	byte [LABEL_DESC_CODE32 + 4], al;EAX高16位中的低8位保存段基地址2,参考Descriptor宏
	mov	byte [LABEL_DESC_CODE32 + 7], ah;EAX高16位中的高8位保存段基地址3,参考Descriptor宏

	; 为加载 GDTR 作准备
	xor	eax, eax ;清空EAX,为下面做准备,16位物理地址=段地址*16+偏移地址
	mov	ax, ds ; 获取DS段地址
	shl	eax, 4 ; 左移4位等于*16
	add	eax, LABEL_GDT		; eax <- gdt 基地址
	mov	dword [GdtPtr + 2], eax	; 将全局描述符表保存到GdtPtr结构中

	; 加载GDT到GDT寄存器
	lgdt	[GdtPtr]

	; 关中断 ,
	cli

	; 打开地址线A20
	in	al, 92h
	or	al, 00000010b
	out	92h, al

	; 准备切换到保护模式
	mov	eax, cr0
	or	eax, 1  ;eax的0位为1
	mov	cr0, eax

	; 真正进入保护模式
	jmp	dword SelectorCode32:0	; 执行这一句会把 SelectorCode32 装入 cs,
					; 并跳转到 Code32Selector:0  处
; END of [SECTION .s16]


[SECTION .s32]; 32 位代码段. 由实模式跳入.
[BITS	32]

LABEL_SEG_CODE32:
	mov	ax, SelectorVideo
	mov	gs, ax			; 视频段选择子(目的)

	mov	edi, (80 * 11 + 79) * 2	; 屏幕第 11 行, 第 79 列。
	mov	ah, 0Ch			; 0000: 黑底    1100: 红字
	mov	al, 'P'
	mov	[gs:edi], ax

	; 到此停止
	jmp	$

SegCode32Len	equ	$ - LABEL_SEG_CODE32
; END of [SECTION .s32]

描述符相关的属性可以查看:http://blog.csdn.net/lampqiu/article/details/6540105




















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值