版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
经典word整理文档,仅参考,双击此处可删除页眉页脚。本资料属于网络整理,如有侵权,请联系删除,谢谢!1.为什么计算机启动最开始的时候执行的是BIOS代码而不是操作系统自身的代码?答:通常我们用C语言写的用户程序,必须在操作系统的平台上执行,即操作作最开始的部分,就是由bios程序来实现的。所以计算机启动最开始执行的是bios代码2.为什么BIOS只加载了一个扇区,后续扇区却是由bootsect代码加载?为什么BIOS没有把所有需要加载的扇区都加载?答:对BIOS启动扇区把代码加载到0x7c00这个位置。后续扇区则由bootsect代码加载,这些代码由编写系统的用户负责,与BIOS无关。这样构建的好处是站在整个体系的高度,统一设计和统一安排,简单而有效。BIOS和操作系统的开发都可BIOS可以不用知道内核镜像的大小以及其在软盘的分布等等信息,减轻了BIOS程序的复杂度,降低了硬更为灵活。另外,如果要使用BIOS进行加载,而且加载完成之后再执行,则需要很长的时间,因此Linux采用的是边执行边加载的方法。3.为什么BIOS把bootsect加载到0x07c00,而不是0x00000?加载后又马上挪到0x90000处,是何道理?为什么不一次加载到位?BIOS首先会把中断向量表加载到0x000000x003ff的1KB的内存空间,在加载bootsect时约定加载到0x07c00处,符合内存布局,如下。加载之后挪到0x90000处的原因如下:首先内核会使用启动扇区中的一些数据,如第508509字节处的ROOT_DEV;其次,依据系统对内存的规划,内核占用0x0000开始的空间,因此0x7c00可能会被覆盖。因为加载到0x07c00是BIOS约定好的,操作系统只能遵守这个约定。4.bootsect、setup、head程序之间是怎么衔接的?给出代码证据。答:bootsect首先利用int0x13中断分别加载setup程序及systembootsect程序的任务完成之后,执行jmpi0,SETUPSEG由于bootsect将setup段加载到了SETUPSEG:0的地方,在实模式下,该指令跳转到setup段的第一条指令。setup执行了之后,内核被移到了0x00000处,系统进入了保护模式,并加载了中断描述符表和全局描述符表lidtidt_48lgdtgdt_48在保护模式下,一个重要的特征就是根据GDT决定后续执行哪里的程序。开启保护模式后,执行jmpi0,8根据保护模式的机制,该指令执行后跳转到以GDT第2项中的base_addr为基0base_addr为0head放置在内核的头部,因此程序跳转到head中执行5.setup程序里的cli是为了什么?答:cli是关中断指令。因为此时需要由16位实模式向32位保护模式转变,即式的中断机制尚未完成时不允许响应中断,以免发生未知的错误。6.setup程序的最后是jmpi0,8为什么这个8不能简单的当作阿拉伯数字8看待?答:这里8要看成二进制1000,最后两位00表示内核特权级,第三位0表示GDT1表示根据GDT中的第2项来确定代码段的段基址和段限长等0x000000000处开始执行的,即head的开始位置。注意到已经开启了保护模式的机制,这里的8是保护模式下的段选择符,而不能当成简单的阿拉伯数字8来看待。7.打开A20和打开pe究竟是什么关系,保护模式不就是32位的吗?为什么还要打开A20?有必要吗?答:有必要。A20是cpu的第21位地址线,A20未打开的时候,实模式下的最大寻址为1MB+64KB,而第21根地址线被强制为0,所以相当于cpu“回滚”到内存地址起始处寻址。打开A20仅仅意味着CPU可以进行32位寻址,且最大寻址空间是,而打开PE是使能保护模式。打开A20是打开PE的必要条件;而打开A20不一定非得打开PE。打开PE是说明系统处于保护模式下,如果不打开A20的话,可以访问的内存只能是奇数1M段,若要真正在保护模式下工作,必须打开A20,实现32位寻址。8.Linux是用C语言写的,为什么没有从main还是开始,而是先运行3个汇编程序,道理何在?答:通常用C语言编写的程序都是用户应用程序,这类程序的执行必须在操作行代码从硬盘加载到内存。BIOS程序在运行,需要借助BIOS分别加载bootsectsetup及system3个程序来IDT和、设置分页机制等等,并实现从开机时的16位实模式到main函数执行需要的32位保护模式之间的转换。当计算机处在32main的条件才算准备完毕。9.为什么不用call,而是用main函数?画出调用路线图,给出代码证据。答:CALL指令会将EIP的值自动压栈,保护返回现场,然后执行被调函数,档执行到被调函数的ret指令时,自动出栈给EIPCALLhead程序向mainmain函数返回的;同时由于main所以要达到既调用maincall而是选择了ret调用线路图见P42图146。代码如下:(见P36最下面)setup_paging:…ret10.保护模式的“保护”体现在哪里?答:打开了保护模式后,CPU的寻址模式发生了变化,需要依赖于GDT去获GDT又防止了代码段自身的访问超限,明显增强了保护作用。同时,保护模式中特权级的引入对于操作系统内核提供了强有力的保护。Intel从硬件上禁止低特权级代码段使用一些关键性指令,还提供了机会允许操clisti等对掌控局面TR、LDT是逻辑地址形成线性地址的关键,因此操作系统可以掌控线性地址。物理用户进程只能使用逻辑地址。11.特权级的目的和意义是什么?为什么特权级是基于段的?统的安全性。保护模式中特权级的引入对于操作系统内核提供了强有力的保护。Intel从clisti等对掌控局面至关重要TRGDTLDT是只能使用逻辑地址。段,数据放在一个段,并通过段选择符(包括CS、SS、DS、ES、FS和GS)点和硬件实现的一种考虑。12.在setup程序里曾经设置过一次head设置了一个?为什么折腾两次,而不是一次搞好?答:见P33点评。13.在headidt的前面有184个字节的head程序的剩余代码,剩余了什么?为什么要剩余?idt前面有184after_page_tables、ignore_int和setup_paging代码段,其中after_page_tablesignore_int用做初始化中断时的中断处理函数,setup_paging则是初始化分页。剩余的原因:after_page_tablesmain函数的跳转做准备。L6处执行。ignore_int为中断处理函数,使用ignore_int将idt全部初始化,因此如果中断开启后,可能使用了未设置的中断向量,那么将默认跳转到ignore_int处执行。这样做的好处是使得系统不会跳转到随机的地方执行错误的代码,所以ignore_int不能被覆盖。setup_paging0x0000和0x5000的进行了初始化操作。该代码需要“剩余”用于跳转到main,即执行”ret”指令。14.进程0的task_struct在哪?具体内容是什么?给出代码证据。答:进程0的task_struct是操作系统设计者事先写好的,位于内核数据区,存储在user_stack中。因为在进程0boot阶段的user_stack)staticuniontask_unioninit_task={INIT_TASK};具体内容如下:包含了进程00的0的TSSldt设置了代码段和堆栈段的基址和限长(640KB)TSS则保存了各种寄存器的值,包括各个段选择符。代码如下:INIT_TASK的定义见P68。15.进程0创建进程11建立了自己的task_struct表,分别位于物理内存16MB的顶端倒数第一页、第二页。请问,这个了页究竟占用的是谁的线性地址空间,内核、进程0、进程1、还是没有占用任何线性地址空间(直接从物理地址分配)?说明理由并给出代码证据。答:占用的是内核的线性地址空间。先理解清楚,稍后补充)16.假设:经过一段时间的运行,操作系统中已经有5个进程在运行,且内核分别为进程4、进程5分别创建了第一个页表,这两个页表在谁的线性地址空间?用图表示这两个页表在线性地址空间和物理地址空间的映射关系。答:在内核的线性地址空间。图片自己画,参考如下图)17.进程0开始创建进程,调用了fork代码执行了两次,第一次,跳过()直接执行了for(;;),第二次执行fork代码后,执行了goto语句,也没有看到循环语句,是什么原因导致反复执行?请说明理由,并给出代码证据。0创建进程1ssespeflags,eip的值压入了内核栈,其中eip的值指向了int0x80的下一条指令。在执行fork时,通过0x80号系统调用,内核执行copy_process函数,为进程1准备task_struct1的线性地址空间及物理页面,其中设置了进程1的TSS中eax的值为0的寄存器值设置进程1的ss,esp,eflags,cs,eip。copy_process:p>pid=last_pid;…p>tss.eip=eip;p>tss.eflags=eflags;p>tss.eax=0;…p>tss.esp=esp;…p>tss.cs=cs&0xffff;p>tss.ss=ss&0xffff;…p>state=TASK_RUNNING;returnlast_pid;函数copy_process的返回值是last_pid,即进程1的pid(pid不为0fork返回到进程0后,进程0判断返回值非0,因此执行代码for(;;)pause();在sys_pause函数中,内核设置了进程0的状态为,并11进程1在TSS中设置了eip等寄存器的值,因此从int0x80的下一条指令开始执行,且设定返回eax的值作为fork的返回值(值为01执行了init的函数。导致反复执行,主要是利用了两个系统调用sys_fork和sys_pause对进程状态的设置,以及利用了进程调度机制。18.copy_process函数的参数最后五项是:longeip,longcs,longeflags,longesp,longss。查看栈结构确实有这五个参数,奇怪的是其他参数的压栈代码都能找得答:在中,当执行“int$0x80”时产生一个软中断,该中断使CPU硬件自动将SSESPEFLAGSCSEIP这5个寄存器的数值按照这个顺序压入进程0的内核栈。利用硬件进行压栈,可以确保eip的值指向正确的指令,以使在中断返回后,程序能够继续执行。19.为什么staticinline_syscall0(type,name)中需要加上关键字inline?答:inline一般是用于定义内联函数,内联函数结合了函数以及宏的优点,在定代码会被直接嵌入在它被调用的地方,这样省去了函数调用时的一些额外开销,比如保存和恢复函数返回地址等,可以加快速度。20.根据代码详细说明copy_process函数的所有参数是如何形成的?函数参数可以由函数定义以外的程序通过压栈的方式“做”出来。copy_processP83页、P85页、P86页。21.根据代码详细分析,进程0如何根据调度第一次切换到进程1的。答:通过进程0创建进程1,并将其状态设为,fork()函数执行完毕后返回,进入for(;;)pause();在sys_pause()中,将当前进程进程的状态设置为然后执行schedule()task[]TASK_RUNNING的进程进程,然后切换到进程1执行,即switch_to(1)。代码见P10622.内核的线性地址空间是如何分页的?画出从0x000000开始的7目录表、页表所在页)的挂接关系图,就是页目录表的前四个页目录项、第一个个页表的前7个页表项指向什么位置?给出代码证据。45页空间内容全部清零(每页4项,使之分别指向44第4地址方向填写4个页面,依次指向内存从高地址向低地址方向的各个页面。图见P39(注意要画出7个页,参考如下)代码见P39最下面23.用文字和图说明中断描述符表是如何初始化的,可以举例说明(比如:set_trap_gate(0,÷_error)答:以set_trap_gate(0,÷_error)为例,其中,n是0,gate_addr是&idt[0],也就是idt的第一项中断描述符的地址;type是15,dpl(描述符特权级)是0;addr是中断服务程序divide_error(void)的入口地址。见P54图29P53代码24.进程0fork进程1之前,为什么先要调用move_to_user_mode()?用的是什么方法?解释其中的道理。答:因为在0.11中,除进程0之外,所有进程都是由一个已有进程在用户0move_to_user_mode()0为在0.11现从3到030从0特权级到3特权级转换时采用的是模仿中断返回。设计者首先手工写压栈代码模拟intiret指令时,CPU自动将这5个寄存器的值()按序恢复给CPU,CPU就会翻转到3特权级去执行代码。25.进程0创建进程1时调用copy_process函数,在其中直接、间接调用了两次get_free_page函数,在物理内存中获得了两个页,分别用作什么?是怎么设置的?给出代码证据。答:第一次调用get_free_page函数申请的空闲页面用于进程1的task_struct及00的task_struct1esp01的堆栈的起始地址。代码见P90及P92。第二次调用get_free_page函数申请的空闲页面用于进程1的页表。在创建进程1执行copy_process中,执行时,内核为进程1拷贝了进程0的页表(160P98。26.在32中,有大约20多个指令是只能在0特权级下使用,其他的指令,比如cli,并没有这个约定。奇怪的是,在Linux0.11中,在3特权级的进程代码并不能使用cli据。答:cli指令用于复位IF标志位,其执行与当前特权级和EFLAGS[IOPL]标志位有关。只有当CPL小于或等于IOPL时才可以执行该指令。如果在CPL大于IOPL的情况下执行,将会产生一个一般性保护异常,如下:set_trap_gate(13,&general_protection);由于在内核IOPL的初始值为00在move_to_user_mode中,继承了内核的eflags,如下:move_to_user_mode()…"pushfl\n\t"\…"iret\n"\在进程0的TSSeflags中的IOPL位为0P68如果没有改动的话也是0,即。因此,通过设置,可以限制3特权级的进程代码使用cli指令。27.根据代码详细分析操作系统是如何获得一个空闲页的。答:代码见P90get_free_page函数。过程:(1)将EAX设置为0,EDI设置指向mem_map的最后一项(mem_map+PAGING_PAGES1std设置扫描是从高地址向低地址。从mem_map如果找到,则将找到的页设引用数为1;(2)ECX左移12位得到页的相对地址,加LOW_MEM得到物理地址,将此页最后一个字节的地址赋值给(LOW_MEM+4092(3)stosl将EAX的值设置到ES:EDI所指内存,即反向清零1024*32bit,将此页清空;(4)将页的地址(存放在)返回。28.用户进程自己设计一套LDT表,并与GDT挂接,是否可行,为什么?答:不可行。GDT和LDT放在内核数据区,属于0特权级,3特权级的用户进程无权访问修改。此外,如果用户进程可以自己设计LDT的话,表明用户进程可以访问其他进程的,则会削弱进程之间的保护边界,容易引发问题。29.保护模式下,线性地址到物理地址的转化过程是什么?转化过程如图所示(见P97图39)Linux0.11中仅有一个页目录表,其地址存放在CR3寄存器中,通过线性地址中的“页目录项”数据及CR3寄存器就可以应的物理页面,最后通过线性地址中的“页内偏移”落实到实际的物理地址值。30.为什么get_free_page()将新分配的页面清0?答:Linux在回收页面时并没有将页面清0,只是将mem_map中与该页对应的位置0。在使用get_free_page申请页时,也是遍历mem_map寻找对应位为0的页,但是该页可能存在垃圾数据,如果不清0的话,若将该页用做页表,则可能导致错误的映射,引发错误,所以要将新分配的页面清0。31.内核和普通用户进程并不在一个线性地址空间内,为什么仍然能够访问普通用户进程的页面?16M物理内存,所以内核可以访问普通用户进程的页面。32.详细分析一个进程从创建、加载程序、执行、退出的全过程。答:可以参考课本P273页,其中的核心部分课上都进行了介绍,包括、copy_process()、do_execve()及do_exit等。参考:首先,shell调用forkint0x80sys_fork(),调用find_empty_process(),为str1申请可用的pid和task[64]空闲位置,接着调用copy_process()为str1申请用来承载进程task_struct和内核栈的一个页面,shell把自己的task_struct复制给str1进程,然后修改str1的task_struct的部分数据,包括时间片,TSS字段等。接着调用copy_mem()为进程分段(确定段基址和段copy_page_tables为str1进程另起一套页目录项和页表项,并指向shell的页面。还要解决文件继承的问题,然后将str1进程TSS和LDT挂接在GDT的指定位置,完成这些后,将str1设为就绪态。接下来加载用户程free_page_tables解除与shell,调整str1的task_struct,最后调整EIP和ESP。用户程序被调度执行,产生缺页do_no_page为str1mem_map中,将str1址空间内。执行加载到的程序,产生压栈动作,若栈空间不够,则产生缺页中断继续申请页面。最后,用户进程调用exit退出,释放程序所占页面,解除与文件有关的内容,并调用tell_fathershell进程收到用户进程发送的信号设置为就绪态,待其执行时,释放掉用户进程task_struct所占用的页面,解除与task[64]的关系,这时用户进程彻底退出。33.详细分析多个进程(无父子关系)共享一个可执行程序的完整过程。答:依次创建3个用户进程,每个进程都有自己的task。假设进程1先执行,需1的线性地址空间。这时产生时钟中断,轮到进程2执行,进程2也执行同样逻辑的程序。之后,又轮到进程3执行,也是压栈,并设置text。可见,三个进程虽程序相同,但数据独立,用TSS和LDT实现对进程的保护。34.缺页中断是如何产生的,页写保护中断是如何产生的,操作系统是如何处理的?答:缺页中断:每个页目录项和页表项都有个标志位P,如果和一个页面建立了P位置1,否则置0MMU在解析线性地址时,若发现某个表项的P位为零,说明没有对应页面,就会产生缺页中断。操作系统会调用_do_no_page页表页面的三级映射管理关系。时若某一进程执行写操作,就会产生“页写保护”异常。操作系统会调用_do_wp_page,为该进程申请空闲页面,将该进程的页表
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版酒店管理公司租赁合同模板6篇
- 2025年房地产股权并购及合作开发框架协议3篇
- 2024年院校与企业实习生培训协议3篇
- 2025年度数据中心PPP项目建设管理服务合同
- 2025年度人工智能语音识别系统开发技术服务合同2篇
- 2024年股权投资与回购协议
- 2024年舞蹈教室使用权转让协议3篇
- 2024标准企业员工劳动合同样本3
- 2025版智能健康管理平台服务合同书3篇
- 2024年物业经营权转让合同
- 2024年中国大数据企业排行榜V9.0(大数据产业白皮书)-中国民营科技促进会
- 2025年统编版高考政治一轮复习:选择性必修1、2、3共3册必背考点知识点汇编
- 货物交接单和交接合同
- 七年级语文下册专项练习知识(对联)
- MOOC 知识图谱导论-浙江大学 中国大学慕课答案
- 2016-2017学年天津市部分区九年级(上)期末化学试卷
- 培智五年级上次数学期末考试题
- 配电房施工组织设计方案(土建部分)
- 国家开放大学电大专科《英语教学法》2023-2024期末试题及答案(试卷代号:2145)
- 管桩水平承载力计算
- 事业单位领导班子考核测评表
评论
0/150
提交评论