一个操作系统的实现(2.2)保护模式下的操作

本文详细介绍了如何在保护模式下实现跳转到实模式的过程,包括加载选择子、设置寄存器以及利用 jmp 指令跳转。此外,还探讨了局部描述符表(LDT)的使用,以及IA32处理器的特权级机制,包括CPL、DPL和RPL的检查。文章还提到了不同特权级间的代码段转移,涉及调用门、中断门和任务门等,并指出在特权级变化时,堆栈管理和任务状态段(TSS)的角色。
摘要由CSDN通过智能技术生成

主要内容

1.实现从保护模式跳回实模式
2.LDT
3.对保护模式下特权级的简单介绍

在从保护模式跳转到实模式前要保证对应的段描述符寄存器有合适的段界限和属性,需要加载一个选择子到段寄存器。此外保护模式为32位环境,实模式为16位环境,需要从16位代码段返回`
1.加载选择子(新建Normal,添加在GDT中)

LABEL_DESC_NORMAL: Descriptor    0,         0ffffh, DA_DRW    ; Normal 描述符

SelectorNormal		equ	LABEL_DESC_NORMAL	- LABEL_GDT

2.准备返回的16位代码段

; 16 位代码段. 由 32 位代码段跳入, 跳出后到实模式
[SECTION .s16code]
ALIGN	32
[BITS	16]
LABEL_SEG_CODE16:
	; 跳回实模式:
	mov	ax, SelectorNormal
	mov	ds, ax
	mov	es, ax
	mov	fs, ax
	mov	gs, ax
	mov	ss, ax

	mov	eax, cr0
	and	al, 11111110b
	mov	cr0, eax

LABEL_GO_BACK_TO_REAL:
	jmp	0:LABEL_REAL_ENTRY	; 段地址会在程序开始处被设置成正确的值

Code16Len	equ	$ - LABEL_SEG_CODE16

; END of [SECTION .s16code]

完成对应寄存器的赋值,改变cr0的PE位。
其中最后的跳转需要联系到程序开始处

LABEL_BEGIN:
	mov	ax, cs
	mov	ds, ax
	mov	es, ax
	mov	ss, ax
	mov	sp, 0100h

	mov	[LABEL
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值