操作系统的启动

上传人:工**** 文档编号:564911960 上传时间:2022-10-24 格式:DOCX 页数:9 大小:395.58KB
返回 下载 相关 举报
操作系统的启动_第1页
第1页 / 共9页
操作系统的启动_第2页
第2页 / 共9页
操作系统的启动_第3页
第3页 / 共9页
操作系统的启动_第4页
第4页 / 共9页
操作系统的启动_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《操作系统的启动》由会员分享,可在线阅读,更多相关《操作系统的启动(9页珍藏版)》请在金锄头文库上搜索。

1、操作系统实验报告课程名称操作系统实验实验项目名称操作系统的启动学号班级20120616姓名专业计算机科学与技术学生所在学院计算机科学与技术学院指导教师初妍实验室名称地点21#428哈尔滨工程大学计算机科学与技术学院一、实验概述1. 实验名称操作系统的启动2. 实验目的(1) 跟踪调试EOS在PC机上从加电复位到成功启动的全过程,了解操 作系统的启动过程。(2) 查看EOS启动后的状态和行为 理解操作系统启动后的工作方式。3. 实验类型验证性实验4. 实验内容调试EOS操作系统的启动过程包括1 使用Bochs做为远程目标机;2 .调试BIOS程序;3 调试软盘引导扇区程序;4 调试加载程序;5

2、调试内核;6 查看EOS启动后的状态和行为二、实验环境EOS操作系统和配套的IDE集成开发环境。三、实验过程1设计思路和流程图CPU从默认位管执行BIOS的开机口检和初始化程序, 之后BIOS将软盘引导扇区加载到0x7C00并执行。软盘引导扇区中的放xX程序开始执行,将软盘根目录 中的Loader程序文件Loader.bin加载到Ox!()()并执行Loader程序开始执行,先加载Kemel.dll,然后启动保 护模式和分页机制,最后酬K到Kemel.dll的入口点执行3Kemel.dll开始执行,初始化EOS内核,EOS启动完毕图2-1.EOS操作系统的启动过程流程图2算法实现验证性试验无算

3、法。3需要解决的问题及解答 试验指导(1) .为什么EOS操作系统从软盘启动时要使用boot.bin和loader.bin两个程 序,使用一个可以吗?它们各自的主要功能是什么?如果将loader .bin的功能 移动到boot. bin文件中则boot. bin文件的大小是否仍然能保持小于512字节? 答:boot文件夹包含了两个汇编文件boot.asm和loader.asm。这两个文件生 成的二进制文件boo t. bin和loader .bin会被写入软盘镜像文件。操作系统启动 时boot.bin和loader.bin引导软盘加载程序 二者缺一不可。使用Boot.bin 的主要功能是引导软

4、盘 loader.bin的主要功能是加载程序。如果把 loader .bin功能移动到boo t. bin程序中必然导致程序规模扩大 可能使其大 于512字节。(2) .软盘引导扇区加载完毕后内存中有两个用户可用的区域,为什么软盘 引导扇区程序选择将loader .bin加载到第一个可用区域的0x1000处呢?这样做 有什么好处?这样做会对loader .bin文件的大小有哪些限制。答:首先用户只用两个可用区域,加载位置非此即彼。第一个可用用户区是 低地址区,且空间大小比较小,适合容纳小文件,所以我们选择将占用空间小的 loder .bin加载到第一用户区。优点:由低地址开始,便于检索查找。小

5、文件占用小空间,节约资源。 限制:loader.bin文件必须小于1c00k.(3) 练习使用Bochs单步调试BIOS程序、软盘引导扇区程序和loader程序 加深对操作系统启动过程的理解。(4) .仔细比较实验指导10-5图和图10-6尝试说明哪个是应用程序的进程 它和系统进程有什么区别 哪个是应用程序的主线程 它和系统线程有什么区 别。答:图10-6是应用程序的进程在进程列表中只有一个ID为1的系统进程 其优先级为24包含有10个线程 其中的ID为2的线程是该进程的主线程 系统进程没有映像名称。在线程列表中有10个线程它们都是系统线程。 区别:主线程的优先级别高。存放在物理内存的低端。4

6、主要数据结构、实现代码及其说明 验证性实验 无此项目。5源程序并附上注释 验证性实验 无此项目。6.程序运行时的初值和运行结果,实验过程1. 调试BIOS程序(1) .在Console窗口中输入调试命令sreg后按回车 显示当前CPU中各 个段寄存器的值 如图2-1。其中CS寄存器信息行中的“s=0xf000”表示CS寄 存器的值为0xf000.(2) .输入调试命令r后按回车,显示当前CPU中各个通用寄存器的值如图 10-3。其中“rip: 0x00000000:0000fff0”表示 IP 寄存器的值为 0xfff0。(3) .输入调试命令xp /1024b 0x0000 查看开始的102

7、4个字节的物理 内存。在Console中输出的这1K物理内存的值都为0 说明BIOS中断向量表还 没有被加载到此处。(4) .输入调试命令xp /512b 0x7c00查看软盘引导扇区应该被加载到的内存位置。输出的内存值都为0载到此处。2. 调试软盘引导扇区程序a. 输入调试命令vb 0x0000:0x7c00 这样就在逻辑地址0x0000:0x7c00Ox7c00b. 输入调试命令c继续执行 在0x7c00处的断点中断。中断后会在 Conso】e如下(0)0x00007c00 0000:7c00 (unk. ctxt): jmp . +0x006d (0x00007c6f) ; eb6dc.

