操作系统的启动_第1页
操作系统的启动_第2页
操作系统的启动_第3页
操作系统的启动_第4页
操作系统的启动_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精品文档你我共享实验2操作系统的启动实验性质:验证建议学时:2学时一、 实验目的跟踪调试EOS在PC机上从加电复位到成功启动的全过程,了解操作系统的启动过程。查看EOSB动后的状态和行为,理解操作系统启动后的工作方式。二、 预备知识阅读本书第3章,了解E0礫作系统的启动过程。阅读第2章中的第2.4节,复习汇编语言的相关知识,并掌握NASMC编代码的特点。阅读附录A, 了解Bochs和Virtual PC 这两款虚拟机软件的特点,重点熟悉 Bochs的调试命令。三、 实验内容3.1准备实验1. 启动 OS Lab。2.新建一个EOS Kernel项目。3.在项目管理器” 窗口中打开boot文件夹

2、中的boot.asm和loader.asm两个汇编文件。boot.asm是软盘引导扇区程序的源文件,loader.asm是loader程序的源文件。简单阅读一下这两个文件中的NASMC编代码和注释。4.按F7生成项目。5.生成完成后,使用Windows资源管理器打开项目文件夹中的Debug文件夹。找到由boot.asm生成的软盘引导扇区程序boot.bin文件,该文件的大小一定为 512字节(与软盘引导扇区的大小一致)。找到由 loader.asm生成的loader程序loader.bin 文件,记录下此文件的大小1566字节,在下面的实验中会用到。 找到由其它源文件生成的操作系统内核文件ke

3、rnel.dll 。3.2调试E0操作系统的启动过程3.2.1使用Bochs做为远程目标机按照下面的步骤将调试时使用的远程目标机修改为Bochs:1. 在“项目管理器”窗口中,右键点击项目节点,在弹出的快捷菜单中选择“属性”。2.在弹出的“属性页”对话框右侧的属性列表中找到“远程目标机”属性,将此属性值修改为“BochsDebug”(此时按F1可以获得关于此属性的帮助)。3. 点击“确定”按钮关闭“属性页”对话框。接下来就可以使用Bochs模拟器调试BIOS程序和软盘引导 扇区程序了。3.2.2调试 BIOS程序精品文档你我共享按F5启动调试,此时会弹出两个Bochs窗口。标题为“ Bochs

4、 for windows - Display”的窗口相当于计AAAAAA精品文档你我共享AAAAAAdl=0 x0000Ffff, dl=0 x0000Fff, dl-0 x0000Fff,ualid =7 ualid =7 ualid =7 ualid =7 ualid =7KbocJis:2 rrax: 0 x00000080:00000000 rex: rdx: 0 x00000000:00080F20 rbx: rsp: 0 x00000000:03000003 rbp: is i: Ux00300090:00000000 rdi: i8 : 3x30300030:00000000 r

5、9 : 110: 0 x30300030:08000000 rll: 112 : 0 x30300030:00080000 rl3 : rl4: 0 x00300090:09080000 rlS: pip: 0 x00000000: e F latfs 0 x 00000002Id uip vif ac vn nt IOPL=Q 0 x000000000 x000000000 x000000000 x000000000 x000000000X0000B0B00 x806000000 x0000300000000000000000000000000000000000of df i tf sf a

6、F af算机的显示器,显示操作系统的输出。标题为Bochs for windowsConsole ”的窗口是Bochs的控制台,用来输入调试命令,输出各种调试信息。启动调试后,Bochs在CPI要执行的第一条指令(即 BIOS勺第一条指令)处中断。此时,Display窗口没有显示任何内容,Con sole窗口显示要执行的BIOS第 一条指令的相关信息,并等待用户输入调试命令,如图10-1 :05fffsi= jmp far F0S0:e85h;图10-1 : Con sole窗口显示在BIOS第 一条指令处中断从Console窗口显示的内容中,我们可以获得关于BIOS第一条指令的如下信息:行首

7、的OxfffffffO表示此条指令所在的物理地址。fOOO:fffO 表示此条指令所在的逻辑地址(段地址:偏移地址)。jmp far f000:e05b是此条指令的反汇编代码。行尾的ea5be000f0是此条指令的十六进制字节码,可以看出此条指令有5个字节。接下来可以按照下面的步骤,查看CPU在没有执行任何指令之前主要寄存器中的数据,以及内存中的数据:1.在Console窗口中输入调试命令 sreg后按回车,显示当前CPU中各个段寄存器的值,如图10-2。其中CS寄存器信息行中的“ s=0 xf000 ”表示CS寄存器的值为OxfOOO。bochssregrcs:s=0 xf000, dh=0

