【OS学习笔记】十八 保护模式五:保户模式下如何进行内存保护 与 别名段的意义与作用 对应汇编代码
发布日期:2021-07-01 00:05:41
浏览次数:2
分类:技术文章
本文共 3702 字,大约阅读时间需要 12 分钟。
本片文章是上一篇文章:对应的汇编代码。可以学习上一篇文章后再来对照查看汇编代码。或者查阅书籍《X86汇编语言-从实模式到保护模式》第12章内容来学习。
;代码清单12-1 ;文件名:c12_mbr.asm ;文件说明:硬盘主引导扇区代码 ;设置堆栈段和栈指针 mov eax,cs mov ss,eax mov sp,0x7c00 ;计算GDT所在的逻辑段地址 mov eax,[cs:pgdt+0x7c00+0x02] ;GDT的32位线性基地址 xor edx,edx mov ebx,16 div ebx ;分解成16位逻辑地址 mov ds,eax ;令DS指向该段以进行操作 mov ebx,edx ;段内起始偏移地址 ;创建0#描述符,它是空描述符,这是处理器的要求 mov dword [ebx+0x00],0x00000000 mov dword [ebx+0x04],0x00000000 ;创建1#描述符,这是一个数据段,对应0~4GB的线性地址空间 mov dword [ebx+0x08],0x0000ffff ;基地址为0,段界限为0xfffff mov dword [ebx+0x0c],0x00cf9200 ;粒度为4KB,存储器段描述符 ;创建保护模式下初始代码段描述符 mov dword [ebx+0x10],0x7c0001ff ;基地址为0x00007c00,512字节 mov dword [ebx+0x14],0x00409800 ;粒度为1个字节,代码段描述符 ;创建以上代码段的别名描述符 mov dword [ebx+0x18],0x7c0001ff ;基地址为0x00007c00,512字节 mov dword [ebx+0x1c],0x00409200 ;粒度为1个字节,数据段描述符 ;创建保护模式下的栈段 mov dword [ebx+0x20],0x7c00fffe ;基地址为0x00007c00,段界限为0xFFFFF mov dword [ebx+0x24],0x00cf9600 ;粒度为4KB,栈段描述符 ;初始化描述符表寄存器GDTR mov word [cs: pgdt+0x7c00],39 ;描述符表的界限 lgdt [cs: pgdt+0x7c00] in al,0x92 ;南桥芯片内的端口 or al,0000_0010B out 0x92,al ;打开A20 cli ;中断机制尚未工作 mov eax,cr0 or eax,1 mov cr0,eax ;设置PE位 ;以下进入保护模式... ... jmp dword 0x0010:flush ;16位的描述符选择子:32位偏移 [bits 32] flush: mov eax,0x0018 mov ds,eax mov eax,0x0008 ;加载数据段(0..4GB)选择子 mov es,eax mov fs,eax mov gs,eax mov eax,0x0020 ;0000 0000 0010 0000 mov ss,eax xor esp,esp ;ESP <- 0 mov dword [es:0x0b8000],0x072e0750 ;字符'P'、'.'及其显示属性 mov dword [es:0x0b8004],0x072e074d ;字符'M'、'.'及其显示属性 mov dword [es:0x0b8008],0x07200720 ;两个空白字符及其显示属性 mov dword [es:0x0b800c],0x076b076f ;字符'o'、'k'及其显示属性 ;开始冒泡排序 mov ecx,pgdt-string-1 ;遍历次数=串长度-1 @@1: push ecx ;32位模式下的loop使用ecx xor bx,bx ;32位模式下,偏移量可以是16位,也可以 @@2: ;是后面的32位 mov ax,[string+bx] cmp ah,al ;ah中存放的是源字的高字节 jge @@3 xchg al,ah mov [string+bx],ax @@3: inc bx loop @@2 pop ecx loop @@1 mov ecx,pgdt-string xor ebx,ebx ;偏移地址是32位的情况 @@4: ;32位的偏移具有更大的灵活性 mov ah,0x07 mov al,[string+ebx] mov [es:0xb80a0+ebx*2],ax ;演示0~4GB寻址。 inc ebx loop @@4 hlt ;------------------------------------------------------------------------------- string db 's0ke4or92xap3fv8giuzjcy5l1m7hd6bnqtw.';------------------------------------------------------------------------------- pgdt dw 0 dd 0x00007e00 ;GDT的物理地址;------------------------------------------------------------------------------- times 510-($-$$) db 0 db 0x55,0xaa
转载地址:https://lyy-0217.blog.csdn.net/article/details/84982926 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年05月03日 20时40分18秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
HDU - 1166 敌兵布阵 (树状数组模板题/线段树模板题)
2019-04-30
CodeForces - 456C Boredom (dp)
2019-04-30
CodeForces - 675A Infinite Sequence(简单数论 细节)
2019-04-30
CodeForces - 1042B Vitamins (思维)
2019-04-30
ACM 2013 长沙区域赛 Collision (几何)
2019-04-30
ACM 2014 鞍山区域赛 E - Hatsune Miku (dp)
2019-04-30
反向传播&梯度下降 的直观理解程序(numpy)
2019-04-30
CodeForces - 931B World Cup (思维 模拟)
2019-04-30
ACM 2017 北京区域赛 J-Pangu and Stones(区间dp)
2019-04-30
java常用类 String面试题
2019-04-30
利用ffmpeg合并音频和视频
2019-04-30
select下拉框分组展示插件的使用--(select-mania插件的使用)
2019-04-30
Java Lambda表达式的应用--Stream API操作集合框架
2019-04-30
Myslq连接(JDBC)url属性的参数的设置
2019-04-30
关于Spring MVC与前端的交互
2019-04-30
大厂经典面试题:Redis为什么这么快?
2019-04-30
Android之Retrofit基本用法篇
2019-04-30
Netty与网络协议资料整理
2019-04-30