Linux复习总结汇总

  • 格式:doc
  • 大小:136.50 KB
  • 文档页数:9

下载文档原格式

  / 9
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux复习总结汇总

第一章概述

3、Linux系统由哪些部分组成?Linux内核

处于什么位置?

答:(1)符合POSIX标准的操作系统内核、

Shell和外围工具。(2)C语言编译器和其他

开发工具及函数库。(3)X Window

窗口系统。(4)各种应用软件,包括字处理软

件、图象处理软件等。

Linux内核是所有Linux 发布版本的核

心。

第二章内存寻址

2、在保护模式下,MMU如何把一个虚地

址转换为物理地址?

答:

分段机制把一个虚拟地址转换为线性地址;接着,分页机制把一个线性地址转换为物理地址。

5.为什么在设计两级页表的线性地址结构时,给页目录和页表各分配10位?如果不是这样,举例说明会产生什么样的结果?

答:所谓两级页表就是对页表再进行分页。第一级称为页目录,其中存放的是关于页表的信息。4MB的页表再次分页(4MB/4K)可以分为1K个页,同样对每个页的描述需要4个字节,于是可以算出页目录最多占用4KB个字节,正好是一个页,其示意图如2.9所示。页目录共有1K个表项,于是,线性地址的最高10位(即22位~ 31位)用来产生第一级的索引。两级表结构的第二级称为页表,每个页表也刚好存放在一个4K字节的页中,包含1K 个字节的表项。第二级页表由线性地址的中间10位(即21位~ 12位)进行索引,最低12位表示页内偏量。

举例:如果页目录占用31~24位,页表项占用23~12位,偏移地址占11~0位,则有2^8个页表项,一个页面有2^12(4k)个表项,每个表项大小为4字节,2^12的范围为4页面,而不是以一个页面为准。

6、深入理解图2.12,并结合图叙述线性地址到物理地址的转换。

答:第一步,用32位线性地址的最高10位第31~22位作为页目录项的索引,将它乘以4,与CR3中的页目录的起始地址相加,获得相应目录项在内存的地址。

第二步,从这个地址开始读取32位页目录项,取出其高20位,再给低12位补0,形成的32位就是页表在内存的起始地址。

第三步,用32位线性地址中的第21~12位作为页表中页表项的索引,将它乘以4,与页表的起始地址相加,获得相应页表项在内存的地址。

第四步,从这个地址开始读取32位页表项,取出其高20位,再将线性地址的第11~0位放在低12位,形成最终32位页面物理地址。

第三章进程

1、什么是进程控制块?它包含哪些基本信息?

答:对进程进行全面描述的数据结构,Linux中把对进程的描述结构叫做task_struct:

struct task_struct {

}传统上这样的数据结构被叫做进程控制块PCB(process control blaock)

系统为了管理进程设置的一个专门的数据结构,用它来记录进程的外部特征,描述进程的运动变化过程。系统利用PCB来控制和管理进程,所以PCB是系统感知进程存在的唯一标志。进程与PCB是一一对应的。

包含的基本信息:

(1)状态信息-描述进程动态的变化。(2)链接信息-描述进程的父/子关系。(3)各种标识符-用简单数字对进程进行标识。(4)进程间通信信息-描述多个进程在同一任务上协作工作。

(5)时间和定时器信息-描述进程在生存周期内使用CPU时间的统计、计费等信息。(6)调度信息-描述进程优先级、调度策略等信息。(7)文件系统信息-对进程使用文件情况进行记录。(8)虚拟内存信息-描述每个进程拥有的地址空间。(9)处理器环境信息-描述进程的执行环境(处理器的寄存器及堆栈等)

2、Linux内核的状态有哪些?请画出状态转换图,查看最新源代码,以确认有哪些状态。答:就绪态(TASK_RUNNING);睡眠(或等待)态:浅度睡眠态(TASK_INTERRUPTIBLE),深度睡眠态(TASK_UNINTERRUPTIBLE);暂停状态(TASK_STOPPED);僵死状态(TASK_ZOMBIE)

3、Linux的进程控制块如何存放?为什么?假设ESP中存放的是栈顶指针,请用三句汇编语句描述如何获得current的PCB的地址。

答:当进程一进入内核态,CPU就自动设置进程的内核栈。这个栈位于内核的数据段上,为了节省空间,Linux把内核栈和一个紧挨近的PCB的小数据结构,thread_info放在一起,占用8kb的内存区。因为这样可以节省空间,内核很容易从ESP寄存器的值获得,当前在CPU上正在运行的thread_info结构的地址。

movl $0xfffe000, %eax

andl %esp, %ecx

movl %ecx, p

4、PCB的组织方式有哪几种?为什么要采取这些组织方式?

答:(1)进程链表(2)哈希表(3)就绪队列(4)等待队列

在一个系统中,通常可以拥有数十个、数百个乃至数千个进程,相应的就有这么多PCB。为了能有效的对它们加以管理,应该用适当的方式将这些PCB组织起来。

5、请编写内核模块,打印系统中各进程的名字以及PID,同时统计系统中进程的个数。答:

static int print_pid(void)

{ struct task_struct *task,*p;

struct list_head *pos;

int count = 0;

printk("Hello World enter begin:\n");

task = &init_task;

list_for_each(pos,struct

task_struct,tasks);

{ count++;

printk("%d->%s\n",p->pid,p->comm);

}

printk("the number of process

is:%d\n",count);

return 0;

}

7、什么是写时复制技术,这种技术在什么情况下最能发挥其优势?

答:父进程和子进程共享页面而不是复制页面。然而,只要页面被共享,它们就不能被修改。无论父进程和子进程何时试图写一个共享的页面,就产生一个错误,这时内核就把这个页复制到一个新的页面中并标记为可写。原来的页面仍然是写保护的:当其它进程试图写入时,内核检查写进程是否是这个页面的唯一属主;如果是,它把这个页面标记为对这个进程是可写的。采用这种技术,显然只有预测到将要修改的页才会被复制,而且必须被复制,不然的话,就会破坏父进程的程序执行。

9、init内核线程与init进程是一回事吗?它们有什么本质的区别?

答:(1)init()函数是内核代码的一部分,在内核态运行,是独立的可执行代码的一部分。

(2)init进程在Linux操作系统中是一个具有特殊意义的进程,它是由内核启动并运行的第一个用户进程,因此它不是运行在内核态,而是运行在用户态。它的代码不是内核本身的一部分,而是存放在硬盘上可执行文件的映象中,和其他用户进程没有什么两样。

10、用fork写一个简单的测试程序,从父进程和子进程中打印信息。信息应该包括父进程和子进程的PID。执行程序若干次,看两个信息是否以同样的次序打印。