8、 xff0093ff, dl=0 x0000fff, ualid=7ds: =0 x0003. ss:S=0X0000, esfsldtr:s=0 xB000r dh=0 x00008200 dl-0 x0S0iaffff, ualid=lt:s=axa6a0rdi-x0000fFff, vaiid-iydtr: base -=8x00000800. limit =BxffFf idtr=0 x00000800. limit =0 xFfFf图10-2 :使用sreg命令查看段寄存器的值2.输入调试命令r后按回车,显示当前 CPI中各个通用寄存器的值,如图10-3。其中“ rip:OxOOOO

9、OOOO:OOOOfffO ”表示 IP 寄存器的值为 OxfffO。精品文档你我共享AAAAAA图10-3 :使用r命令查看通用寄存器的值精品文档你我共享AAAAAA3.输入调试命令xp /1024b 0 x0000 ,查看开始的1024个字节的物理内存。在 Con sole中输出的这1K物理 内存的值都为0,说明BIOS中断向量表还没有被加载到此处。4.输入调试命令xp /512b 0 x7c00 ,查看软盘引导扇区应该被加载到的内存位置。输出的内存值都为0,说明软盘引导扇区还没有被加载到此处。可以验证BIOS第一条指令所在逻辑地址中的段地址和CS寄存器值是一致的,偏移地址和IP寄存器的值

10、是一致的。由于内存还没有被使用,所以其中的值都为0。3.2.3调试软盘引导扇区程序BIOS在执行完自检和初始化工作后,会将软盘引导扇区加载到物理地址0 x7c00-0 x7dff位置,并从0 x7c00处的指令开始执行引导程序,所以接下来练习从0 x7c00处调试软盘引导扇区程序:1.输入调试命令vb 0 x0000:0 x7c00,这样就在逻辑地址 0 x0000:0 x7c00 (相当于物理地址0 x7c00 )处添 加了一个断点。2.输入调试命令c继续执行,在0 x7c00处的断点中断。中断后会在Console窗口中输出下一个要执行的指 令,即软盘引导扇区程序的第一条指令,如下(0) 0

11、 x00007c00 0000:7c00 (u nk. ctxt): jmp .+0 x006d (0 x00007c6f) ; eb6d3.为了方便后面的使用, 先在纸上分别记录下此条指令的字节码(eb6d)和此条指令要跳转执行的下一条指令的地址(括号中的 0 x00007c6f )。4.输入调试命令sreg验证CS寄存器(0 x0000)的值。5.输入调试命令r验证IP寄存器(0 x7c00)的值。6.由于BIOS程序此时已经执行完毕,输入调试命令xp /1024b 0 x0000验证此时BIOS中断向量表已经被载入。7.输入调试命令xp /512b 0 x7c00显示软盘引导扇区程序的所

12、有字节码。观察此块内存最开始的两个字节分别为0 xeb和0 x6d,这和引导程序第一条指令的字节码(eb6d)是相同的。此块内存最后的两个字节分别为0 x55和0 xaa,表示引导扇区是激活的,可以用来引导操作系统,这两个字节是boot.asm中最后一行语句dw 0 xaa55定义的(注意,Intel 80386 CPU 使用little-endian字节顺序,参见附录 B)。8.输入调试命令xp /512b 0 x0600 验证图3-2中第一个用户可用区域是空白的。9.输入调试命令xp /512b 0 x7e00 验证图3-2中第二个用户可用区域是空白的。10.自己设计两个查看内存的调试命令

13、,分别验证这两个用户可用区域的高地址端也是空白的。11.输入调试命令xp /512b 0 xa0000 验证图3-2中上位内存已经被系统占用。12.自己设计一个查看内存的调试命令,验证上位内存的高地址端已经被系统占用。NASM汇编器在将boot.asm生成为boot.bin的同时,会生成一个 boot.lst列表文件,帮助开发者调试 boot.asm文件中的汇编代码。按照下面的步骤查看boot.lst 文件:1.在 项目管理器窗口中,右键点击boot 文件夹中的boot.asm文件。精品文档你我共享AAAAAA2.在弹出的快捷菜单中选择打开生成的列表文件”,在源代码编辑器中就会打开文件 boo

