操作系统高级教程 思考题

发布 2021-04-24 08:57:28 阅读 7151

1.进程0创建进程1时,为进程1建立了自己的task_struct、内核栈,第一个页表,分别位于物理内存16mb的顶端倒数第一页、第二页。请问,这个了页究竟占用的是谁的线性地址空间,内核、进程0、进程1、还是没有占用任何线性地址空间?

说明理由并给出**证据。

答:两次都是通过调用get_free_page()在物理内存里申请一个物理页,由于在中决定内核的物理地址和线性地址是一一对应的。因此这两个页都在内核的线性地址空间内。

setup_paging:

movl $1024*5,%ecx5 pages - pg_dir+4 page tables */

xorl %eax,%eax

xorl %edi,%edipg_dir is at 0x000 */

cld;rep;stosl

movl $pg0+7,_pg_dirset present bit/user r/w */

movl $pg1+7,_pg_dir+4

movl $pg2+7,_pg_dir+8

movl $pg3+7,_pg_dir+12

movl $pg3+4092,%edi

movl $0xfff007,%eax16mb - 4096 + 7 (r/w user,p) *

std1: stoslfill pages backwards - more efficient :-

subl $0x1000,%eax

jge 1b

2.假设:经过一段时间的运行,操作系统中已经有5个进程在运行,且内核分别为进程4、进程5分别创建了第一个页表,这两个页表在谁的线性地址空间?

用图表示这两个页表**性地址空间和物理地址空间的映射关系。

答:大师兄!!

3.进程0开始创建进程1,调用了fork(),跟踪**时我们发现,fork**执行了两次,第一次,跳过init()直接执行了for(;;pause(),第二次执行fork**后,执行了init()。奇怪的是,我们在**中并没有看见向后的goto语句,也没有看到循环语句,是什么原因导致反复执行?

请说明理由,并给出**证据。

答:大师兄!!

函数的参数最后五项是:long eip,longcs,longeflags,longesp,longss。查看栈结构确实有这五个参数,奇怪的是其他参数的压栈**都能找得到,确找不到这五个参数的压栈**,反汇编**中也查不到,请解释原因。

答:在执行int n这条中断指令时(在此即为int 0x80),系统会自动把ssesprflagscseip这五个寄存器的值压入栈中。

5.用图表示下面的几种情况,并从**中找到证据:

a、当进程获得第一个缓冲块的时候,hash表的状态。

b、经过一段时间的运行,已经2000多个buffer_head挂到hash_table上时,hash表(包括所有的buffer_head)的整体状态。

c、经过一段时间的运行,有的缓冲块已经没有进程使用了(空闲),这样的空闲缓冲块是否会从hash_table上脱钩?

d、经过一段时间的运行,所有的buffer_head都挂到hash_table上了,这时,又有进程申请空闲缓冲块,将会发生什么?解释原因并找到**证据。

答:见书上p100-p01.

执行完之后,虚拟盘已经成为可用的块设备,并成为根设备。在向虚拟盘中copy任何数据之前,虚拟盘中是否有引导块、超级块、i节点位图、逻辑块位图、i节点、逻辑块?请解释其中的道理,并给出**证据。

答:在rd_load()执行之前,虚拟盘经初始化后中存放的全是0。

rd_init()中的**段:--p46

cp = rd_start;

for (i=0; i< length; i++)

*cp++ 0';

且拷贝数据也是从虚拟盘开始处进行存放的。

rd_load()中的**:--p121

cp = rd_start;

while (nblocks)

(void) memcpy(cp, bh->b_data, block_size);

7.在虚拟盘被设置为根设备之前,操作系统的根设备是软盘(包括软驱),请说明设置软盘为根设备的技术路线,并给出**证据。

提示:注意的249行,508这个数值。

.org 508

root_dev:

.word root_dev

答:在程序的开始处有一条语句对root_dev进行赋值。之后执行如下**,确定所使用的根设备:

segcsmov ax,root_dev

cmp ax,#

jne root_defined

segcsmov bx,sectors

mov ax,#0x0208dev/ps0 - 1.2mb

cmp bx,#

je root_defined

mov ax,#0x021cdev/ps0 - 1.44mb

cmp bx,#

je root_defined

undef_root:

jmpundef_root

root_defined:

segcsmov root_dev,ax

#1、首先会判断根设备是否已经设置,如果设置(如root_dev=0x306)则直接跳过。否则执行判定。#2、通过每磁道的扇区数判别是1.

2mb还是1.44mb的软盘,判定完成后跳到末尾处。通过**调试,发现该段**执行完之后,存在地址0x901fc处的root_dev的值为0x021c,即为1.

44mb的软盘。#3、在main函数开始时,执行===root_dev = orig_root_dev;==把存放于0x901fc处的值赋给root_dev。++#define orig_root_dev (*unsigned short *)0x901fc)

是怎么将根设备从软盘更换为虚拟盘,并加载了根文件系统?用文字、图示表示,并给出**证据。

答:大师兄!!

9.内核的线性地址空间是如何分页的?画出从0x000000开始的7个页(包括页目录表、页表所在页)的挂接关系图,就是页目录表的前四个页目录项、第一个个页表的前7个页表项指向什么位置?

给出**证据。答:中:

setup_paging:

movl $1024*5,%ecx5 pages - pg_dir+4 page tables */

xorl %eax,%eax

xorl %edi,%edipg_dir is at 0x000 */

cld;rep;stosl

movl $pg0+7,pg_dirset present bit/user r/w */

movl $pg1+7,pg_dir+4

movl $pg2+7,pg_dir+8

movl $pg3+7,pg_dir+12

pg_dir用于表示内核分页机制完成后的内核起始位置,也就是物理内存的起始位置0x000000,以上四句完成页目录表的前四项与页表1,2,3,4的挂接。

movl $pg3+4092,%edi

movl $0xfff007,%eax16mb - 4096 + 7 (r/w user,p) *

std1: stoslfill pages backwards - more efficient :-

subl $0x1000,%eax

jge 1b

完成页表项与页面的挂接,是从高地址向低地址方向完成挂接的,16m内存全部完成挂接。

10.用文字和图说明中断描述符表是如何初始化的,可以举例说明(比如:set_trap_gate(0,÷_error)),并给出**证据。

答:对中断描述符表的初始化,就是将异常处理一类的中断服务程序与中断描述符表进行挂接。以set_trap_gate(0,÷_error)为例,0表示该中断函数的地址挂接在中断描述符表的第0项位置处,而&devide_error就是该异常处理函数的地址。

对set_trap_gate(0,÷_error)进行宏展开后得到。

#define set_trap_gate(0,&devide_error)\

_set_gate(&idt[0],15,0,&devide_error)

之后执行如下**:

#define _set_gate(&idt[0],15,0,&devide_error)(gate_addr,type,dpl,addr) \

_asm__ movw %%dx,%%ax\t" \

"movw %0,%%dx\t" \

"movl %%eax,%1\t" \

"movl %%edx,%2" \

: "i" (short) (0x8000+(0<<13)+(15<<8)))

