前几天将段式保护模式从理论上了解了。所以这几天就借助一些书籍和网络得力量来争取实践---将代码跳入保护模式。
首先了解跳入保护模式的基本步骤
1、将代码段基址存入GDT
2、利用lgdt将GDT基址以及长度加载到gdtr寄存器
3、关中断
4、打开20号地址线
5、置位CR0的PE,准备切换
6、跳入保护模式下的代码段
下面就是这个简单跳跃得代码:
pm.inc包含一些宏定义以及段的属性定义值
%macro Descriptor 3
dw %2 & 0ffffh
dw %1 & 0ffffh
db (%1>>16) & 0ffh
dw ((%2>>8)&0f00h)|(%3 & 0f0ffh)
db (%2>>24)&0ffh
%endmacro
DA_32 equ 4000h ;32位段
DA_DPL0 equ 00h ;DPL=0
DA_DPL1 equ 220h ;DPL=1
DA_DPL2 equ 40h ;DPL=2
DA_DPL3 equ 60h ;DPL=3
DA_DR equ 90h ;只读数据段
DA_DRW equ 92h ;可读可写数据段
DA_DRWA equ 93h ;可读可写已访问数据段
DA_C equ 98h ;只执行代码段
DA_CR equ 9ah ;可读可执行代码段
DA_CCO equ 9ch ;非一致可执行代码段
DA_CCRO equ 9eh ;可读非一致可执行代码段
protec.asm这是主要逻辑部分。功能实现得主体
%include "pm.inc"
org 07c00h
jmp START
[SECTION .gdt]
GDT_DEC: Descriptor 0, 0, 0
CODE32_DEC: Descriptor 0,Code32Len-1,DA_32 + DA_CR
VIDEO_DEC: Descriptor 0b8000h,0ffffh ,DA_DRW
GdtLen equ $ - GDT_DEC
Gdtptr dw GdtLen - 1
dd 0
SelectorCode32 equ CODE32_DEC - GDT_DEC
SelectorVideo equ VIDEO_DEC - GDT_DEC
[SECTION .s16]
[BITS 16]
START:
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0100h
;加载代码段基址到GDT描述符
xor eax,eax
mov ax,cs
shl eax,4
add eax,CODE32_SEG
mov word [CODE32_DEC+2],ax
shr eax,16
mov byte [CODE32_DEC+4],al
mov byte [CODE32_DEC+7],ah
;加载GDT基址及长度到gdtr
xor eax,eax
mov ax,ds
shl eax,4
add eax,GDT_DEC
mov dword [Gdtptr+2],eax
lgdt [Gdtptr]
;关中断
cli
;打开A20
in al,92h
or al,02h
out 92h,al
;置位PE
mov eax,cr0
or eax,01h
mov cr0,eax
;跳转保护模式
jmp dword SelectorCode32:0
[SECTION .s32]
[BITS 32]
CODE32_SEG:
mov ax,SelectorVideo
mov gs,ax
mov esi,offMessage
mov edi,(80*12+30)*2
mov ah,0ch
cld
call DesplayMessage
Message: db "Welcome protected place",0
offMessage equ Message - $$
DesplayMessage:
.2:
mov al,[cs:esi]
test al,al
.1:
jz .1
mov [gs:edi],ax
add edi,2
inc esi
jmp .2
Code32Len equ $ - CODE32_SEG
不要值抄写代码运行,一旦代码不能带到目的就重抄一遍。这是不可取得。一定要自己慢慢调试,从内存角度理解每一条指令所起得作用,从内存去查看代码不能达到目的的原由。当然代码不可能一次成功,所以Bochs自带调试命令。
1、在某个物理地址设置断点
b addr b 0x7c00
2、显示当前所有断点的信息
info break
3、继续执行直到遇到断点
c
4、单步执行
s
5、单步执行,遇到函数则跳过
n
6、查看寄存器信息
info cpu
r
fp
sreg
creg
7、查看堆栈
print-stack
8、查看内存物理地址内容
xp /nuf addr xp /40bx 0x9013e
其中nuf表示大小,addr表示首地址
9、查看线性地址内容
x /nuf addr x /40bx 0x13e
10、反汇编一段内存
u start end u 0x30400 0x3040d
11、反汇编执行的每条指令
trace-on
12、每执行一条指令就打印cpu信息
trace-reg on
关闭trace-reg off
下面就是上述代码得结果。在屏幕中打印了一行红色的字
- 大小: 18.5 KB
分享到:
相关推荐
本项目“Elixir下开发嵌入式系统开发小试身手.zip”旨在引导开发者初步了解如何在Elixir环境下进行物联网(IoT)相关的嵌入式系统开发。下面我们将深入探讨Elixir语言与物联网开发的相关知识点。 1. **Elixir语言基础...
方案依据《甘肃省促进科技成果转移转化行动方案》制定,核心是建立一个线上线下相结合的综合转化平台,打造“四棒接力”的科技成果转化模式,解决从基础研究到工业化生产过程中可能出现的问题。 一、建立目标 该...
综上,2019年度科技型中小企业技术创新基金强调的是环境保护和资源的有效利用,通过技术创新解决我国面临的环境挑战,推动绿色和可持续的发展模式。企业申请此类项目时,需充分展示其技术的独特性、实用性和可推广性...
方案的主要目标是设立科技成果转化引导基金,形成“四棒接力”模式,即基础理论研究、实验室研究、中试放大与功能验证、工业化生产四个关键阶段。特别强调解决第三棒,即从中试到工业化生产阶段的衔接问题。计划到...
然而,这些研究大多处于实验室小试实验阶段,尚未有中试工程或生产性规模示范工程的公开报道。 在工程化应用方面,蓝藻产甲烷虽然具有可行性,但仍存在一些问题。首先,蓝藻的产气启动缓慢,消化时间较长,一般需要...
- CQRS是将命令和查询操作分开的设计模式,31|CQRS(上)会介绍如何利用这种方法来优化查询性能,同时保持写操作的复杂性。 6. **学习挑战与建议**: - DDD的学习曲线可能会比较陡峭,加餐5|DDD很难,学不会...
【标题】:“日志分析——牛刀小试” 在IT行业中,日志分析是一项至关重要的技能,尤其是在系统维护、故障排查以及性能优化等方面。本文将以“log牛”为主题,探讨如何利用工具对日志进行深入分析,从而获取关键...
本领域内的催化解聚方法多种多样,包括连续流化床、固定床、移动床等反应模式,每种方法都有其独特的操作条件和适用范围。例如,连续流化床反应器适合于大规模处理,而固定床反应器则可能在提高催化活性方面具有优势...
HP EVA4400存储的管理不仅涉及到硬件层面的操作,更重要的是通过复制管理器等软件工具来优化数据保护策略和提高存储效率。掌握上述知识点,能够帮助IT专业人员更好地利用HP EVA存储系列的功能,提升数据管理能力和...
4. **网络浏览安全**:使用安全的浏览器,如Chrome、Firefox,并开启沙箱模式,限制恶意代码的执行环境。 5. **扫描与隔离**:对疑似感染的文件进行深度扫描,并将可疑文件隔离或删除。 6. **系统还原**:在木马...
在这个C2C商城中,可能会有以下设计模式: 1. 用户表:存储用户的基本信息,如用户名、密码、联系方式、地址等。 2. 书籍表:包含每本书的详细信息,如书名、作者、出版社、ISBN号、新旧程度、价格等。 3. 商品评价...