发信人: nba23 (WOLF TOTEM), 信区: Linux
标  题: 《Linux内核完全注释》部分习题解答
发信站: BBS 科苑星空站 (Wed Mar 30 13:26:16 2005), 站内

作者给的一些解答:

第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.1

2.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中设置的),于是就会去执行内核中的代码。内核的代码段描述符在GDT中第1项(从零计),因此cs被设成=8。注意,在用户态没有权限修改描述符。

第6章 块设备驱动程序
1.块设备的主设备号是什么?硬盘hd1设备的次设备号是什么?

2.在内核中调用ll_wr_block()时会触发对块设备的读写操作。在一次读盘操作中,请问在哪个程序的哪个函数中进行了首次块读写操作?

第7章 字符设备驱动程序
1.字符设备的主设备号是什么?控制台(console)的次设备号是什么?

第8章 数学协处理器仿真处理
无。

第9章 文件系统
1.在buffer.c程序getblk()函数中215、216两行,既然已经是对空闲缓冲队列操作,为什么还要判断缓冲区是否被引用?
因为空闲列表中也包含已被使用的缓冲块,参见图9.12所示.。

2.kernel中许多lock函数都使用了cli,sti. 不知是为什么? 是担心中断程序会捣乱么? 假设有一个进程在内核空间获得了super锁,然后在bread()中等待,这时另一个进程也试图获得super锁,于是关了中断。这是否会导致内核死锁?
系统可以在处理普通的系统调用时唤醒睡眠的进程,或者在执行中断时唤醒。如果一个进程执行了cli指令,禁止了可屏蔽中断,但当任务切换时,每个进程都会保存各自的所有运行寄存器状态(在TSS中),包括标志寄存器。如果所有进程都由于等待资源而执行了cli,那么起码还有一个task0可以响应中断。因此这种情况不会造成内核死锁。
由于中断可以唤醒一个处于不可中断睡眠状态的进程,因此需要使用cli-sti来检测调用时睡眠的进程,并处理睡眠队列。使用cli-sti就不会出现竞争条件。

3.main.c中init函数的183行,execve是如何处理当前进程映象的?184行上以2作为返回值出于什么考虑?
简单地讲,execve()首先为被执行程序建立环境和堆栈,然后用被执行的程序将自己的控制替换掉(利用堆栈返回地址的替换方式)。所以如果执行成功,就不应该返回到184行,所以返回2(文件或目录不存在)。

第10章 内存管理
1.在memory.c程序的第114行上,size为什么要加上0x3fffff?
加上0x3fffff可以在size不足4M时仍需要分配1个页表项。同理,对于超过4M而不足8M时分配2个。也即注释中所说的进位整数值。
举个简单的例子。如果说4000算1项,那么10也要分1项:(10+3999) mod 4000 = 1
4001则要分2项:(4001+3999) mod 4000 = 2
12001要分4项:(12008+3999) mod 4000 = 4

2.请简要说明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行setup((void *) &drive_info)是如何通过static inline _syscall1(int,setup,void *,BIOS)跳到hd.c中的sys_setup的?

3.在include/asm/system.h的第22行开始的一段代码中,书上写到"movw %%dx,%%ax\n\t",偏移地址低字与段选择符组合成描述符低4字节(eax),这一句按80386汇编应该是仅将dx->ax,怎么会与段选择符组合呢?
因为开始执行这个函数时,eax = 0x00080000, 也即 eax的高字含有0x0008,是段选择符。

4.在include/signal.h中第45、46行,定义了两个具有具体数值的信号处理句柄指针,它们的用途是什么?
参见kernel/signal.c中第94行。它们的值用来判断程序的句柄是否是默认句柄。由于类型需要与sa_handler变量匹配,所以需要这样来定义。

转自:http://blog.chinaunix.net/uid-26565142-id-3188375.html

