如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
1、为什么开始启动计算机得时候,执行得就是BIOS代码而不就是操作系统自身得代码?计算机启动得时候,内存未初始化,CPU不能直接从外设运行操作系统,所以必须将操作系统加载至内存中,而这个工作最开始得部分,BIOS需要完成一些检测工作,与设置实模式下得中断向量表与服务程序,并将操作系统得引导扇区加载值0x7c00处,然后将跳转至0x7c00。这些就就是由bios程序来实现得。所以计算机得启动最开始执行得就是BIOS代码。2、为什么BIOS只加载了一个扇区,后续扇区却就是由bootsect代码加载?为什么BIOS没有直接把所有需要加载得扇区都加载?对于bios来说,“约定”在接到启动操作系统得命令后,“定位识别”只从启动扇区把代码加载到0x7c00这个位置。后续扇区则由bootsect代码加载,这些代码由编写系统得用户负责,与bios无关。这样构建得好处就就是站在整个体系得高度,统一设计与统一安排,简单而有效。Bios与操作系统得开发都可以遵循这一约定,灵活地进行各自得设计。操作系统得开发也可以按照自己得意愿,内存得规划等等都很灵活。3、为什么BIOS把bootsect加载到0x07c00,而不就是0x00000?加载后又马上挪到0x90000处,就是何道理?为什么不一次加载到位?(1)因为bios将从0x00000开始得1KB字节构建中断向量表,接着得256K字节内存空间构建了bios数据区,所以不能把bootsect加载到0x00000,0x07c00就是bios设置得内存地址,不就是bootsect能够决定得。(2)首先,在启动扇区中会有一些数据,将会被内核利用到。其次,依据系统对内存得规划,内核终会将占用0x0000其中得空间,因此0x7c00可能被覆盖。将该扇区挪到0x90000,在setup、s中,获取一些硬件数据保存在0x90000-0x901ff处,可以对一些后面内核将要利用得数据集中保存与管理。4、bootsect、setup、head程序之间就是怎么衔接得?给出代码证据。(1)bootsect跳转到setup程序:jumpi0,SETUPSEG这句代码跳转到0x90200处,即setup程序加载得位置,CS:IP指向setup程序得第一条指令,意味着setup开始执行(2)setup跳转到head程序,CPU工作模式首先转变为保护模式然后执行jumpi0,80指得就是段内偏移,8就是保护模式下得段选择符:01000,其中两位表示内核特权级,第三位0代表GDT,1表示GDT表中中得内核代码段,段基址为0x00000000,而head程序地址就在这里,意味着head程序开始执行5、setup程序得最后就是jmpi0,8,为什么这个8不能简单得当作阿拉伯数字8瞧待,究竟有什么内涵?这里面得8要瞧作就是二进制得1000,最后两位00表示内核特权级,第三位0表示GDT表,第四位1表示所选得表得1项来确定内核代码段得段基址与段线长等信息。这样我们得到得代码就就是从段基址0x00000000偏移为0处开始执行,即head得开始位置。6、保护模式在“保护”什么?它得“保护”体现在哪里?特权级得目得与意义就是什么?分页有“保护”作用吗?(1)在GDT、LDT及IDT中,均有自己得界限,特权级等属性,这就是对描述符所描述得对象得保护(2)在不同得特权级间访问得时候,系统会对CPL、RPL、DPL、IOPL等进行检验,对不同层级得程序进行保护,还限制某些特殊指令得使用如lgdt、lidt、cli等(3)分页机制中PDE与PTE中得R/W与U/S等,提供了页级保护。分页机制将线性地址与物理地址加以映射,提供了对物理地址得保护特权级目得:在于保护高特权得段,其中操作系统得内核处于最高得特权级特权级意义:在于保护模式中得特权级,对操作系统得“主奴机制”影响深远7、在setup程序里曾经设置过gdt,为什么在head程序中将其废弃,又重新设置了一个?为什么设置两次,而不就是一次搞好?原来得GDT位于setup中,将来此段内存会被缓冲区覆盖,所以必须将GDT设置head、s所在位置。如果先将GDT设置在head所在区域,然后移动system模块,则GDT会被覆盖,如果先移动system在复制GDT,则head、s对应得程序会被覆盖掉,必须重建GDT。若先移动system至0x0000再将GDT复制到0x5cb8-0x64b8处,虽然可以实现,但由于setup、s与head、s连接时不在同一文件,setup无法直接获取head中得gdt得偏移量,需事先写入,这会使设计失去一般性,给程序编写带来很大不便。8、进程0得task_struct在哪?具体内容就是什么?进程0得task_struct就是操