还剩29页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
第一章概述
1.什么是POSIX标准,为什么现代造作系统的设计必须遵循POSIX标准?答POSIX表示可移植操作系统接口Portable OperatingSystemInterfacePOSIX是在Unix标准化过程中出现的产物POSIX
1003.1标准定义了一个最小的Unix操作系统接口任何操作系统只有符合这一标准,才有可能运行Unix程序
2.什么是GNU Linux及GNU有什么关系?答GNU是GNU IsNot Unix的递归缩写,是自由软件基金会的一个项目GNU项目产品包括emacs编辑器、著名的GNU C和Gcc编译器等,这些软件叫做GNU软件GNU软件和派生工作均适用GNU通用公共许可证,即GPL GeneralPublicLicenseLinux的开发使用了众多的GUN工具
3.Linux系统由哪些部分组成?Linux内核处于什么位置?答1符合POSIX标准的操作系统内核、Shen和外围工具2C语言编译器和其他开发工具及函数库3X Window窗口系统4各种应用软件,包括字处理软件、图象处理软件等Linux内核是所有Linux发布版本的核心适当的方式将这些PCB组织起来
5.请编写内核模块,打印系统中各进程的名字以及PID,同时统计系统中进程的个数答static intprint_pidvoid{struct task_struct*task,*p;struct list_head*pos;int count=0;printkC^Hello Worldenter begin:\nz/;task=init_task;list_for_eachpos,struct task_struct,tasks;{count++;printk〃%d-〉%s\n〃,p-pid,p-comm;printk〃the numberof processis:%d\n〃,count;return0;
7、什么是写时复制技术,这种技术在什么情况下最能发挥其优势?答父进程和子进程共享页面而不是复制页面然而,只要页面被共享,它们就不能被修改无论父进程和子进程何时试图写一个共享的页面,就产生一个错误,这时内核就把这个页复制到一个新的页面中并标记为可写原来的页面仍然是写保护的当其它进程试图写入时,内核检查写进程是否是这个页面的唯一属主;如果是,它把这个页面标记为对这个进程是可写的采用这种技术,显然只有预测到将要修改的页才会被复制,而且必须被复制,不然的话,就会破坏父进程的程序执行
9、init内核线程及init进程是一回事吗?它们有什么本质的区别?答1init函数是内核代码的一部分,在内核态运行,是独立的可执行代码的一部分2init进程在Linux操作系统中是一个具有特殊意义的进程,它是由内核启动并运行的第一个用户进程,因此它不是运行在内核态,而是运行在用户态它的代码不是内核本身的一部分,而是存放在硬盘上可执行文件的映象中,和其他用户进程没有什么两样
10、用fork写一个简单的测试程序,从父进程和子进程中打印信息信息应该包括父进程和子进程的PIDo执行程序若干次,看两个信息是否以同样的次序打印答#includeunistd.hint mainvoidpidtpid;pid=fork;if pid0printferror;return0;else ifpid==0printf z/this ischile processwith pidof%d\n〃,getpid;elseprintfthis isparent processwith pidof%d\n〃,pid;return0;第四章内存管理
2.什么是内核映像?它存放在物理空间和内核空间的什么地方?答内核空间由所有进程共享,其中存放的是内核代码和数据,即“内核映象Linux内核映像被装入在物理地址0x00100000开始的地方,内核映像在内核空间的起始地址就为OxCOlOOOOO
3.用户空间划分为哪几部分?用户程序调用mallocO分配的内存属于那一部分?答分为堆栈段、BSS未初始化的数据段、数据段和代码段从数据段的顶部到堆栈段地址的下沿这个区间是一个巨大的空洞,这就是进程在运行时调用mail可以动态分配的空间,也叫动态内存或堆
4.什么是虚存映射?有哪几种类型?答随着进程的运行,被引用的程序部分会由操作系统装入到物理内存,这种将映像链接到进程用户空间的方法被称为“虚存映射”,也就是把文件从磁盘映射到进程的用户空间,这样把对文件的访问转化为对虚存区的访问有两种类型的虚存映射1共享的有几个进程共享这一映射,也就是说,如果一个进程对共享的虚存区进行写,其它进程都能感觉到,而且会修改磁盘上对应的文件2私有的进程创建的这种映射只是为了读文件,而不是写文件,因此,对虚存区的写操作不会修改磁盘上的文件,由此可以看出,私有映射的效率要比共享映射的高除了这两种映射外,如果映射及文件无关,就叫匿名映射
5.一个进程一般包含哪些虚存区?举例说明
6、说明mmap系统调用的功能?利用mmap写一个拷贝文件的程序答mmap系统调用时通过调用do_mmap内核函数来实现建立文件到显存的映射int i,fdl,fd2;char*buf1,buf2;fdl=open〃data〃,0KDOMCY;if fdlfd2fstar fd;star buf1=0if Iseekfdstatbuf,st_size-l,seek_set0perrorz/lseektarget;exit-1;if MAP_FAILED=bufperrorZ/Lmap source;exit-1;ifmapFAFCE==buf2perror Cmmaptarget;exit-1;mempy buf2,buf1,size-fstartbuf,st size;
7、Linux是如何实现“请求调页”的?答1如果被访问的页不在内存,也就是说,这个页还没有被存放在任何一个物理页面中,那么,内核分配一个新的页面并将其适当地初始化,这种技术称为“请求调页”;2“请求调页”是一种动态内存分配技术,它将页面的分配推迟到不能再推迟为止,也就是说,一直推迟到进程要访问的页不在物理内存时为止,由此引起一个缺页异常;该技术的引入主要是因为进程开始运行时并不访问其地址空间中的全部地址
8、试叙述伙伴算法的工作原理,并说明为什么伙伴算法可以消除外碎片答假设要求分配的块其大小为128个页面该算法先在块大小为128个页面的链表中查找,看是否有这样一个空闲块如果有,就直接分配;如果没有,该算法会查找下一个更大的块,具体地说,就是在块大小为256个页面的链表中查找一个空闲块如果存在这样的空闲块,内核就把这256个页面分为两等份,一份分配出去,另一份插入到块大小为128个页面的链表中如果在块大小为256个页面的链表中也没有找到空闲页块,就继续找更大的块,即512个页面的块如果存在这样的块,内核就从512个页面的块中分出128个页面满足请求,然后从384个页面中取出256个页面插入到块大小为256个页面的链表中然后把剩余的128个页面插入到块大小为128个页面的链表中如果512个页面的链表中还没有空闲块,该算法就放弃分配,并发出出错信号
9、vmallocO和kmalloc有何区别?编写内核模块程序,调用这两个函数以观察二者所分配空间位于不同的区域答在内核空间中调用kmallocO分配连续物理空间,而调用vmallocO分配非物理连续空间我们把kmallocO所分配内核空间中的地址称为内核逻辑地址,把vmallocO分配的内核空间中的地址称为内核虚拟地址vmalloc在分配过程中须更新内核页表#includeLinux/module.h#includeLinux/init.h#includeLinux/slala.h#includeLinux/min.h#includeLinux/vmalloc.h unsigned char*kmalloc men;unsigned char*vmalloc men;MODULL_LICENSEZ/GPL/Z;static int init initmmshowvoidpagemem=_get_free_pageGFP_KERNEL;if Ikmallocmengotofai12;printk KERN_INFOz/vmallocmen=Ox%p\nz/,vmallocmen;return0;failBfail1:Kfreekmallocmen;fail2:free_pagepagemon;fail3:return-1;static void_exit c1eanup_mmshowvoidVfreevmallocmen;Kfreekmallocmen;free_pagepagemen;module_initimit_mmshow;module_exitcleanup_mmshow;
10、分析守护进程kswapd的运行时机,你认为怎样换出页面比较合理?答为了避免在CPU忙碌的时候,也就是在缺页异常发生时,临时搜索可供换出的内存页面并加以换出,Linux内核定期地检查系统内的空闲页面数是否小于预定义的极限,一旦发现空闲页面数太少,就预先将若干页面换出,以减轻缺页异常发生时系统所承受的负担当然,由于无法确切地预测页面的使用,即使这样做了也还可能出现缺页异常发生时内存依然没有足够的空闲页面但是,预换出毕竟能减少空闲页面不够用的概率并且通过选择适当的参数(如每隔多久换出一次,每次换出多少页),可以使临时寻找要换出页面的情况很少发生为此,Linux内核设置了一个定期将页面换出的守护进程kswapd第五章中断和异常
1.什么是中断向量?Linux是如何分配中断向量的?答每个中断源都被分配一个8位无符号整数作为类型码,即中断向量Linux对256个向量的分配如下
(1)从031的向量对应于异常和非〜屏蔽中断
(2)从3247的向量(即由I/O设备引起的中断)分配给〜屏蔽中断
(3)剩余的从48255的向量用来标识软中断Linux只用〜了其中的一个(即128或0x80向量)用来实现系统调用
3.如何对中断描述符表进行初始化?答Linux内核在系统的初始化阶段要初始化可编程控制器8259A;将中断描述符表的起始地址装入IDTR寄存器,并初始化表中的每一项;当计算机运行在实模式时,中断描述符表被初始化,并由BIOS使用;真正进入了Linux内核,中断描述符表就被移到内存的另一个区域,并为进入保护模式进行预初始化
4.在中断描述符表中如何插入一个中断门、陷阱门和系统门?答IDT表项的设置通过_set_gaet函数实现调用该函数在IDT表中插入一个中断门:set_intr_gate unsigned int n,void*addr;调用该函数在IDT表中插入一个陷阱门set_trap_gateunsigned intn,void*addr;调用该函数在IDT表中插入一个系统门set systemgateunsigned intn,void*addr
5.CPU为什么要进行有效性检查?如何检查?CPU是如何跳到中断或异常处理程序的?答有效性检查避免用户应用程序访问特殊的陷阱门或中断门当从用户态堆栈切换到内核态堆栈时,先把用户态堆栈的值压入中断程序的内核态堆栈中,同时把EFLAGS寄存器自动压栈,然后把被中断进程的返回地址压入堆栈如果异常产生了一个硬错误码,则将它也保存在堆栈中如果特权级没有发生变化,则压入栈中的内容如图
5.4中此时,CS:EIP的值就是IDT表中第i项门描述符的段选择符和偏移量的值,于是,CPU就跳转到了中断或异常处理程序分两步进行有效性检查首先是“段”级检查,将CPU的当前特权级CPL存放在CS寄存器的最低两位及IDT中第i项段选择符中的DPL相比较,如果DPL3大于CPL0,就产生一个“通用保护”异常,因为中断处理程序的特权级不能低于引起中断的进程的特权级这种情况发生的可能性不大,因为中断处理程序一般运行在内核态,其特权级为0然后是“门”级检查,把CPL及IDT中第i个门的DPL相比较,如果CPL大于DPL,也就是当前特权级3小于这个门的特权级0,CPU就不能“穿过”这个门,于是产生一个“通用保护”异常,这是为了避免用户应用程序访问特殊的陷阱门或中断门但是请注意,这种“门”级检查是针对一般的用户程序,而不包括外部I/O产生的中断或因CPU内部异常而产生的异常,也就是说,如果产生了中断
6.中断处理程序和中断服务程序有何区别Linux如何描述或异常,就免去了“门”级检查一条共享的中断线答中断服务程序ISR及中断处理程序是两个不同的概念在Linux中,15条中断线对应15个中断处理程序具体来说,中断处理程序相当于某个中断向量的总处理程序,例如IRQ0x05_interrupt是中断号为5向量为37的总处理程序,如果这个5号中断由网卡和图形卡共享,则网卡和图形卡分别有其相应的中断服务程序typedef irqreturn_t*irq_handler_t int,void*;struct irqaction{irq_handler_t handler;unsigned longflags;cpumask_t mask;第二章内存寻址
1.在80x86的寄存器中,哪些寄存器供一般用户使用?哪些寄存器只能被操作系统使用?答通用寄存器EAX,EBX,ECX,EDX,EBP(基址指针),ESP(堆栈指针),ESI(扩展源指针),EDI(扩展目的指针),还有EFLAGS(标志寄存器).专供操作系统使用的寄存器IDTR中断描述符寄存器,GDTR全局描述符表寄存器,LDTR局部描述符表寄存器,TaskRegisters任务寄存器,DebugRegister调试寄存器,ControlRegister控制寄存器,Model-SpecificRegisters模型专用寄存器
3.请用C语言描述段描述符表答ttinclude stdio.httinclude stdlib.h^define BASE_H OxffOOttdefine BASE_M OxOOff[defineBASE_L Oxffff^define LIMIT_H OxOOOf^define LIMIT_L OxffffttdefineGRANULARITY0x0080ttdefine SEGMENT_P0x8000□define SYSTEM_TYPE0x1000ttdefine DPL0x6000const char*name;void*dev_id;struct irqaction*next;int irq;
8、为什么把中断分为两部分来处理?答中断服务例程一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化但是,中断是一个随机事件,它随时会到来,如果关中断的时间太长,CPU就不能及时响应其他的中断请求,从而造成中断的丢失因此,内核的目标就是尽可能快的处理完中断请求,尽其所能把更多的处理向后推迟例如,假设一个数据块已经达到了网线,当中断控制器接受到这个中断请求信号时,Linux内核只是简单地标志数据到来了,然后让处理器恢复到它以前运行的状态,其余的处理稍后再进行(如把数据移入一个缓冲区,接受数据的进程就可以在缓冲区找到数据)因此,内核把中断处理分为两部分前半部分(top half)和后半部分(bottom half),前半部分内核立即执行,而后半部分留着稍后处理
9、实时时钟和操作系统时钟有何不同?答大部分PC机中有两个时钟源,分别是实时时钟(RTC)和操作系统(OS)时钟实时时钟也叫硬件时钟,它靠电池供电,即使系统断电,也可以维持日期和时间RTC是OS时钟的时间基准,操作系统通过读取RTC来初始化OS时钟,此后二者保持同步运行,共同维持着系统时间所谓同步,是指操作系统在运行过程中,每隔一个固定时间会刷新或校正RTC中的信息
10、jiffies表示什么?什么时候对其增加?答jiffies是Linux内核中的一个全局变量,用它来表示系统自启动以来的时钟节拍总数启动时,内核将该变量初始化为0,此后,每次时钟中断处理程序都会增加该变量的值
11.时钟中断的下半部分主要做什么?答run」ock_timers函数去处理所有到期的定时器,定时器作为软中断在下半部分中执行Scheduler_tick函数负责减少当前运行进程的时间片计数值并且在需要时设置need_resched标志当update_process_timer函数返回后,do_timer函数接着会调用update_times函数更新墙上时钟第六章系统调用
1.系统调用及库函数、系统命令及内核函数有什么区别和联系?答应用编程接口API其实是一个函数定义,比如常见的readmallocfree、abs函数等,这些函数说明了如何获得一个给定的服务;而系统调用是通过软中断向内核发出一个明确的请求从编程者的观点看,API和系统调用之间没有什么差别,二者关注的都是函数名、参数类型及返回代码的含义然而,从设计者的观点看,这是有差别的,因为系统调用的实现是在内核完成的,而用户态的函数是在函数库中实现的系统命令相对应用编程接口更高一层,每个系统命令都是一个可执行程序,比如常用的系统命令Is、hostname等,这些命令的实现调用了系统调用内核函数及普通函数形式上没有什么区别,只不过前者在内核实现,因此要满足一些内核编程的要求系统调用是用户进程进入内核的接口层,它本身并非内核函数,但它是由内核函数实现的,进入内核后,不同的系统调用会找到各自对应的内核函数
2、内核为什么要设置系统调用处理程序,它及服务例程有什么区别?答用户空间的程序无法直接执行内核代码,内核驻留在受保护的地址空间上,不允许用户进程内核地址空间上读写当用户态的进程调用一个系统调用时,CPU切换到内核态并开始执行一个内核函数系统调用处理程序执行下列操作在内核栈保存大多数寄存器的内容;调用所谓系统调用服务例程的相应的c函数来处理系统调用;通过ret_from_sys_call函数从系统调用返回;不同的系统调用会找到各自对应的内核函数,这些内核函数被称为系统调用的“服务例程二
3.说明系统调用号的作用答因为内核实现了很多不同的系统调用,因此进程必须传递一个叫做系统调用号的参数来识别所需的系统调用;第七章内核中的同步
1.什么事临界区?什么是竞争状态?什么是同步?答临界区critical regions就是访问和操作共享数据的代码段,这段代码必须被原子地执行竞争状态是多个内核任务同时访问同一临界区避免并发和防止竞争状态称为同步synchronization
2.内核中造成并发执行的原因是什么?答1中断一一中断几乎可以在任何时刻异步发生,也可能随时打断正在执行的代码2内核抢占一一若内核具有抢占性,内核中的任务就可能会被另一任务抢占3睡眠及及用户空间的同步一一在内核执行的进程可能会睡眠,这将唤醒调度程序,导致调度一个新的用户进程执行4对称多处理一一两个或多个处理器可以同时执行代码
3、给出信号量的定义,并说明down和up的含义答信号量是在1968年由EdsgerWybeDijKstra提出的,此后它逐渐成为一种常用的锁机制信号量支持两个原子操作P和V,这两个名字来自荷兰语Proberen和Vershogen前者做测试操作字面意思是探查,后者叫做增加操作后来的系统把这两种操作分别叫做downup,Linux也遵从这种叫法down操作通过对信号量计数减1来请求获得一个信号量如果结果是0或大于0,信号量锁被获得,任务就可以进入临界区了如果结果是负数,任务会被放入等待队列,处理器执行其它任务down函数如同一个动词“降低down,一次down操作就等于获取该信号量相反,当临界区中的操作完成后,up操作用来释放信号量,该操作也被称作是“提升upping”信号量,因为它会增加信号量的计数值如果在该信号量上的等待队列不为空,处于队列中等待的任务在被唤醒的同时会获得该信号量
4、申明一个信号量,并给出如何使用它答定义struct semaphore{atomic_t count;int sleepers;wait_queue_head_t wait;使用static DECLARE_MUTEXmr_sem;/*声明并初始化互斥信号量*/if!down_interruptiblemr_sem/*信号被接收,信号量还未获取*//*临界区…*/up mr_sem;
5.自旋锁和信号量各优先使用自旋锁用在什么情况下?低开销加锁短期锁定优先使用自旋锁长期加锁优先使用信号量中断上下文中加锁使用自旋锁持有锁时需要睡眠、调使用信号量度第八章文件系统
1.什么是软链接和硬链接?二者有何区别?答软链接符号链接symbolic link是一种特殊的文件,这种文件包含了另一个文件的任意一个路径名这个路径名指向位于任意一个文件系统的任意文件,甚至可以指向一个不存在的文件硬链接hard link让一个文件对应一个或多个文件名,或者说把我们使用的文件名和文件系统使用的节点号链接起来,这些文件名可以在同一目录或不同目录
2.什么是虚拟文件系统?什么是虚拟文件系统界面?答为了支持其他各种不同的文件系统,Linux提供了一种统一的框架,就是所谓的虚拟文件系统转换Virtual Switch,简称虚拟文件系统VFS虚拟文件系统所提供的抽象界面主要由一组标准的、抽象的操作构成,例如read、writeIseek等,这些函数以系统调用的形式供用户程序调用这样,用户程序调用这些系统调用时,根本无需关心所操作的文件属于哪个文件系统,这个文件系统是怎样设计和实现的
3.以wirteO系统调用为例,说明VFS是如何及具体文件系统(如DOS的FAT)相结合的答Linux的目录建立了一棵根目录为“/”的树根目录包含在根文件系统中,在Linux中,这个根文件系统通常就是Ext2类型其他所有的文件系统都可以被“安装”在根文件系统的子目录中例如,用户可以通过“mount”命令,将DOS格式的磁盘分区(即FAT文件系统)安装到Linux系统中,然后,用户就可以像访问Ext2文件一样访问DOS的文件
4.内核如何组织索引结点?为什么要设置多个链表管理索引结点?答内核使用如下的数据库来自组织索引节点struct inode{struct list_head i_hash;/*指向哈希链表的指针*/structlist_head/*指向索引节点链表的指针*/struct list_head i_dentry;/*指向目录项链表的指针*/unsignedlong i_ino;/*索引节点号*/kdev_t i_dev;/*设备标识号*/umode_t i_mode;/*文件的类型及访问权限*/nlink_t i_nlink;/*及该节点建立链接的文件数*/uid_t i_uid;/*文件拥有者标识号*/gid_t i_gid;/*文件拥有者所在组的标识号*//***********用于索引节点操作的域*****************/structinode_operations*i_op;/*索引节点的操作*/struct super_block*i_sb;/*指向该文件系统超级块的指针*/atomic_ti_count;/*当前使用该节点的进程数计数为0,表明该节点可丢弃或被重新使用*/struct*i_fop;/*指向文件操作的指针*/Struct vm_area_struct*i_opunsigned inti_flags;/*文件系统的安装标志*/union{struct minix_inode_infor minix_i;struct Ext2_inode_info Ext2_i;}使用多个链表加快了对索引节点对象的搜索
5.内核如何组织目录项结构?画图说明答目录项(dentry)对象存放目录项及对应文件进行链接的信息VFS把每个目录看作一个由若干子目录和文件组成的常规文件例如,在查找路径名在mp/test时,内核为根目录/”创建第一个目录项对象,为根目录下的tmp项创建第二级目录项对象,为/tmp目录下的test项创建第三级目录项对象
6、假定进程以读方式打开一个文件后,再执行fork,父进程和子进程都将可以读这个文件这两个进程的读操作和写操作有何关系?答这两个进程共享一个系统文件表项,于是也共享该文件的偏移因此,这两个进程将读取文件的不同部分如果没有其他的进程将该文件打开,写操作将添加到文件的尾部且写操作无数据丢失
7、结合用户打开表说明什么是文件描述符?答文件描述符是用来描述打开的文件的每个进程用一个结构来记录文件描述符的使用情况,这个结构称为用户打开文件表,它是进程的私有数据
8、从用户发出读请求到最终从磁盘读取数据包括哪些步骤给出读操作的逻辑流答从用户发出读请求到最终的从磁盘读取数据,可以概括为以下几步
(1)用户界面层一一负责从用户函数经过系统调用进入内核;
(2)基本文件系统层一一负责调用文件读方法,从缓冲区中搜索数据页,返回给用户
(3)1/0调度层一一负责对请求排队,从而提高吞吐量
(4)I/O传输层一一利用任务队列,异步操作设备控制器,完成数据传输第九章设备驱动
1.为什么把设备分为“块设备”和“字符设备”两大类?答这一方面是为了描述上的方便,更重要的是为了技术处理上的方便及代表着文件的索引结点一样,代表着设备的索引节点中记载着及特定设备建立连接所需的信息这种信息由三部分组成文件(包括设备)的类型、主设备号和次设备号其中设备类型和主设备号结合在一起唯一地确定了设备的驱动程序及其界面,而次设备号则说明目标设备是同类设备中的第几个例如,当主设备号为2时,若设备类型为块设备就指软盘驱动器,而若为字符设备则是指所谓“伪终端Pseudo TTY”设备
2.什么是设备驱动程序答处理和管理硬件控制器的软件要使一项设备在系统中成为可见,成为应用程序可以访问的设备,首先要在系统中建立一个代表此设备的设备文件,这是通过系统调用mknodeO实现的除此之外,更重要的是在设备驱动层要有这种设备的驱动程序设备驱动程序是上层的同步操作及低层的异步操作之间的桥梁
3.I/O端口一般包括哪些寄存器?各自功能是什么?CPU用什么命令对其进行读写?答CPU把要发给设备的命令写入控制寄存器,并从状态寄存器中读出表示设备内部状态的值CPU还可以通过读取输入寄存器的内容从设备取得数据,也可以通过向输出寄存器中写入字节而把数据输出到设备Insb,outsb,insw,outsw,insl,outsl
4.驱动程序一般包含几部分?并对各部分给予简要说明答根据功能,驱动程序的代码可以分为如下几个部分:1驱动程序的注册和注销2设备的打开及释放3设备的读和写操作ttdefin TYPE_E0x0800eTYPE_ED_C0x0400ttdefinTYPE_RW0x0200eTYPE_A0x0100ttdefinestruct#definebase_high;{unsigne chardchar g1;unsigned charother:3;unsigned charlimit_high:4unsignedcharP:1;unsigned chardpi:2;unsigned charS:1;unsigned charE:1;unsigned charED_C:1;unsigned charRW:1;A:1;unsigned charbase_middle;unsigned charunsigned short base_low;unsignedshortlimit_low;}gdt_t;unsignedint mainintargc,char*argv[]//int gdt
[4]={OxOfff,0x0000,0x9a00,OxOOcO};//0x084设备的控制操作5设备的中断和查询处理//int gdt
[4]={0x7fff,0x0000,0x9a01,OxOOcO};//0x10//int gdt
[4]={0x0002,0x8000,0x920b,OxOOcO;//display memory//int gdt
[4]={Oxffff,Oxffff,Oxffff,Oxffff};//test intgdt
[4]={0x03ff,0x0000,0xf201,OxOOcO};//IdtOunsigned intbase,limit;unsigned intgranularity;unsigned intpresent,dpi,system_type,segment_type;unsignedinttype_e,type_ed_c,type_rw,type_a;base=gdt
[3]BASE_H«16;base+=gdt
[2]BASE_M«16;base+=gdt[l]BASE_L«0;limit=gdt
[0]LIMIT_L«0;limit+=gdt
[3]LIMIT_H«16;granularity=gdt
[3]GRANULARITY»7;present=gdt
[2]SEGMENT_P»15;dpi=gdt
[2]DPL»13;system_type=gdt
[2]SYSTEM_TYPE»12;type_e=gdt
[2]TYPE_E»11;type_ed_c=gdt
[2]TYPE_ED_C»10;type_rw=gdt
[2]TYPE_RW»9;type_a=gdt
[2]TYPE_A»8;printf〃base\t\tOx%x\t%d\n”,base,base;printf limit\t\tOx%x\t%d\nz,limit,limit;printf〃\n〃;printf z,G\t\t%d\t O=bype,l=4KB\n”,granularity;printf\n;printf〃P\t\t%d\n”,present;printfDPL\t\t%d\n”,dpi;printf〃S\t\t%d\tO=system,1=code ordata\n”,system_type;printfTYPE_E\t\t%x\n”,type_e;printfTYPE_ED_C\t%x\n”,type_ed_c;printfTYPE_RW\t\t%x\n”,type_rw;printfTYPE_A\t\t%x\n”,type_a;printf〃\n〃;printf〃E=0,data segment\n;printf ED=0,data segment\nz,;printf〃ED=1,stack segmentll;printf〃W=0,not writablen;printf〃W=1,writable、/;printf\n;printf〃E=1,code segment\nz,;printf^0=0,ingore privilege/;printf^0=1,use privilege、/;printf〃R=0,not readable、/;printf〃R=1,readable、/;return EXIT_SUCCESS;
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的代码段和数据段
5.为什么在设计两级页表的线性地址结构时,给页目录和页表各分配10位?如果不是这样,举例说明会产生什么样的结果?答所谓两级页表就是对页表再进行分页第一级称为页目录,其中存放的是关于页表的信息4MB的页表再次分页4MB/4K可以分为1K个页,同样对每个页的描述需要4个字节,于是可以算出页目录最多占用4KB个字节,正好是一个页,其示意图如
2.9所示页目录共有1K个表项,于是,线性地址的最高10位即22位31位〜用来产生第一级的索引两级表结构的第二级称为页表,每个页表也刚好存放在一个4K字节的页中,包含1K个字节的表项第二级页表由线性地址的中间10位即21位12位进行索引,最低12位表示页内〜偏量举例如果页目录占用3124位,页表项占用2312位,偏移地址占〜〜11~0位,则有2K个页表项,一个页面有2124k个表项,每个表项大小为4字节,212的范围为4页面,而不是以一个页面为准
6.深入理解图
2.12,并结合图叙述线性地址到物理地址的转换答第一步,用32位线性地址的最高10位第3122位作为页目〜录项的索引,将它乘以4,及CR3中的页目录的起始地址相加,获得相应目录项在内存的地址第二步,从这个地址开始读取32位页目录项,取出其高20位,再给低12位补0,形成的32位就是页表在内存的起始地址第三步,用32位线性地址中的第2P12位作为页表中页表项的索引,将它乘以4,及页表的起始地址相加,获得相应页表项在内存的地址第四步,从这个地址开始读取32位页表项,取出其高20位,再将线性地址的第1T0位放在低12位,形成最终32位页面物理地址第三章进程
1.什么是进程控制块?它包含哪些基本信息?答对进程进行全面描述的数据结构,Linux中把对进程的描述结构叫做task_struct:struct task_struct{}传统上这样的数据结构被叫做进程控制块PCB processcontrolblaock系统为了管理进程设置的一个专门的数据结构,用它来记录进程的外部特征,描述进程的运动变化过程系统利用PCB来控制和管理进程,所以PCB是系统感知进程存在的唯一标志进程及PCB是——对应的包含的基本信息⑴状态信息一描述进程动态的变化2链接信息一描述进程的父/子关系
(3)各种标识符一用简单数字对进程进行标识
(4)进程间通信信息一描述多个进程在同一任务上协作工作
(5)时间和定时器信息一描述进程在生存周期内使用CPU时间的统计、计费等信息
(6)调度信息一描述进程优先级、调度策略等信息⑺文件系统信息一对进程使用文件情况进行记录
(8)虚拟内存信息一描述每个进程拥有的地址空间
(9)处理器环境信息一描述进程的执行环境(处理器的寄存器及堆栈等)
3.Linux的进程控制块如何存放?为什么?假设ESP中存放的是栈顶指针,请用三句汇编语句描述如何获得current的PCB的地址答当进程一进入内核态,CPU就自动设置进程的内核栈这个栈位于内核的数据段上,为了节省空间,Linux把内核栈和一个紧挨近的PCB的小数据结构,thread_info放在一起,占用8kb的内存区因为这样可以节省空间,内核很容易从ESP寄存器的值获得,当前在CPU上正在运行的thread_info结构的地址movl$0xfffe000,%eaxandl%esp,%ecx movl%ecx,p
4.PCB的组织方式有哪几种?为什么要采取这些组织方式?答
(1)进程链表
(2)哈希表
(3)就绪队列
(4)等待队列在一个系统中,通常可以拥有数十个、数百个乃至数千个进程,相应的就有这么多PCB为了能有效的对它们加以管理,应该用。
个人认证
优秀文档
获得点赞 0