《Linux内核完全注释》部分习题解答相关推荐

  1. linux内核参数注释与优化

    目录 1.linux内核参数注释 2.两种修改内核参数方法 3.内核优化参数生产配置 参数解释由网络上收集整理,常用优化参数对比了网上多个实际应用进行表格化整理,使查看更直观. 学习linux也有不少 ...

  2. linux内核注释目录,linux内核完全注释目录

    linux内核完全注释目录 1 linux内核体系: 代码存储结构以及总makefile 2 BOOT程序:把内核从block设备加载到内存并对系统参数进行配置,因此包括磁盘引导汇编程序,获取BIOS ...

  3. LINUX内核完全注释

    学习教材:LINUX内核完全注释,内核版本0.11,修正版V3.0 赵炯编著 参考教材:UNIX操作系统设计--M. J. Bach, programming the 80x86  --John H. ...

  4. linux内核完全注释百度网盘,LINUX内核完全注释中.pdf

    LINUX内核完全注释中 6.8 floppy.c 程序 122 } 123 printk ("\010\010\010\010\010done \n"); 124 ROOT_DE ...

  5. Linux内核 题目,《Linux内核完全注释》部分习题答案

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 ===================== 第3章 内核引导和启动过程 2.为什么不直接将system模块搬到0x00000处而是先搬到0x10000处, ...

  6. 《Linux内核完全注释》《完全剖析》 » 阅读本书所需的基础知识 -- 再次强调。

    转贴网址:http://www.oldlinux.org/oldlinux/viewthread.php?tid=2551&extra=page%3D1 [这个贴子最后由redgrid在 20 ...

  7. 阅读赵炯的《Linux内核完全注释》之前必须知道的!

    转载自 点击打开链接 Linux 0.11虽然不是什么"珠穆朗玛峰",但它肯定还是"华山"或"泰山".虽然有路但你还是需要最基本的努力和花费 ...

  8. 【读书笔记】Linux内核完全注释第二章:微型计算机组成结构

    非常主观的笔记,只是摘抄一下自己觉得比较重要的地方,并不会概述所有内容(概括能力太差是这样的) 2.微型计算机组成结构 2.1 微型计算机组成原理 除了 CPU 以外,现代 PC 机主板主要使用 2 ...

  9. Linux内核完全注释 阅读笔记:2.4、控制器和控制卡

    By: Ailson Jack Date: 2018.09.04 个人博客:  http://www.only2fire.com/ 本文在我博客的地址是:http://www.only2fire.co ...

最新文章

  1. web.config配置
  2. Apache Thrift使用简介
  3. java配置文件中的plugin,启用ContextReplacementPlugin以忽略webpack中的配置和测试设置文件...
  4. 设置为true有什么区别_海绵与珍珠棉有什么区别?天南包装小编为您分析
  5. 程序开发天团必备单品,稳定输出还加持千元商务礼限时送!
  6. mysql dump 导出表_误删库,别跑路!教你一招MySQL 数据恢复
  7. mysql-installer-web-community和mysql-installer-communityl两个版本的区别
  8. 2021-06-21结构伪类选择器
  9. SOEM建立主站程序
  10. MindManager历史版本下载地址
  11. 数据仓库建模指南视频教程|数据仓库视频教程
  12. [历年IT笔试题]2014微软校园招聘笔试试题
  13. 苹果工具条_苹果iOS 13.4 Beta 1来袭:网友直接吐槽0创新
  14. 魔性的数字人形时钟动态pc端电脑屏幕保护
  15. python语言的特点-Python语言的特点有哪些?
  16. openGL增强表面细节----高度贴图
  17. 打死都不要进外包,看看我在阿里外包的2年…
  18. 如何通过数据分析选品(以新零售为例)
  19. .NET WPF教程(6)——布局介绍与Canvas(①)
  20. JavaScript压缩代码解压缩还原具体办法

热门文章

  1. 杰奇reader.php源码,杰奇CMS reader.php开源代码
  2. 浏览器趋势2016年4月:三星的浪潮
  3. 微型计算机控制系统,微型计算机控制系统
  4. Cow Pinball
  5. 晚上呼吸困难怎么了?
  6. 汇编语言-中括号-mov指令-cmp指令-lea指令
  7. c# 结构体定义中有数组
  8. 如何看待为了进 Google、微软等外企大量刷题?
  9. ZX内存遍历工具1.0
  10. oim-server-web打包测试环境不起作用问题 vue+typeScript