Linux内核编程(The Linux Kernel Primer)书

来源:互联网 发布:sql语句经典例题 编辑:程序博客网 时间:2024/05/02 01:59

第二章 linux内核探索工具集。内核中常见数据类型(链表,树,查找),汇编示例,内联汇编,内核探索工具(objdump/readelf、hexdump、nm、objcopy、ar)、printk、dmesg、var/log/messages、__init、likely()/unlikely()。

第三章 进程:程序执行的基本模型。讲了程序、进程描述符、进程创建(fork()/vfolk()/clone()/do_fork())、进程终止(sys_exit()/do_exit()/sys_wait4())、调度程序的基本架构、等待队列、中断异常。

第四章 内存管理。讲了页、页面、内存管理区(三个:ZONE_DMA/ZONE_NORMAL/ZONE_HIGHMEM,原因是为了简化与体系结构无关的代码、为了统一而保留、有些总线寻址范围有限等)、slab分配器及其生命周期(解决外部碎片问题,交给伙伴系统分配管理)、linux进程内存结构(进程地址空间被划分为不同的内存区,用于保护,如只读,可执行等,进程地址空间以及与之相关的所有信息都保存在mm_struct描述符中,它出现在task_strcut中,一个内存区由vm_area_struct描述符表示)、进程映像的分布及线性地址空间、页表、缺页。

第五章 I/O。总线/桥/接口、设备(块设备请求队列和IO调度、字符、网络、时钟、终端设备、DMA)

第六章 文件系统。VFS及其相关数据结构(fs_struct结构、files_struct结构)、页缓存(address_space结构、buffer_head结构)、VFS的系统调用和文件系统层。

第七章 进程调度和内核同步。linux调度程序、内核抢占、自旋锁、信号量。

第八章 内核引导。与体系结构相关的内存初始化、原始ram盘、start_kernel()函数分析。



第九章 构建linux内核。讲了编译程序、交叉编译、链接程序、elf二进制目标文件结构(非可执行(多个节、一个节头表)、可执行(多个段、一个程序头表))。


第十章 向内核添加代码。讲了工作队列和tasklet的使用及区别

为了让中断快速运行,分成上半部(中断处理程序,它立即执行,因为它是在所有中断禁止的情况下执行)和下半部(推后处理程序,与中断对应)有三种不同的下半部实现机制:软中断、tasklet、工作队列。

软中断:软中断是在编译期间静态分配的,最多32个,不会抢占另外一个软中断,能并发运行在多个CPU上(所以要可重入,多CPU同时操作使用自旋锁保护),目前只有两子系统直接使用软中断:网络和SCSI,执行时间:从硬件中断代码返回时及其他。

tasklet:由两类软中断实现(HI_SOFTIRQ,TASKLET_SOFTIRQ),动态增减,同一类tasklet不能并发执行,不同类型可并发执行,下半部短小时能节省开销。只在中断上下文中运行。

工作队列:由内核线程执行,即总是在进程上下文执行,可睡眠,阻塞。

由request_irq()注册的上半部中断处理函数只完成最基本的管理工作,余下部分以任务形式插入工作队列,等候处理。

上半部处理:时间敏感、硬件相关、不被其他中断中断,其他的则可放在下半部。

软中断是随着SMP出现的,tasklet基于软中断,弥补了其可重入性编程的麻烦,因此诞生。之前两个运行在中断上下文不能睡眠和阻塞等待,于是诞生了工作队列(2.4中是任务队列),它可延迟执行,能够在不同进程间切换。

构成软中断的核心元素包括:1 软中断状态寄存器(irq_stat) 2 软中断向量表(softirq_vec) 3 软中断守护(daemon)。软中断模拟实际中断处理过程,当某一软中断事件发生后,设置对应中断标记、触发中断事务、唤醒守护线程检测中断状态寄存器,发现后,通过软中断向量表调用软中断服务程序action()。硬件中断的这一过程是硬件自动完成的,这体现了软中断的模拟。可见,软中断的服务程序的执行上下文为软中断daemon。linux中软中断daemon线程函数为do_softirq()。触发软中断事务通过raise_softirq()实现,该函数就是在中断关闭的情况下设置软中断状态位,然后判断如果不在中断上下文就直接唤醒守护daemon。



原创粉丝点击