1.进程0创建进程1时,为进程1建立了自己的task_struct、内核栈,第一个页表,分别位于物理内存16MB的顶端倒数第一页、第二页。请问,这个了页究竟占用的是谁的线性地址空间,内核、进程0、进程1、还是没有占用任何线性地址空间?说明理由并给出代码证据。
2.假设:经过一段时间的运行,操作系统中已经有5个进程在运行,且内核分别为进程4、进程5分别创建了第一个页表,这两个页表在谁的线性地址空间?用图表示这两个页表在线性地址空间和物理地址空间的映射关系。
3.进程0开始创建进程1,调用了fork(),跟踪代码时我们发现,fork代码执行了两次,第一次,跳过init()直接执行了for(;;) pause(),第二次执行fork代码后,执行了init()。奇怪的是,我们在代码中并没有看见向后的goto语句,也没有看到循环语句,是什么原因导致反复执行?请说明理由,并给出代码证据。
4.copy_process函数的参数最后五项是:long eip,long cs,long eflags,long esp,long ss。查看栈结构确实有这五个参数,奇怪的是其他参数的压栈代码都能找得到,确找不到这五个参数的压栈代码,反汇编代码中也查不到,请解释原因。
5.用图表示下面的几种情况,并从代码中找到证据:
a、当进程获得第一个缓冲块的时候,hash表的状态。
b、经过一段时间的运行,已经2000多个buffer_head挂到hash_table上时,hash表(包括所 有的buffer_head)的整体状态。
c、经过一段时间的运行,有的缓冲块已经没有进程使用了(空闲),这样的空闲缓冲块是 否会从hash_table上脱钩?
d、经过一段时间的运行,所有的buffer_head都挂到hash_table上了,这时,又有进程申请 空闲缓冲块,将会发生什么?解释原因并找到代码证据。
6.rd_load()执行完之后,虚拟盘已经成为可用的块设备,并成为根设备。在向虚拟盘中copy任何数据之前,虚拟盘中是否有引导块、超级块、i节点位图、逻辑块位图、i节点、逻辑块?请解释其中的道理,并给出代码证据。
7.在虚拟盘被设置为根设备之前,操作系统的根设备是软盘(包括软驱),请说明设置软盘为根设备的技术路线,并给出代码证据。
(提示:注意bootsect.s的249行,508这个数值。
.org 508
root_dev:
.word ROOT_DEV
)
8.Linux0.11是怎么将根设备从软盘更换为虚拟盘,并加载了根文件系统?用文字、图示表示,并给出代码证据。
9.内核的线性地址空间是如何分页的?画出从0x000000开始的7个页(包括页目录表、页表所在页)的挂接关系图,就是页目录表的前四个页目录项、第一个个页表的前7个页表项指向什么位置?给出代码证据。
10.用文字和图说明中断描述符表是如何初始化的,可以举例说明(比如:set_trap_gate(0,÷_error)),并给出代码证据。
11.为什么计算机启动最开始的时候执行的是BIOS代码而不是操作系统自身的代码?
本内容试读结束,登录后可阅读更多
下载后可阅读完整内容,剩余3页未读,立即下载