14、t.lst 。3. 将boot.lst文件和boot.asm文件对比可以发现, 此文件包含了 boot.asm文件中所有的汇编代码, 同时 在代码的左侧又添加了更多的信息。4.在boot.lst中查找到软盘引导扇区程序第一条指令所在的行(第73行)73 00000000 EB6D jmp short Start此行包含的信息有:73是行号。00000000是此条指令相对于程序开始位置的偏移(第一条指令应该为0)。EB6D是此条指令的字节码,和之前记录下来的指令字节码是一致的。软盘引导扇区程序的主要任务就是将软盘中的loader.bin 文件加载到物理内存的 0 x1000处,然后跳转到load

15、er程序的第一条指令(物理地址0 x1000处的指令)继续执行loader程序。按照下面的步骤调试此过程:1.在boot.lst文件中查找到加载完毕loader.bin 文件后要跳转到loader程序中执行的指令(第 278行)278 00000181 EA00100000 jmp 0:LOADER_ORG根据此指令相对于程序开始(0 x7C00)的偏移(0 x0181)可以得到此指令的逻辑地址为0 x0000:7D81。2.输入调试命令vb 0 x0000:0 x7d81添加一个断点。3.输入调试命令c继续执行,到断点处中断。在Con sole窗口中显示(0) 0 x00007d81 000

16、0:7d81 (unk. ctxt): jmp far 0000:1000 ; ea00100000此条指令会跳转到物理内存0 x1000处(即Loader程序的第一条指令)继续执行。4.按照打开boot.lst文件的方法打开loader.lst 文件,并在此文件中查找到loader程序的第一条指令(第33行)33 00000000 E91801 jmp Start5.输入调试命令xp /8b 0 x1000 查看内存0 x1000处的数据,验证此块内存的前三个字节和loader.lst 文件中的第一条指令的字节码是相同的。6.根据之前记录的loader.bin 文件的大小,自己设计一个查看内

17、存的调试命令,查看内存中loader程序结束位置的字节码,并与loader.lst 文件中最后指令的字节码比较,验证loader程序被完全加载到了正确的位置。3.2.4调试加载程序Loader程序的主要任务是将操作系统内核(kernel.dll 文件)加载到内存中,然后让CPU进入保护模式并且启用分页机制,最后进入操作系统内核开始执行(跳转到kernel.dll 的入口点执行)。按照下面的步骤调试上述过程:精品文档你我共享AAAAAA1.在loader.lst 文件中查找到准备进入 E0操作系统内核执行的指令(第 755行)755 0000014F FF1517010080 call dwor

18、d va_lmageE ntry2.计算此条指令的物理地址要复杂一些:偏移地址实际上是相对于节(节SECTIOI是NASMC编中的概念)开始的。由于在boot.asm程序中只有一个节,所以之前计算的结果都是正确的,但是在loader.asm程序中有两个节,并且此条指令是在第二个节中。下面引用的代码是loader.lst中第一个节的最后一条指令(第593行)593 000003C1 C20600 ret 6因为第一个节中最后一条指令的偏移为0 x03c1,并占用了 3个字节(字节码为C20600),所以可以计算出进入内核执行的指令所在的物理地址为0 x1513( 0 x1000+0 x03c1+

19、0 x3+0 x14f )。3.使用添加物理地址断点的调试命令pb 0 x1513添加一个断点。4.输入调试命令c继续执行,到断点处中断。在Con sole窗口中显示要执行的下一条指令(注意,此时的逻辑地址都为虚拟地址):(0) 0 x00001513 0008:0000000080001513 (unk. ctxt): call dword ptr ds:0 x80001117 ;ff1517110080由于这里使用了函数指针的概念,所以,根据反汇编指令可以确定内核入口点函数的地址就保存在虚拟地址0 x8000117处的四个字节中。5.使用查看虚拟内存的调试命令 x /1wx 0 x8000

20、1117查看内存中保存的32位函数入口地址,在 Console窗口中会输出类似下面的内容:0 x0000000080001117 : 0 x800*记录下此块内存中保存的函数地址,后面的实验会验证内核入口点函数的地址与此地址是一致的。3.2.5调试内核调试内核的步骤如下:1.在OS Lab的项目管理器窗口中打开ke文件夹中的start.c文件,此文件中只定义了一个函数,就是操作系统内核的入口点函数KiSystemStartup 。2.在KiSystemStartup函数中的代码行(第61行)KiI nitializePic();添加一个断点。3.现在可以在Con sole窗口中输入调试命令c继

