《深入理解LINUX内核》阅读笔记全二十章
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《深入理解LINUX内核》(Understanding The Linux Kernel)第三版
第一章 - 绪论
第一章是绪论。前三节内容很少,讲的都是一些内核边缘相关的东西,不是真正内核的内容,简单了解就好,不必深究。后三节,“操作系统基本概念”简单描述了几个“使用操作系统”要知道的概念;“Unix文件系统概述”也是从用户的角度讲了几个概念,并没有深入到内核;“Unix内核概述”这一节内容很多,最重要的是它在讲述一些内核的重要概念时引出了很多必须处理的问题,让读者带着疑问到本书的后续章节里去自己探寻答案。
第二章 - 内存寻址
这一章的内容都是很底层的,直接是一些硬件特性或者是内核中处理硬件的一些策略。
内存地址根据其组织特点的不同分为三个层次:逻辑地址(虚拟地址)、线性地址、物理地址。再细一层,有分段和分页两种。对这两种机制,书中分别详细描述了其80X86的硬件特性和Linux内核对应的处理。
其中分页是重点。常规分页机制中,页框是4KB;而扩张分页机制的页框是4MB。Linux 采用了4级分页模型,能适应不同的体系结构。本章还讲述了硬件高速缓存和TLB (Translation Lookaside Buffer),TLB的翻译有很多种:转换后援缓冲器、转换检测缓冲区、旁路转换缓冲、页表缓冲,我觉得直接叫页表缓冲就很好理解了,没有必要纠结于单个单词的意思。
第三章 - 进程
这一章讲进程,但没有涉及任何的算法相关的东西,都是那些跟数据有关的系统调用、函数、数据结构,这跟前一章很像。
进程的静态特性:进程描述符,都是task_struct类型的结构,它的字段包含了与一个进程相关的所有信息。进程描述符是很基础很重要的东西,整个内核都构建在它的基础之上。
进程切换,这一章里“切换”是跟“调度”完全不同的概念。切换只是当进程调度时要做的数据的处理,特别是与进程描述符相关的操作以及硬件上下文、进程上下文相关的数据、字段。
创建进程,最重要的是do_fork()函数和copy_process()函数。
还有最后一节是撤销进程。重点是do_exit()函数和进程删除时的父子进程关系。
第四章 - 中断和异常
中断(interrupt)通常被定义为一个事件,该事件改变处理器执行的指令顺序。
中断分为同步和异步中断,或者称为异常和中断。
第二节中断和异常。中断包括可屏蔽中断和非屏蔽中断,而异常则包括处理器探测异常和编程异常。还讲述了一些关于IRQ线的知识,然后是异常处理程序发送的19种信号。当然,少不了中断描述符表。
第四节“初始化中断描述符表”,在Linux中分为以下几种描述符:中断门、系统门、系统中断门、陷阱门、任务门。
第六节中断处理。这是本章的重点,也是难点。
物理IRQ可以分配给32~238范围内的任何向量。
每个中断向量都有它自己的irq_desc_t描述符。
这一节还探讨了IRQ在多处理器系统上的分发,使得处理器间达到平衡。最重要的两个函数:do_IRQ()、__do_IRQ()。
第七节软中断及tasklet。这是实现下半部机制的两种最重要的技术。但是很奇怪书上没提到半点下半部。软中断类型很少,只有6种,而tasklet可以很方便地在软中断的基础上实现。软中断的两个主要函数do_softirq()、__do_softirq()。
第八节讲了工作队列的数据结构、实现,却没有讲它到底有什么用、怎么用。
第五章 - 内核同步
内核各部分交错执行,产生了竞争条件,所以需要同步技术来解决。
临界区是一段代码,在其他的内核控制路径能够进入临界区前,进入临界区的的内核控制路径必须全部执行完这段代码。
第二节“同步原语”是重点。一共讲述了几种同步技术。①每CPU变量,是指专属于某一个CPU使用的变量,其他CPU不能访问。②原子操作,确保某些操作在芯片上是原子级的,由单个指令执行,中间不能中断。③优化和内存屏障。优化屏障原语保证编译程序不会混淆放在原语操作之前的汇编语言指令和放在原语操作之后的汇编语言指令。而内存屏障原语确保,在原语之后的操作开始执行之前,原语之前的操作已经完成。④自旋锁,内核控制路径通过执行一条紧凑的循环指令来等待锁被释放。⑤顺序锁,写者可以打断读者获得锁。⑥信号量,能够让等待着睡眠,直到等待的资源可用。
第六章 - 定时测量
Linux内核必需完成两种主要的定时测量:保存当前的时间和日期;维持计时器,这种机制能够告诉内核某一时间间隔已经过去了。
第一节时钟和定时器电路。讲的都是硬件方面的器件。包括实时时钟RTC、时间戳计数器TSC、可编程间隔定时器PIT、CPU本地定时器、高精度事件定时器HPET以及ACPI电源管理定时器。
第二节Linux计时体系结构。其数据结构包括定时器对象、jiffies变量、xtime变量。另外这节还分别讲述了单处理器系统跟多处理器系统上计时体系结构的实现。重要的函数有time_init()、timer_interrupt()。
内核通过利用各种计时器可以收集一些数据用于:检查运行进程的CPU资源限制;更新与本地CPU工作负载有关的统计数;计算平均系统负载;监管内核代码。
为了提供更灵活方便的定时器,内核实现了软件级别的定时器,包括动态定时器和间隔定时器。
每个定时器都包含一个字段,表示定时器将需要多长时间到期。每个字段的初值就是jiffies的当前值加上合适的节拍数。
第六节与定时测量相关的系统调用。简单讲解了以下几个系统调用:time()、gettimeofday()、adjtimex()、settimer()、alarm()。
这一章的难度不大,而且讲解都很有条理、清晰。
第7章:进程调度
进程调度(scheduling)主要关心什么时候进行进程切换及选择哪一个进程来运行。
第一节调度策略。Linux的调度基于分时(time sharing)技术:多个进程以“时间多路复用”方式运行,因为CPU的时间被分成“片(slice)”,给每个可运行进程分配一片。
第二节调度算法。分为普通进程的调度和实时进程的调度。每个普通进程都有它自己的静态优先级,根据该优先级可以算出它的基本时间片。当然,还有根据进程的平均睡眠时间