linux内核完全注释部分习题解答.docxVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
作者给的一些解答:第3章?内核引导和启动过程2.为什么不直接将system模块搬到0x00000处而是先搬到0x10000处,再搬到0x00000处呢?在机器开机上电时,ROM?BIOS将bootsect代码加载到内存的固定位置0x7c00处,bootsect又把自己移动到了0x90000处,同时把setup.s代码和system模块分别加载到0x90200和0x10000处。对于本书所讨论的Linux内核,system模块的大小不超过512KB。由于在即将执行的setup代码中还需要使用BIOS的功能,因此若直接将system模块加载到0x00000处就会覆盖掉BIOS设置的中断向量区域(0x0000-0x0400)。3.setup.s和head.s中都设置了一次GDT和IDT,这是为何,可否只在head.s做一次设置?第一次设置是为了head.s能首次运行在32位保护模式下。GDT临时在setup.s中,也即0x902xx左右的地方,这个地方将被用于缓冲区。而内核是在靠近物理内存0x0处的,因此必须重新设置。4.不用as86,用gas来编译bootsect可以么?为什么Linus当时要使用as86汇编器?可以。bootsect需要是16位的实模式程序。目前gas汇编器也支持16位的编译。Linus当时是在MINIX系统上开发Linux的,最初MINIX系统上还没有移植gas程序,因此Linus就使用了MINIX系统上的as86。5.根据setup.s和head.s程序中的使用方法,请详细说明Intel?32位保护模式的运行机制。它与实模式下的寻址方式有和主要区别?第4章?系统初始化1.在setup.s代码执行完之后,head.s及system被移到了0x00000~0x800000处,那么PC开机时0x0000~0x0400处及之后的一些参数不是也被覆盖了吗?内核以后是怎么设置的?Linux在这之后就完全不用PC自己的中断程序,而纯粹自己作中断程序了。在head.s中的78行(setup_idt)开始,首先在232行的_idt处设置了256个亚中断向量,指向一个只显示Unknown?interrupt的中断处理程序。然后会在init的main()中各个硬件的初始化函数中一个一个地分别设置所用到的实际中断向量。2.请简述Linux内核的整个初始化过程。系统初始化时,sched_init()?程序启动了系统的空闲任务0,同时派生了任务1,此时,系统中有两个进程(task?0?and?task?1),假设从此时开始,系统没有接收到任何中断(包括系统的定时时钟中断或外部硬件中断以及软件的系统调用产生的中断),那么系统中将永远只包含着这两个进程,但是实际中,时钟中断周期的检查有没有新任务就绪,或者硬件中断包括系统调用使系统调度执行来检查系统的新任务,如果有新任务就绪,执行新任务。系统的其它部分,都是为这些任务的执行提供服务。系统中各进程的执行基本上是由于进程请求等待想要的资源而自动情愿地放弃CPU去睡眠,另一种就是时钟中断把用完时间片的进程对CPU的使用权剥夺,不情愿地放弃CPU。3.详细说明_syscall0(int,fork)嵌入函数的使用方法。在程序中调用该函数的实际语句是怎样的?请具体写出来。第5章?进程调度与系统调用1.请问硬盘中断怎么产生的?系统调用read、write等都是产生请求,并将请求插入请求队列,在中断时由中断处理函数遍历请求队列完程读写,那么请问最初的硬盘的中断是由谁、如何激发的呢?参见6.6.1功能描述和图6.12.copy_process的参数有17个,从右往左分别是:ss,esp,eflags,cs,eip,ds,es,fs,edx,ecs,ebx,none,gs,esi,edi,ebp,nr。请问其中的那个none对应的是堆栈中的什么内容?简单说明原因。3.在do_signal()函数中的104行语句是:*(eip)?=?sa_hangler;这条语句不就是等价与eip?=?sa_handler;吗?Linus为什么会这样表达?这里主要是牵涉到变量类型匹配的问题。因为这两个变量的类型不一样。4.在head.s中执行?lss?_stack_start,%esp,此时ss是什么内容?(提示:参考sched.c,第69行)。ss=0x10,也即内核段选择符。参见sched.c,69行。此时ss=ds。5.在中断程序里,段描述符寄存器的值被改掉了,那请问是在什么时候改的呢?比如说原来用户态时,使用的是LDT,代码段是cs=f,当发生中断时,CPU根据中断IDT表中相应的描述符设置CS:EIP,此时所有中断描述符表中描述符的段选择符值都已经被设置成=8(内核代码,在head.s中设置的),于是就会去执行内核中的

文档评论(0)

185****7617 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档