"o" (char *)idt[0]))

"o" (4+(char *)idt[0]))

"d" (char *)devide_error)),a" (0x00080000))

0=0x8f00,%1指向idt[0]的起始地址,%2指向四个字节之后的地址处。

#1、将地址&devide_error放在eax的低两个字节,eax的高两字节不变。#2、把0x8f00放入edx的低两字节,高两字节保持不变。#3、把eax放在%1所指的地址处,占四字节。

#4、将edx放在%2所指的地址处,占四字节。

大师兄!!11.为什么计算机启动最开始的时候执行的是bios**而不是操作系统自身的**?

答:因为在计算机上电启动的时候,内存里没有任何**,需要借助于bios**进行加载引导扇区以及系统**,在进行一系列的配置(如加载中断向量表和中断服务程序等)后才能够执行操作系统自身的**。

操作系统高级教程

1.为什么开始启动计算机的时候,执行的是bios 而不是操作系统自身的 计算机启动的时候,内存未初始化,cpu不能直接从外设运行操作系统,所以必须将操作系统加载至内存中,而这个工作最开始的部分,bios需要完成一些检测工作,和设置实模式下的中断向量表和服务程序,并将操作系统的引导扇区加载值0x7c0...

高级生化思考题

高级生化 思考题。1 写出下列涉及细胞信号转导的酶促反应方程式 精氨酸 pip2 atp gtp 2 细胞信息物质按化学性质的分类并分别举例。3 dna rna 蛋白质主要存在部位,它们各种结构的类型及特点。4 简述受体增敏 脱敏 上调 下调的概念及其结构特点。5 解释化学修饰 变构调节的概念,与变...

高级操作系统

分布式系统概念 一个分布式系统是若干个独立的计算机的集合,但是对该系统的用户来说,感觉该系统就像一台计算机一样。分布式操作系统 是对分布式系统提供资源管理的软件系统。通常表现为中间件形式。一 分布式系统的关键目标。分布式系统的4个关键目标 1 必须是资源共享的。要让用户方便地访问资源,并且以一种受控...