21、续调试,在刚刚添加的断点处中断。4.在start.c源代码文件中的KiSystemStartup函数名上点击鼠标右键,在弹出的快捷菜单中选择添加监视”,KiSystemStartup函数就被添加到了监视”窗口中。在 监视”窗口中可以看到此函数地址为void (PVOID) 0 x800* 精品文档你我共享AAAAAA与在虚拟内存x80001117处保存的函数入口地址相同,说明的确是由Loader程序进入了操作系统内核。5.按F5继续执行EOS操作系统内核,在Display窗口中显示EO操作系统已经启动,并且控制台程序已经 开始运行了。3.2.6 EOS启动后的状态和行为查看EOS勺版本号:1.

22、在控制台中输入命令 ver ”后按回车。精品文档你我共享AAAAAA2.输出EOS版本后的控制台如图10-4所示。图10-4 :使用ver命令查看EOS勺版本号。 查看E0启动后的进程和线程的信息:1.在控制台中输入命令 pt ”后按回车。2.输出的进程和线程信息如图10-5所示。昭FC -PC 2007Action di t 匸D l&ppyCONSOLE-1 (Press Ctri + FlF8 to suitch console 弊indou.) )Lfe 1 cone to EOS shel 1uerTe vat ion EOS (Version llunber 1.01ptProce

23、ss List (1 Process) .EX.WXWID * Systen? : Priority 3 ThreadCount 1 FrinaryThread ID !1VZ4102MxAi11 a| JlFCaUID t Systen?:JU 1 S L l JLUPriorityliirCclOl J K E K ! State :iHtParent Proces sID StartAddressP0Ready19x900181?C2QY24Ualting1QxSOO1SE3A2124Running1Ox80OlB26DZZ24Uaiting1Gx8001826DZ3YZ4Uaiting

24、10X8OO18Z6DZ1Y21Halting10 x8001826DZ5YZ1Ua iting10 x80018260z&24Uniting10 x80018260Z7Z4Walting10 x80018Z6D2824Uaiting10 x80018Z6D图10-5 :使用pt命令查看进程和线程的信息。有必要对图10-5中显示的进程和线程信息进行一下详细的说明。在进程列表中只有一个ID为1的系统进程,其优先级为24,包含有10个线程,其中的ID为2的线程是该进程的主线程,系统进程没有映像名称。在线 程列表中有10个线程,它们都是系统线程。其中优先级为0的是空闲线程,当没有优先级大于0的线程占

25、用处理器时,空闲线程就会在处理器上运行并处于运行状态( Running ),否则就处于就绪状态(Ready)。ID为 20的线程是控制台派遣线程,用于将键盘事件派遣到活动的控制台线程,所以在没有键盘事件发生的时间里,该线程都处于阻塞状态( Waiting )。余下的八个线程都是控制台线程,分别对应于八个控制台,由于它们执行的是同一个控制台线程函数(ke/sysproc.c文件中的KiShellThread函数),所以它们开始执行的地址都是相同的。控制台线程只有在处理控制台命令的时候才会处于运行状态,其它时间它们都在等待控制台命令的 精品文档你我共享AAAAAA输入,会处于阻塞状态。由于本次是在

26、控制台1中执行的pt命令,所以控制台1对应的线程处于运行状态,而其它的七个控制台线程都处于阻塞状态。读者可以尝试按Ctrl+F8切换到控制台8,然后执行pt命令并查看执行的效果。查看有应用程序运行时进程和线程的信息:1.在OS Lab中选择 调试”菜单中的 停止调试”结束之前的调试。2.在OS Lab项目管理器窗口中双击Floppy.img文件,使用FloppylmageEditor工具打开此软盘镜像文 件。3.打开配套资源 学生包”在其中找到本实验对应的文件夹。可以在本书前言部分找到学生包”的下载地址。4.将本实验文件夹中的 Hello.exe文件拖动到FloppyImageEditor工具

27、窗口的文件列表中释放,Hello.exe文件即被添加到软盘镜像文件中。Hello.exe 个E0磁用程序,其源代码可以参见本实验文件夹中的Hello.c源文件。5.在FloppyImageEditor 中选择文件菜单中的保存后关闭FloppyImageEditor 。6.按F5启动调试。7.待EOSB动完毕,在E0腔制台中输入命令 hello ”后按回车。此时Hello.exe应用程序就开始执行。8.迅速按Ctrl+F2切换到控制台2,并输入命令 pt ”后按回车。输出的进程和线程信息如图10-6所示。|岭osL&b FC i erosoftVirtual FC 200T-ipx|Action d.i t Dflcppy HelpICONSOLE-2 (Press Ctrl+FPFB to suitchconsole u) )ndou,* )lUeleone to EOS shell亦1 * Process List(2 Process) “絃厦“住厦“試ID iSystem? I Priority i ThreadCounti PrimaryThread ID ImageNaine12419231H8133a: M

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论