Linux复习总结汇总
- 格式:doc
- 大小:136.50 KB
- 文档页数:9
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。执行程序若干次,看两个信息是否以同样的次序打印。