LS_7_linux内核分析.ppt
文本预览下载声明
* Api、C库和系统调用 系统调用号 在linux中,每个系统调用被赋予一个系统调用号。这样通过这个独一无二的号就可以关联系统调用,当用户空间的进程执行一个系统调用时,这个系统调用号就用来指明到底是要执行那个系统调用。 系统调用的性能: Linux系统调用执行效率很高。进出内核都被优化得简洁高效。 系统调用处理程序 用户空间无法直接执行内核代码,应用程序依靠软中断来实现切换:通过引发一个异常来促使系统切换到内核态去执行处理程序,此时的异常处理程序实际上就是系统调用处理程序。 系统调用陷入内核的方式都一样,所以需要传入系统调用号。 内核数据结构 内核常用的内建数据结构; 链表 队列 映射 二叉树 中断和中断处理 中断使得硬件得以发出通知给处理器。 异常与中断不同,它在产生时必须考虑预处理器时钟同步。 在响应一个中断时,内核会执行一个函数,该函数叫做中断处理程序或中断服务例程。产生中断的每个设备都有一个相应的中断处理程序。 在linux中,中断处理程序就是普通的C函数。只不过这些函数必须按照特定的类型声明,以便内核能够以标准的方式传递处理程序的信息。中断处理程序与其他内核函数的真正区别在于,中断处理程序是被内核调用来响应中断的,而他们运行于我们称之为中断上下文的特殊上下文中。 中断上下文 当执行一个中断处理程序时,内核处于中断上下文中。中断上下文不可以睡眠,无法对它重新调度。中断上下文具有较为严格的时间限制,因为它打断了其他代码。 下半部和推后执行的工作 内核为处理中断提供了中断处理程序机制,但它本身存在一些局限,只能完成整个中断处理流程的上半部分。这些局限包括 1,中断处理程序以异步方式执行,并且有可能打断其他重要代码的执行。为了避免打断时间过长,中断应执行的越快越好。 2,由于中断处理程序往往需要对硬件进行操作,所以它通常有很高的实现要求。 3,中断处理程序不在进程上下文中运行,所以它们不能阻塞。 这些均限制了中断处理程序所做的事情。 它只好简单迅速的完成响应,然后将那些对时间要求相对宽松的任务推后到中断被激活以后再去运行。这部分被称为下半部。 延迟linux内核工作的三种机制: 软中断 Tasklet 工作队列 内核同步介绍 对内核来说也需要考虑并发。 临界区和竞争条件 内核中可能造成并发的原因: 中断—中断几乎可以在任何时刻异步发生 软中断和tasklet—内核能在任何时刻唤醒或调度软中断和tasklet,打断执行的代码。 内核抢占—因为内核具有抢占性,所以内核中的任务可能会被另一任务抢占。 睡眠及与用户空间的同步—内核执行进程可能会睡眠,这就会唤醒调度程序,从而导致调度一个新的用户进程执行。 对称多处理—两个或多个处理器可以同时执行代码。 原子操作。 原子操作可以保证指令以原子的方式执行—执行过程不被打断。 内核提供两组原子操作接口—一组针对整数进行,另一组针对单独的位进行。 自旋锁最多只能被一个可执行线程持有。如果一个执行线程试图获得一个被已经持有的自旋锁,那么该线程就会一直进行忙循环,等待锁重新可用。 信号量。 互斥体。 大内核锁 顺序锁 定时器和时间管理 内核中时间的概念: 内核必须在硬件的帮助下才能计算和管理时间。硬件为内核提供了一个系统定时器用于计算流逝的时间,系统定时器以某种频率自行出发或射中时钟中断,该频率可以通过编程预定,称作节拍率。 节拍率是通过静态预处理定义的。 节拍率高的好处: 更高的时钟中断解析度可提高时间驱动事件的解析度。 提高了时间驱动事件的准确度。 劣势: 节拍率高意味着时钟中断频率越高,也就意味着系统负担越重。 无节拍的OS 间隔不固定,可省电。 Jiffies 用来记录自系统启动以来产生的节拍的总数。 实时时钟(RTC)用来持久存放系统时间的设备。即便系统关闭后,它也可以靠主板上的微型电池提供电力保持系统的计时。 内存管理 内核把物理页作为内存管理的基本单位。 不同体系结构甚至支持几种不同的页大小,32位体系结构支持4KB的页。 由于硬件限制,内核并不能对所有的页一视同仁,有些页位于内存中特定的物理地址上,所以不能将其用于一些特定的任务。 Slab层 分配和释放数据结构是所有内核中最普遍的操作之一。Slab分配器是通用数据结构的缓存层。 Slab层包不同的对象划分为所谓高速缓存组,其中每个高速缓存组都存放不同类型的对象,每种对象类型对应一个高速缓存。 虚拟文件系统 VFS使得用户可以直接使用open(),read(), Write()这样的系统调用而无需考虑具体文件系统和实际物理介质。 之所以可以使用这种通用接口对所有类型的文件系统进行操作,是因为它定义了所有文件系统都支持的、基本的、概念上的接口和数据结构。 VFS中有4个主要的对象类型: 超级块对象,它代表一个具体的已安装文件
显示全部