1、湘潭大学Linux内核分析知识点第一章1Linux诞生于1991年10月25日。2Linux诞生和发展不可缺少的五个支柱:1、UNIX最初的开放源代码版本为Linux提供了基本原理和算法。2、Richard Stallman的GNU计划为Linux系统提供了丰富且免费的各种实用工具。3、POSIX标准的出现为Linux提供了实现与标准兼容系统的参考指南。4、Tanenbaum的MINIX操作系统为Linux的诞生起到了不可忽略的参考作用。5、互联网是Linux成长和壮大的必要环境。第二章1操作系统主要有4部分组成:硬件、操作系统内核、操作系统服务和用户应用程序。2操作系统内核的结构模式主要可分
2、为整体式的单内核模式和层次式的微内核模式。3单内核的主要优点:内核代码结构紧凑、执行速度快,不足之处:层次结构性不强。4单内核模式可分为三层:调用服务的逐层序层、执行系统调用的服务层和支持系统调用的底层函数。5Linux内核主要由5个模块构成:进程调度模块、内存管理模块、文件系统模块、进程间通信模块和网络接口模块。6Makefile的三部分:目标、先决条件和命令。7内核映像文件(Image)的三部分:bootsect、setup、system。通过build工具连接而成。第三章1引导扇区是磁盘的第一个扇区(0磁头,0磁道,1扇区),自举程序(引导程序)的大小为512B,最后两个字节必须为0xa
3、a55。2movw指令: 从ds:si移动一个字到es:di,然后根据标志寄存器中direct标志位,把si和di分别加2(d=0)或减2(d=1)。Rep指令:重复执行后面的命令,重复次数放在cx寄存器中,每执行一次后面的命令则把cx中的值减1,直到cx为0。 3 限制(1)13中断一次只能读同一磁道上的扇区(2)实模式下内存段大小不能超过64K解决方法:(1)一次读一个扇区,读完后如果内存段满了则调整到下一个内存段。太慢!(2)在读之前取磁道上剩余扇区大小和内存段剩余大小中的最小值M,读M/512个扇区。4 磁盘读取规则:当0磁头的某个磁道读完,下一次就读1磁头的相同磁道;当1磁头的某个磁
4、道读完,下一次就读0磁头的下一个磁道。5 Setup.s程序的功能:1、1-106行:获取并保存系统参数。从0x90000内存块开始2、113-126行:移动system。 从0x10000到0x000003、130-193行:进入保护模式。6保护模式下的两种内存管理机制:分页和分段。 三种不同的地址:1、逻辑地址:包含在机器语言指令中的地址,由一个段:段内偏移组成。2、线性地址:逻辑地址到物理地址变换间的中间层。3、物理地址:内存单元的地址。7. 分段:保护模式下把内存分为多个段,每个段用一个描述符(数据结构)用来描述它的属性,包括段的开始地址、段长度、类型、访问权限等。段描述符由8个字节组
5、成。8. 两位RPL(Requestor Privilege Level)指定了进程的特权级别,RPL0 等待进程号为pid的子进程。pid=0 等待进程组号等于当前进程组号的任何一个子进程。Pid=-1 等待任何一个子进程。pid0:向指定进程发送信号,pid=0:向当前进程所在组的所有进程发送信号,pid=-1:向除进程0之外的所有进程发送信号,pid-1:向进程组为-pid的所有进程发送信号,sig:信号值。46.信号处理:信号时一种异步通信机制,当进程收到信号后,并不马上处理。只有等到进程系统调用返回,或者中断返回后,才处理信号。这时程序运行到system_call.s中的ret_fr
6、om_sys_call标号地址处,先检查信号位图,找到第一个允许响应的信号值,将之压入内核堆栈,然后调转到do_signal()函数。Do_signal根据信号值调用对应的信号处理函数。难点在于当进程注册了自定义信号处理函数时,内核怎么调用用户态的函数?通过构造堆栈。Void do_signal() 作用:根据信号值调用信号处理函数。47.屏蔽信号:int sys_ssetmask(int newmask) 作用:为进程设置信号屏蔽位图,参数:newmask新的信号屏蔽位图,返回:老的信号屏蔽位图。48.信号处理流程: 第六章 判断硬盘信息有效标志55AA1.设备管理模块读处理过程:1、进程向
7、缓冲区模块提出读块(2扇区)请求。2、缓冲区模块检查该块是否已经被缓冲。如果已经被缓冲,则直接返回缓冲的块;否则,向设备管理模块提出读请求。3、设备管理模块接受请求。如果设备不忙,则向设备发送命令;否则,把请求插入到设备的请求队列中。4、缓冲区模块挂起进程。5、设备控制器从设备中读入数据岛自己的缓冲区,并产生中断。6、设备中断处理程序把数据从控制器缓冲区读到内存缓冲区,然后唤醒进程。2.设备管理模块写处理过程:1、缓冲区模块决定要回写被缓冲的块。如果该块是脏的,向设备管理模块提出写请求。2、设备管理模块接受请求。如果设备不忙,则向设备发送命令和数据;否则,把请求插入到设备的请求队列中。3、缓冲
8、区模块挂起进程。4、设备控制器把数据写入到设备并产生中断。5、设备中断处理程序唤醒进程。3.设备号:设备室通过主设备号和次设备号(两者构成额物理设备号)来进行区分的。主设备号:区分不同类型的设备。次设备号:区分相同类型设备中的个体。逻辑设备号:用于区分不同的设备,逻辑设备号=主设备号8+次设备号。4.块设备结构:每个块设备都有自己独立的请求队列。为方便管理队列,建立了快设备结构。 Struct blk_dec_struct void(*request_fn)(void); struct request *current_request; Linux支持多种块设备,为所有这些块设备结构建立了一个
9、数组,数组下标就是设备的主设备号。 Struct blk_dev_struct blk_devNR_BLK_DEV #define NR_BLK_DEV 75.void ll_rw_block(int rw,struct buffer_head *bh) 作用:完成低级读写操作,参数:rw读写命令,bh缓冲区头指针。此函数为块设备管理模块的入口函数。6.电梯算法:磁头朝一个方向运动来满足该方向上最近的请求。当该方向上所有的请求都处理完之后,则反方向来处理其它请求。例如:磁头正在第5柱面处理请求,磁头向内运动,其后有5个请求到达,分别是第7、2、6、1、8柱面上的请求。则处理顺序是:5 6 7 8 2 1.一般情况下,所有请求都能获得合适的处理。但是,在极端情况下仍然会造成饿死现象。例如:上例中,如果不断地有第5柱面之后的处理请求,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1