LINUX复习

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第一章概述1.6什么是POSIX标准,为什么现代操作系统的设计必须遵循POSIX标准?POSIX表示可移植操作系统接口是UNIX标准化过程中的产物,POSIX1003.1标准定义了一个最小的Unix操作系统接口,任何操作系统只要符合POSIX1003.1这一标准,就可以运行UNIX程序。1.9linux操作系统有哪几部分组成?linux内核出于什么位置?1)Linux系统由四个部分组成:用户进程,系统调用接口、Linux内核子系统和硬件;2)Linux内核处于用户进程和硬件之间,包括系统调用接口和Linux内核子系统。Linux内核由哪几部分组成?各个子系统的主要功能是什么?1)Linux内核除系统调用外,由五个主要的子系统组成:进程调度、内存管理、虚拟文件系统、网络和进程间通信(IPC);2)各个子系统的主要功能为:A.进程调度:它控制着进程对CPU的访问,当需要选择一个进程开始运行时,由调度程序选择最应该运行的进程;B.内存管理:它允许多个进程安全地共享主内存区域,支持虚拟内存;从逻辑上可以分为硬件无关的部分和硬件相关的部分;C.虚拟文件系统(VFS):它隐藏了各种不同硬件的具体细节,为所有设备提供统一的接口,支持多达数十种不同的文件系统,分为逻辑文件系统和设备驱动程序;D.网络:它提供了对各种网络标准协议的存取和各种网络硬件的支持,分为网络协议和网络驱动程序两部分;E.进程间通信:支持进程间各种通信机制,包括共享内存、消息队列和管道等。第二章内存寻址1、在80x86的寄存器中,哪些寄存器供一般用户使用?哪些寄存器只能被操作系统使用?答:通用寄存器EAX,EBX,ECX,EDX,EBP(基址指针),ESP(堆栈指针),ESI(扩展源指针),EDI(扩展目的指针),还有EFLAGS(标志寄存器).专供操作系统使用的寄存器:IDTR中断描述符寄存器,GDTR全局描述符表寄存器,LDTR局部描述符表寄存器,TaskRegisters任务寄存器,DebugRegister调试寄存器,ControlRegister控制寄存器,Model-SpecificRegisters模型专用寄存器。4、Linux是如何利用段机制又巧妙的绕过段机制的?在内核代码中如何表示各种段,查找最新源代码并进行阅读和分析。答:IA32规定段机制是不可禁止的,因此不可能绕过它直接给出线性地址空间的地址。万般无奈之下,Linux的设计人员干脆让段的基地址为0,而段的界限为4GB,这时任意给出一个偏移量,则等式为“0+偏移量=线性地址”,也就是说“偏移量=线性地址”。另外由于段机制规定“偏移量4GB”,所以偏移量的范围为0H~FFFFFFFFH,这恰好是线性地址空间范围,也就是说虚拟地址直接映射到了线性地址,我们以后所提到的虚拟地址和线性地址指的也就是同一地址。看来,Linux在没有回避段机制的情况下巧妙地把段机制给绕过去了。另外,由于IA32段机制还规定,必须为代码段和数据段创建不同的段,所以Linux必须为代码段和数据段分别创建一个基地址为0,段界限为4GB的段描述符。不仅如此,由于Linux内核运行在特权级0,而用户程序运行在特权级别3,根据IA32的段保护机制规定,特权级3的程序是无法访问特权级为0的段的,所以Linux必须为内核和用户程序分别创建其代码段和数据段。这就意味着Linux必须创建4个段描述符——特权级0的代码段和数据段,特权级3的代码段和数据段。2.12为什么在设计两级页表的线性结构时,给页目录和页表分别分配10位,如果不是这样举例说明会产生什么后果?所谓两级页表就是对页表再进行分页。页目录共有1K个表项,于是线性地址的最高10位(即22~31位)用来产生第一级的索引。两级表结构的第二级称为页表,每个页表也刚好存放在一个4KB的页中,并且每一个页表包含1K的表项,第二级页表由线性地址中间的10位(即21~12位)进行索引,最低12位表示页内偏量。14深入理解图2,12,并结合图叙述线性地址到物理地址的转换。第一步,用32位线性地址的最高10位第31~22位作为页目录项的索引,将它乘以4,与CR3中页目录的起始地址相加,获得相应目录项在内存的地址;第二步,从这个地址开始读取32位页目录项,取出其高20位,再给低12位补0,形成的32位就是页表在内存的起始地址;第三步,用32位线性地址中的第21~12位作为页表中页表项的索引,将它乘以4,与页表的起始地址相加,获得相应页表项在内存的地址;第四,从这个地址开始读取32位页表项,取出其高20位,再将线性地址的第11~0位放在低12位,最终形成32位页面物理地址。第三章15.什么是进程控制块,它包含哪些基本信息1)Linux中把对进程的描述结构叫做task_struct,将这样的数据结构称作进程控制块(PCB);系统为了管理进程设置的一个专门的数据结构,用它来记录进程的外部特征,描述进程的运动变化过程。系统利用PCB来控制和管理进程,所以PCB是系统感知进程存在的唯一标志。进程与PCB是一一对应的。2)PCB是一个其域多达80多项的相当庞大的数据结构,按其功能将所有域划分为:状态信息,链接信息、各种标识符、进程间通信信息、时间和定时器信息、调度信息、文件系统信息、虚拟内存信息和处理器环境信息3.4linux内核状态有哪些,请画出状态转换图,查看最新源代码,确认有哪些状态。1)Linux最基本的进程状态有三种:运行态、就绪态和阻塞态(或等待态);2)为了管理上的方便,就绪态(TASK_RUNNING);睡眠(或等待)态:浅度睡眠态(TASK_INTERRUPTIBLE),深度睡眠态(TASK_UNINTERRUPTIBLE);暂停状态(TASK_STOPPED);僵死状态(TASK_ZOMBIE)3.6linux的进程控制块如何存放?为什么?假设ESP中存放的是栈顶指针,请用三句汇编语句描述如何获得current的PC的地址。答:当进程一进入内核态,CPU就自动设置进程的内核栈。这个栈位于内核的数据段上,为了节省空间,Linux把内核栈和一个紧挨近的PCB的小数据结构,thread_info放在一起,占用8kb的内存区。因为这样可以节省空间,内核很容易从ESP寄存器的值获得,当前在CPU上正在运行的thread_info结构的地址。movl$0xfffe000,%eaxandl%esp,%ecxmovl%ecx,p3.7PCB的组织方式有哪几种?为什么要采取这些组织方式?答:有进程链表、哈希表、就绪队列、等待队列四种组织方式,采取这些组织方式是为了能更有效的管理系统中大量的进程。7、什么是写时复制技术,这种技术在什么情况下最能发挥其优势?答:父进程和子进程共享页面而不是复制页面。然而,只要页面被共享,它们就不能被修改。无论父进程和子进程何时试图写一个共享的页面,就产生一个错误,这时内核就把这个页复制到一个新的页面中并标记为可写。原来的页面仍然是写保护的:当其它进程试图写入时,内核检查写进程是否是这个页面的唯一属主;如果是,它把这个页面标记为对这个进程是可写的。采用这种技术,显然只有预测到将要修改的页才会被复制,而且必须被复制,不然的话,就会破坏父进程的程序执行。9、init内核线程与init进程是一回事吗?它们有什么本质的区别?答:(1)init()函数是内核代码的一部分,在内核态运行,是独立的可执行代码的一部分。(2)init进程在Linux操作系统中是一个具有特殊意义的进程,它是由内核启动并运行的第一个用户进程,因此它不是运行在内核态,而是运行在用户态。它的代码不是内核本身的一部分,而是存放在硬盘上可执行文件的映象中,和其他用户进程没有什么两样。第四章4.3内核空间存放什么内容?如何把其中一个虚拟地址转换成物理地址?答:内核空间存放的是内核代码和数据。给定一个虚拟地址x,其物理地址为x-PAGE_OFFSET(一般为3GB,表示虚拟地址和物理地址之间的位移量)4.4什么是内核映像?它存放在物理空间和内核空间的什么地方?答:内核空间由所有进程共享,其中存放的是内核代码和数据,即“内核映象”Linux内核映像被装入在物理地址0x00100000开始的地方内核映像在内核空间的起始地址就为0xC0100000。4-5.用户空间划分为哪几部分?用户程序调用malloc()分配的内存属于哪一部分?分为堆栈段、BSS(未初始化的数据段)、数据段和代码段。从数据段的顶部到堆栈段地址的下沿这个区间是一个巨大的空洞,这就是进程在运行时调用malloc()可以动态分配的空间,也叫动态内存或堆。4-11.什么是虚存映射?有哪几种类型?Linux并不将映像装入到物理内存,相反,可执行文件只是被连接到进程的用户空间中。随着进程的运行,被引用的程序部分会由操作系统装入到物理内存,这种将映像链接到进程用户空间的方法被称为“虚存映射”,也就是把文件从磁盘映射到进程的用户空间,这样把对文件的访问转化为对虚存区的访问。有两种类型的虚存映射:(1)共享的:有几个进程共享这一映射,也就是说,如果一个进程对共享的虚存区进行写,其它进程都能感觉到,而且会修改磁盘上对应的文件。(2)私有的:进程创建的这种映射只是为了读文件,而不是写文件,因此,对虚存区的写操作不会修改磁盘上的文件,由此可以看出,私有映射的效率要比共享映射的高。除了这两种映射外,如果映射与文件无关,就叫匿名映射。7、Linux是如何实现“请求调页”的?答:1)如果被访问的页不在内存,也就是说,这个页还没有被存放在任何一个物理页面中,那么,内核分配一个新的页面并将其适当地初始化,这种技术称为“请求调页”;2)“请求调页”是一种动态内存分配技术,它将页面的分配推迟到不能再推迟为止,也就是说,一直推迟到进程要访问的页不在物理内存时为止,由此引起一个缺页异常;该技术的引入主要是因为进程开始运行时并不访问其地址空间中的全部地址。8、试叙述伙伴算法的工作原理,并说明为什么伙伴算法可以消除外碎片?答:假设要求分配的块其大小为128个页面。该算法先在块大小为128个页面的链表中查找,看是否有这样一个空闲块。如果有,就直接分配;如果没有,该算法会查找下一个更大的块,具体地说,就是在块大小为256个页面的链表中查找一个空闲块。如果存在这样的空闲块,内核就把这256个页面分为两等份,一份分配出去,另一份插入到块大小为128个页面的链表中。如果在块大小为256个页面的链表中也没有找到空闲页块,就继续找更大的块,即512个页面的块。如果存在这样的块,内核就从512个页面的块中分出128个页面满足请求,然后从384个页面中取出256个页面插入到块大小为256个页面的链表中。然后把剩余的128个页面插入到块大小为128个页面的链表中。如果512个页面的链表中还没有空闲块,该算法就放弃分配,并发出出错信号。9、vmalloc()和kmalloc()有何区别?编写内核模块程序,调用这两个函数以观察二者所分配空间位于不同的区域。答:在内核空间中调用kmalloc()分配连续物理空间,而调用vmalloc()分配非物理连续空间。我们把kmalloc()所分配内核空间中的地址称为内核逻辑地址把vmalloc()分配的内核空间中的地址称为内核虚拟地址vmalloc()在分配过程中须更新内核页表10、分析守护进程kswapd的运行时机,你认为怎样换出页面比较合理?答:为了避免在CPU忙碌的时候,也就是在缺页异常发生时,临时搜索可供换出的内存页面并加以换出,Linux内核定期地检查系统内的空闲页面数是否小于预定义的极限,一旦发现空闲页面数太少,就预先将若干页面换出,以减轻缺页异常发生时系统所承受的负担。当然,由于无法确切地预测页面的使用,即使这样做了也还可能出现缺页异常发生时内存依然没有足够的空闲页面。但是,预换出毕竟能减少空闲页面不够用的概率。并且通过选择适当的参数(如每隔多久换出一次,每次换出多少页),可以使临时寻找要换出页面的情况很少发生。为此,Linux内核设置了一个定期将页面换出的守护进程kswap

1 / 16
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功