《linux内核完全注释部分习题解答 .docx》由会员分享,可在线阅读,更多相关《linux内核完全注释部分习题解答 .docx(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精品名师归纳总结第 3 章 内核引导和启动过程2. 为什么不直接将 system 模块搬到 0x00000 处而是先搬到 0x10000 处,再搬到 0x00000 处了? 在机器开机上电时, ROM BIOS 将 bootsect 代码加载到内存的固定位置 0x7c00 处, bootsect 又把自己移动到了 0x90000 处,同时把 setup.s 代码和 system 模块分别加载到 0x90200 和0x10000 处。对于本书所争辩的Linux 内核, system 模块的大小不超过512KB。由于在即将执行的 setup 代码中仍需要使用BIOS的功能,因此如直接将system
2、 模块加载到 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 需要是
3、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开机时 0x00000x0400 处及之后的一些参
4、数不是也被掩盖了吗?内核以后是怎么设置的?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,
5、假设从今时开头, 系统没有接收到任何中断(包括系统的定时时钟中断或外部硬件中断以及软件的系统调用产生的中断),那么系统中将永久只包含着这两个进程, 但是实际中, 时钟中断周期的检查有没有新任务就绪,或者硬件中断包括系统调用使系统调度执行来检查系统的新任务,假如有新任务就绪,执行新任务。 系统的其它部分,都是为这些任务的执行供应服务。系统中各进程的执行基本上是由于进程请求等待想要的资源而自动情愿的舍弃CPU 去睡眠,另一种就是时钟中断把用完时间片的进程对CPU 的使用权剥夺,不情愿的舍弃CPU。可编辑资料 - - - 欢迎下载精品名师归纳总结请详细写出来。第 5 章 进程调度与系统调用1. 请问
6、硬盘中断怎么产生的?系统调用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。
7、这条语句不就是等价与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、符表中描述符的段选择符值都已经被设置成=8(内核代码,在 head.s 中设置的),于是就会去执行内核中的代码。内核的代码段描述符在 GDT中第 1 项(从零计) ,因此 cs 被设成 =8。留意,在用户态没有权限修改描述符。第 6 章 块设备驱动程序1. 块设备的主设备号是什么?硬盘hd1 设备的次设备号是什么?2. 在内核中调用ll_wr_block 时会触发对块设备的读写操作。在一次读盘操作中,请问在哪个程序的哪个函数中进行了首次块读写操作?第 7 章 字符设备驱动程序1.字符设备的主设备号是什么?把握台(console)的次设备号是什么?第 8 章 数学协处理器仿真处理无。第 9 章
9、文件系统1. 在 buffer.c 程序 getblk 函数中 215、216 两行,既然已经是对闲暇缓冲队列操作,为什么可编辑资料 - - - 欢迎下载精品名师归纳总结由于闲暇列表中也包含已被使用的缓冲块,参见图9.12 所示 .。2. kernel 中许多 lock 函数都使用了 cli,sti. 不知是为什么 . 是担忧中断程序会捣乱么. 假设有一个进程在内核空间获得了super 锁,然后在 bread 中等待,这时另一个进程也试图获得super 锁,于是关了中断。这是否会导致内核死锁.系统可以在处理一般的系统调用时唤醒睡眠的进程,或者在执行中断时唤醒。 假如一个进程执行了 cli 指令
10、,禁止了可屏蔽中断,但当任务切换时,每个进程都会储存各自的全部运行寄存器状态(在 TSS中),包括标志寄存器。假如全部进程都由于等待资源而执行了cli,那么起码仍有一个 task0 可以响应中断。因此这种情形不会造成内核死锁。由于中断可以唤醒一个处于不行中断睡眠状态的进程,因此需要使用cli-sti 来检测调用时睡眠的进程,并处理睡眠队列。使用cli-sti 就不会显现竞争条件。3. main.c 中 init 函数的 183 行, execve 是如何处理当前进程映象的?184 行上以 2 作为返回值出于什么考虑?简洁的讲, execve第一为被执行程序建立环境和堆栈,然后用被执行的程序将自
11、己的把握替换掉(利用堆栈返回的址的替换方式)。所以假如执行成功,就不应当返回到184 行,所以返回 2(文件或目录不存在) 。第 10 章 内存治理1. 在 memory.c 程序的第 114 行上, size 为什么要加上 0x3fffff ?加上 0x3fffff 可以在 size 不足 4M 时仍需要支配1 个页表项。同理,对于超过4M 而不足 8M时支配 2 个。也即注释中所说的进位整数值。举个简洁的例子。假如说4000 算 1 项,那么 10 也要分 1 项: 10+3999 mod 4000 = 14001 就要分 2 项: 4001+3999 mod 4000 = 212001
12、要分 4 项: 12021+3999 mod 4000 = 42. 请简要说明 Intel 处理器的内存分页治理机制。3. 写时复制( Copy on write )机制的工作原理是什么?为什么要这样做?第 11 章 包含文件1. 从 Linux 内核 0.95 版开头, 为了与当时的GNU 的执行文件头文件一样,Linus 对 a.out.h 文件进行了修改,造成使用0.95 版内核编译的执行程序与以前版本不兼容(不能在0.1x 版的内核系统上运行) 。请比较本书争辩的a.out.h 文件与 linux 内核 0.95 版的 a.out.h 文件的主要区分。2. 第4章中172行setupv
13、oid * &drive_info是如何通过static inline _syscall1int,setup,void *,BIOS跳到 hd.c 中的 sys_setup 的?3. 在 include/asm/system.h的第 22 行开头的一段代码中,书上写到movw %dx,%axnt , 偏移的址低字与段选择符组合成描述符低4 字节 eax,这一句按80386 汇编应当是仅将dx-ax,怎么会与段选择符组合了?可编辑资料 - - - 欢迎下载精品名师归纳总结4. 在 include/signal.h 中第 45、46 行,定义了两个具有详细数值的信号处理句柄指针,它们的用途是什么?参见 kernel/signal.c 中第 94 行。它们的值用来判定程序的句柄是否是默认句柄。由于类型需要与 sa_handler 变量匹配,所以需要这样来定义。可编辑资料 - - - 欢迎下载