8、 为了方便后面的使用 先在纸上分别记录下此条指令的字节码eb6d 0x00007c6fd. 输入调试命令sreg验证CS0x0000e. 输入调试命令r验证IP0x7c00f. 由于BIOS程序此时已经执行完毕 输入调试命令xp /1024b 0x0000 验证此时BIOS中断向量表已经被载入。g. 输入调试命令xp /512b 0x7c00显示软盘引导扇区程序的所有字节 码。观察此6块内存最开始的两个字节分别为0xeb和0x6d一条指令的字节码eb6d是相同的。h. 输入调试命令xp /512b 0x0600验证图3-2中第一个用户可用区域 是空白的。i. 输入调试命令xp /512b 0x

9、7e00验证图3-2中第二个用户可用区域 是空白的。j自己设计两个查看内存的调试命令 分别验证这两个用户可用区域 的咼地址端也是空白的。k.输入调试命令xp /512b 0xa0000验证图3-2中上位内存已经被系统 占用。自己设计一个查看内存的调试命令 验证上位内存的高地址端已经被系统占 用。查看boot.lst文件1) .boot”文件夹中的bootasm文件。2) 打开文件boot.lst。3) .将boot. 1st文件和boot. asm文件对比可以发现 此文件包含了 bootasm 文件中所有的汇编代码 同时在代码的左侧又添加了更多的信息。4) .在 boot.1st73 行73

10、00000000 EB6D jmp shor t St ar t 此行包含的信息a. 73是行号。b. 00000000是此条指令相对于程序开始位置的偏移第一条指令应该为 0。C.EB6D软盘引导扇区程序的主要任务就是将软盘中的loader .bin文件加载到物理内存 的 0x1000loader0x1000 处的指令继续执行loader程序。按照下面的步骤调试此过程1) 在boo t.lst文件中查找到加载完毕loader .bin文件后要跳转到loader程 序中执行的指令 第 278 行 278 00000181 EA00100000 jmp 0:LOADER_ORG根0x7C00 的偏

11、移 0x0181地址为 0x0000:7D81。2) .输入调试命令vb 0x0000:0x7d81添加一个断点。3) .输入调试命令cConsole窗口中显示(0)0x00007d81 0000:7d81 (unk. ctxt): jmp far 0000:1000 ; ea00100000 此条指令会跳转到物理内存0x1000Loader吾行。4) .按照打开boo t.lst文件的方法打开loader .lst10 loader3333 00000000 E91801 jmp Start5) .输入调试命令xp /8b 0x1000查看内存0x1000前三个字节和loader .lst文

12、件中的第一条指令的字节码是相同的。6) 根据之前记录的loader.bin令查看内存中loaderloader .lst文件中最后指令的字节码比较,验证loader程序被完全加载到了正确的位置。 xp /8bbochs:616 :3x93Ixff紗xFf Ixc?Sxc2 0xS4轻x盼阿调试加载程序Loader kerne1d11然后让CPU跳转到 kernel.dll1.在loader .lst文件中查找到准备进入EOS操作系统内核执行的指令 第 755 行 755 0000014F FF1517010080 call dword va_ImageEntry2.节SECTION是NASMb

13、oot.asm程序中只有一个节所以之前计算的结果都是正确的 但是在loaderasm程序中有两个节 并且此 条指令是在第二个节中。下面引用的代码是loader .1st中第一个节的最后一条 指令第 593593 000003C1 C20600 ret 6因为第一个节中最后一条指令的偏移为0x03cl,并占用了 3个字节,字节码为 C20600所以可以计算出进入内核执行的指令所在的物理地址为0x1513 0xl000+0x03cl+0x3+0xl4f3. 使用添加物理地址断点的调试命令pb 0x1513添加一个断点。4. 输入调试命令cConsole窗口中显示要执行的下一条指令 注意 此时的逻辑

14、地址都为虚拟地址(0)0x000015130008:0000000080001513 (unk. ctxt): call dword ptr ds:0x80001117 ; ff1517110080 口定内核入口点函数的地址就保存在虚拟地址0x8000117处的四个字节中。5. 使用查看虚拟内存的调试命令x /1wx 0x80001117查看内存中保存的32位函Console0x000000008000111711 : 0x800* 记录下此块内存中保存的函数地址,后面的实验会验证内核入口点函数的地址与此地址是一致的。调试内核1在OS Lab的“项目管理器”窗口中打开ke文件夹中的st ar t.c 件 此 文件中只定义了一个函数就是操作系统内核的入口点函数KiSystemStartup。2 . 在 KiSystemStartup61 KiInitializePic();添加一个断点。3 .现在可以在Console窗口中输入调试命令c继续调试 在刚刚添加的断点 处中断。4在start.c源代码文件中的KiSys temS tar tup g弹出的快捷菜单中选择“添加监视” KiSystemStartup函数就被添加到了 “监 视”窗口中。在“监视”窗口中可以看到此函数地址为void (PVOID) 0x800* 与在虚拟内

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号