为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

Project_0:从实模式进入保护模式

2011-12-25 8页 pdf 855KB 40阅读

用户头像

is_128398

暂无简介

举报
Project_0:从实模式进入保护模式 >> 欢迎您,客人客人客人客人: 登录 | 注册 | 忘记密码 | 在线 | 搜索 | 帮助  教学论坛  Projects [返回]    Project:从实模式进入保护模式  标记论坛所有内容为已读  >> Projects欢迎您的到来 <<     ◆您是本帖第 7937793779377937 个阅读者◆       * 贴子主题* 贴子主题* 贴子主题* 贴子主题: Project:从实模式进入保护模式   0620080395 06200803...
Project_0:从实模式进入保护模式
>> 欢迎您,客人客人客人客人: 登录 | 注册 | 忘记密码 | 在线 | 搜索 | 帮助  教学论坛  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
/
本文档为【Project_0:从实模式进入保护模式】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索