>> 欢迎您,客人客人客人客人: 登录 | 注册 | 忘记密码 | 在线 | 搜索 | 帮助
教学论坛
Projects [返回]
Project:从实模式进入保护模式
标记论坛所有内容为已读
>> Projects欢迎您的到来 <<
◆您是本帖第 7937793779377937 个阅读者◆
* 贴子主题* 贴子主题* 贴子主题* 贴子主题: Project:从实模式进入保护模式
0620080395 0620080395 0620080395 0620080395
信息:
威望: 0
来自: 保密
总发贴数: 279279279279 篇
注册日期: 2006/10/08
消息 查看 搜索 好友 邮件 复制 引用 回复
实验内容:
(1)理解实模式和保护模式及两者区别,掌握如何将CPU从实模式状态转换到保护模式
状态
(2)使用 80X86汇编语言、C/C++语言、VMWare虚拟机,编写系统引导程序,使虚拟机
从实模式进入保护模式
(3)实现基本的键盘输入和屏幕字符输出功能(可选,或者可以放在后面的中断实验
里做)。键盘部分驱动可以使用轮巡或者中断的机制实现
(4)进一步扩展,加入paging分页功能(可选)
可以根据自己的能力发挥!:)
2007/03/27 03:12pm IP: 已设置保密
0620080395 0620080395 0620080395 0620080395
信息:
威望: 0
来自: 保密
总发贴数: 279279279279 篇
注册日期: 2006/10/08
消息 查看 搜索 好友 邮件 复制 引用 回复
首先是一些准备工作,看看我们需要做些什么。
1. GDT、LDT和IDL
在进行实模式到保护模式的转换之前,必须首先建立起一些
(tables)和描述符
(descriptors)。以下简要说明GDT、LDT和IDT。
(1).GDT(Global Descriptor Table)包含着基本的段描述符。这些段描述符保存着内
存里不同部分的信息。在实模式里,每个段可以有64K字节,和紧接着的下一段之间有
16字节的距离。但是在保护模式里,可以自己决定把段放在什么地方。每个段可以大到
4GB。
(2).LDT是可选的,也包含着段描述符,但这些段描述符通常用于应用程序。例如,操
作系统可以建立起一个GDT,里面包含着它自己用的系统描述符,然后为每个任务再分
别设立一个LDT,里面保存着应用程序的描述符。LDT的结构和GDT相似,主要用于为不
同的任务提供不同的内存构架。本project里LDT暂时没有用到。
(3).IDT包含着中断描述符。它们用于告诉处理器中断服务程序(interrupt
handlers)的位置。IDT里每一项对应一个中断,就想实模式里的中断向量一样,但是
这些IDT表项的格式和中断向量是完全不同的。
2007/03/27 03:14pm IP: 已设置保密
0620080395 0620080395 0620080395 0620080395
消息 查看 搜索 好友 邮件 复制 引用 回复
此主题相关图片如下:
2.选择符(Selector)
Projects-Project:从实模式进入保护模式 http://mp.tongji.edu.cn/cgi-bin/topic.cgi?forum=6&topic...
第1页共8页 2011/12/251:46
信息:
威望: 0
来自: 保密
总发贴数: 279279279279 篇
注册日期: 2006/10/08
selector用于选择GDT中的某个Descriptor。Selector其实是由段寄存器(segment
register)中的13位组成,其他位作为辅助作用。segment register的格式如图所示。
字段解释:
(1).RPL = Requested Privilege Level,00最高,11最低。如果selector指向的描述
符表内的描述符的DPL优先级高于selector的RPL,就会产生General Protection
Fault。
(2).TI位用于选择Descriptor Table,TI=0用于选定GDT,TI=1用于选择LDT。
(3).Selector用于选定的描述符表内的描述符,selector>>3就是描述符表的index。
selector指向GDT中的Descriptor,而Descriptor指向内存数据段。保护模式里不允许
向一个代码段里写。
2007/03/27 03:18pm IP: 已设置保密
0620080395 0620080395 0620080395 0620080395
信息:
威望: 0
来自: 保密
总发贴数: 279279279279 篇
注册日期: 2006/10/08
消息 查看 搜索 好友 邮件 复制 引用 回复
此主题相关图片如下:
3.Project要做的。。。
Project所需要做的事情就是在实模式下建立起恰当的table(GDT),然后就可以直接
转入保护模式了。为简单起见,可以定义一个段,用于放置所有的数据和代码。但是由
于保护模式下不允许向一个代码段写,就会产生General Protection Fault。对此,采
用创建别名段(alias segment)的方法容易解决。别名段其实不是新的段,只不过往
GDT中增加一个新的Descriptor而已,该Descriptor指向的内存空间就是代码段
Descriptor定义的同一个内存空间,如图所示。
2007/03/27 03:20pm IP: 已设置保密
0620080395 0620080395 0620080395 0620080395
信息:
威望: 0
来自: 保密
总发贴数: 279279279279 篇
注册日期: 2006/10/08
消息 查看 搜索 好友 邮件 复制 引用 回复
此主题相关图片如下:
剩下的就是把代码段selector装入CS寄存器,把数据段selector装入DS,ES,FS和GS
中。以下定义Descriptor:
; GDT data
gdt_reg dw gdt_size,0,0 ; (1)
dummy_dscr segment_descriptor <0,0,0,0,0> ; (2)
code32_dscr segment_descriptor <0ffffh,0,0,9ah,0cfh,0> ; (3)
data32_dscr segment_descriptor <0ffffh,0,0,92h,0cfh,0> ; (4)
core32_dscr segment_descriptor <0ffffh,0,0,92h,0cfh,0> ; (5)
code16_dscr segment_descriptor <0ffffh,0,0,9ah,0,0> ; (6)
data16_dscr segment_descriptor<0ffffh,0,0,92h,0,0> ; (7)
gdt_size = $-(offset dummy_dscr) ; (8)
Projects-Project:从实模式进入保护模式 http://mp.tongji.edu.cn/cgi-bin/topic.cgi?forum=6&topic...
第2页共8页 2011/12/251:46
注释说明:
(1).为填充GDTR (GDT Register) 而设立。采用LGDT指令将寄存器的值设为参数(Base
address)指向的值。GDTR的格式如图所示。于是GDTR可以如下建立:
lgdt[fword ds:gdt_reg]
(2).空描述符(null Descriptor)。该描述符设为全0。cpu为此提供了很多保护机
制,其中之一就是“非法”描述符(0号描述符)。如果一个段是通过0号描述符装入
的,那么对它的每次访问都将会引起General Protection Fault,所以它可以用作一个
标记。
(3).32位的代码段(4G size, 32-bit operands, code type)
(4).32位的数据段(4G size, 32-bit operands, data type)
(5).32位的core(4G size, 32-bit operands, data type)
(6).16位的代码段(64k, 16-bit operands, code type)
(7).16位的数据段(64k, 16-bit operands, data type)
cpu在装入一个段寄存器之前会自动检测要装入的selector是否合法。这就是说,如果
像实模式下一样装入一个段地址(比如1234h),cpu就会先在GDT中找找有没有合法的
描述符。对应于1234h,就可能没有合法的描述符,所以又会引起一个General
Protection Fault。
现在,关闭实模式下的中断,在保护模式中用不上:
cli
然后切换到保护模式。设置cr0寄存器的第1位即可进入保护模式:
moveax, cr0
oreax, 1
movcr0, eax
接下来要用一条远跳转指令jmp far跳到要开始的代码处。jmp far用来清空指令预取队
列,并为CS装入新的保护模式selector。这样做是必须的,否则指令预取队列中的指令
可能仍然是按照实模式下的方式解码的。到此为之,cpu已经运行在保护模式下了,并
且从上一个跳转目的地开始执行程序,剩下的事情就是将合适的selector装入其他段寄
存器,然后调用需要的main
(跳转到C程序)。
2007/03/27 03:26pm IP: 已设置保密
0620080395 0620080395 0620080395 0620080395
信息:
威望: 0
来自: 保密
总发贴数: 279279279279 篇
注册日期: 2006/10/08
消息 查看 搜索 好友 邮件 复制 引用 回复
4.引导程序
引导程序的作用就是将系统从实模式转入保护模式。可以采用NASM编写引导程序。
编写引导程序必须遵循的基本
如下:
(1). BIOS将把我们自己编写的引导程序加载到地址07C00H处,但是其具体的段地址和
偏移地址是不确定的
(2).引导程序必须编译成纯二进制文件
(3).该纯二进制文件的大小必须是512字节
(4).该文件必须以AA55H结束
内存问题
尽管自己编写的引导程序总是被加到地址07C0H处,但并不知道BIOS将把它存放在哪个
段地址和偏移地址。段地址可以是0000H和07C0H中的任意位置。
保护模式下的特性
(1).4GB的内存访问空间
系统启动时,处理器进入所谓的实模式(16位),这限制了处理器访存大小只有大约
1GB。然而,在保护模式(32位)下,访存大小可达到4GB,比1GB大得多。
(2).内存保护机制
保护模式因其具有的内存保护机制而得名。由于内存具有写保护机制,关键区域就不能
被访问(例如操作系统部分或其它应用程序的数据等)。
Projects-Project:从实模式进入保护模式 http://mp.tongji.edu.cn/cgi-bin/topic.cgi?forum=6&topic...
第3页共8页 2011/12/251:46
(3).多任务
处理器支持任务切换。多任务并不是并行处理,而是分时调度。这一特征需要保存寄存
器的状态并且加载下一个任务的寄存器值。(这可以由软件完成,但大部分情况下用硬
件更快)
2007/03/27 03:29pm IP: 已设置保密
0620080395 0620080395 0620080395 0620080395
信息:
威望: 0
来自: 保密
总发贴数: 279279279279 篇
注册日期: 2006/10/08
消息 查看 搜索 好友 邮件 复制 引用 回复
编写引导程序
以一个引导程序为例,说明简单引导程序的编写方法。
(1).建立空白的文本文件,命名为boot.asm
(2).计算机启动时在实模式(16位)下运行,告诉编译器要编译的是16位的指令。
[BITS 16]
(3).利用ORG指令告诉编译器引导程序位于内存的哪个位置。
[ORG 0x7C00]
(4). 运用实模式下支持的BIOS中断(Int 10h)在屏幕上显示字符’A’。
把设置显示模式的命令放入ah中,此处使用0
mov ah, 0
通过al寄存器指定显示模式,此处选择10h,它指定了一个80*25的屏幕大小
mov al, 10h
将0Eh放入ah寄存器,告诉BIOS在屏幕上显示单个字符。
mov ah, 0Eh
BIOS取出al寄存器设置的ASCII值
mov al, ‘A’
BH寄存器用来设置页号,此处没有用到,设置成0
mov bh, 0
开启中断10h
int 10h
(5).在屏幕上显示了“A”之后将系统挂起
hang:
jump hang
(6).为了让BIOS能识别出该文件是有效的引导程序,地址0x510处的字必须设置成
AA55h,首先用0填满剩余的文件空间,然后加上AA55h
times 510-($-SS) db 0
dw 0AA55h
至此,得到了完整的代码:
[BITS 16] ; We need 16-bit intructions for Real mode
[ORG 0x7C00] ; The BIOS loads the boot sector into memory location 0x7C00
mov ah, 0; Set new video mode
mov al, 10h; Video mode = 10h (80x25 with 16 colors)
mov ah, 0Eh ; We want to print a single character
mov al, 'A' ; That character is 'A'
mov bh, 0 ; Page number 0
int 10h
hang:
jmp hang; Loop, self-jump
times 510-($-$$) db 0 ; Fill the rest of the files with zeros, until we
reach 510 bytes
dw 0AA55h; Our boot sector identifyer
(7).编译成纯二进制文件:
Projects-Project:从实模式进入保护模式 http://mp.tongji.edu.cn/cgi-bin/topic.cgi?forum=6&topic...
第4页共8页 2011/12/251:46
nasmw –f bin boot.asm –o boot.img
其中“-f bin ”设置格式为纯二进制。可以选择不同的输出文件名,比如
“boot.img”(拟软盘),因为这是一个逻辑名字。
2007/03/27 03:34pm IP: 已设置保密
0620080395 0620080395 0620080395 0620080395
信息:
威望: 0
来自: 保密
总发贴数: 279279279279 篇
注册日期: 2006/10/08
消息 查看 搜索 好友 邮件 复制 引用 回复
此主题相关图片如下:
接下来在VMware中调试它。调试的过程如下:
(1).选择Floppy,采用软盘启动
2007/03/27 03:35pm IP: 已设置保密
0620080395 0620080395 0620080395 0620080395
信息:
威望: 0
消息 查看 搜索 好友 邮件 复制 引用 回复
此主题相关图片如下:
Projects-Project:从实模式进入保护模式 http://mp.tongji.edu.cn/cgi-bin/topic.cgi?forum=6&topic...
第5页共8页 2011/12/251:46
来自: 保密
总发贴数: 279279279279 篇
注册日期: 2006/10/08
(2).双击Floppy,选择Use floppy image
2007/03/27 03:36pm IP: 已设置保密
0620080395 0620080395 0620080395 0620080395
信息:
威望: 0
来自: 保密
总发贴数: 279279279279 篇
注册日期: 2006/10/08
消息 查看 搜索 好友 邮件 复制 引用 回复
此主题相关图片如下:
Projects-Project:从实模式进入保护模式 http://mp.tongji.edu.cn/cgi-bin/topic.cgi?forum=6&topic...
第6页共8页 2011/12/251:46
(3).点击Browse,选择刚才编译好的boot.img文件,单机OK确定。
2007/03/27 03:36pm IP: 已设置保密
0620080395 0620080395 0620080395 0620080395
信息:
威望: 0
来自: 保密
总发贴数: 279279279279 篇
注册日期: 2006/10/08
消息 查看 搜索 好友 邮件 复制 引用 回复
此主题相关图片如下:
(4).启动VMWare虚拟机,可以看到,屏幕上出现’A’,然后系统挂起
Projects-Project:从实模式进入保护模式 http://mp.tongji.edu.cn/cgi-bin/topic.cgi?forum=6&topic...
第7页共8页 2011/12/251:46
2007/03/27 03:37pm IP: 已设置保密
0620080395 0620080395 0620080395 0620080395
信息:
威望: 0
来自: 保密
总发贴数: 279279279279 篇
注册日期: 2006/10/08
消息 查看 搜索 好友 邮件 复制 引用 回复
5. 进到保护模式
前面通过在实模式下的BIOS中断在屏幕上显示了一个字符,现在我们将正式进入到保护
模式。
在实模式中线性地访问内存;在保护模式中,X86有两种访存方式:分段或分页。
在分段模型中,内存划分成小的或大的段而不是线性的内存。本Project使用这个模
型。如果想要写些什么到内存地址0xB8000——显存处,可以定义一个段,使其起始地
址为0xB8000。这就是08h段。如果要访问线性地址为0xB8002处,只需写08h:0002h即
可。但有一个限制:只能有8192个不同的段。可以选择某个段是只读的或是可读写的,
并且各段可以互相重叠。
分页模型常用来实现虚拟内存。如果
访问一个不存在的页,CPU将产生一个异常并
且暂时中断程序。然后就依赖于操作系统(也就是我们)来将该页从磁盘载入内存,接
着程序继续运行,就像根本不知道我们做过些什么。页的大小通常在4KB的范围内。在
本Project中,为了进入保护模式,必须选择一种内存模型。此处选择分段模型。保护
模式中默认的模型是分段。如果要转到分页模型,只需设置cr0的31位。这些设置必须
在保护模式而不是实模式下完成。
2007/03/27 03:40pm IP: 已设置保密
本主题共有 本主题共有 本主题共有 本主题共有 2222 页 页 页 页 9 7 [ 1111 2 ] 8 :
快速回复主题:快速回复主题:快速回复主题:快速回复主题: Project:从实模式进入保护模式
输入用户名和密码:输入用户名和密码:输入用户名和密码:输入用户名和密码: 用户名用户名用户名用户名: 客人 没有注册? 密码:密码:密码:密码: 忘记密码?
上传附件或图片上传附件或图片上传附件或图片上传附件或图片 (最大容量 900900900900KB) 支持类型:
选项选项选项选项
使用 LB5000 标签?
显示您的签名?
有回复时使用邮件通知您?
发 表 回 复 清 除 内 容 [使用 Ctrl+Enter 直接提交贴子]
顶端 加到"个人收藏夹"
主题管理主题管理主题管理主题管理: 总固顶 | 取消总固顶 | 固顶 | 取消固顶 | 精华 | 取消精华 |
提升 | 锁定 | 解锁 | 删除 | 删除回复 | 移动 |
© 中文版权所有: CGI 编程者之家 版本: LB5000MX 1.85
程序版权所有: CGI 编程者之家 程序编制: 山鹰(糊)、 花无缺
本论坛言论纯属发表者个人意见,与 教学论坛 教学论坛 教学论坛 教学论坛 立场无关
Projects-Project:从实模式进入保护模式 http://mp.tongji.edu.cn/cgi-bin/topic.cgi?forum=6&topic...
第8页共8页 2011/12/251:46