当前课程知识点:Linux 内核分析与应用 > 第5章 中断 > 5.6 动手实践-中断下半部的代码分析及应用 > Video
大家好 本节视频来给大家演示一下中断下半部分实验
那么在理论课程中我们知道 Linux将中断处理分成上下两部分
上半部分主要处理紧急的 必须马上处理的事情
下半部分就是一些不那么紧急的事情
那么Linux内核也提供了相应的机制
在这里我们使用理论课程中的tasklet机制
来进行一次实验 我们来进入实验代码
首先这个实验只需要在上一个实验的基础之上
增加一部分代码就可以使用了
首先我们要在中断服务例程 也就是上半部分中添加
tasklet的init函数
也就是将下半部分函数进行一个注册
然后最主要的是要把我们的下半部分处理函数挂载上去
之后调用tasklet_schedule进行调度
接下来需要编写我们自己的下半部分处理函数
在这里我们仅仅进行了一行信息的打印
在最后我们需要在模块退出函数中写上tasklet_kill
用来注销掉我们的tasklet 好我们来对代码进行编译
好 我们来插入模块
还是使用1号中断线
好我们 来查看一下中断的情况
这里看到我们的设备已经正确的插入了
接下来我们来打印日志信息
好 我们可以在这里看到
已经顺利的进入了我们下半部分的程序
好 我们来退出模块
好 已经顺利退出
好 我们在这里来查看一下内核中的tasklet_init函数
它位于kernel下的
softirq.c文件中 好 我们来查找
好 我们可以看到这里也就是一些字段的赋值
包括函数的挂载
还有一个函数是task_schedule函数 这个函数位
interrupt.h中 是在include/Linux下
好 我们来查找
就在这里 实际上它是进入了这个函数
那我们可以看出来这里是进行了一个字段的赋值
接下来是进入kernel/softirq.c文件中
那在这里我们就可以看到
实际上它的调度就是把我们传入的tasklet挂入到了链表的尾部
接下来执行TASKLET_SOFTIRQ类型的软中断
但是调度之后不代表就执行了 真正的执行
对于我们的TASKLET_SOFTIRQ类型
是tasklet_action函数
这个函数位于kernel/softirq.c 我们来查找
在这个里面最核心的一个
是我们的while(list)
也就是遍历我们的tasklet链表
真正执行的函数是在这里
这里也就是tasklet这个结构体的最后一个字段
其实是func的一个参数
然后继续执行下一个tasklet
好 那我们可以来查看一下内核源码中驱动代码
应用tasklet是如何应用的
那我们现在可以来进入net
mac802154的
main.C函数
那我们可以看到它在这里是使用了tasklet_init
对应的它的中断的
下半部分函数是ieee802154_tasklet_handler
那么这个函数是定义在这里的
它是定义在这里
之后它的调度函数是在它(目录)底下的rx.c文件中
是在这里进行的调度 最后在main函数中
在最后的注销中它会把它的tasklet进行一个注销
好 我们在最后来分享一个小功能
这个小功能实际上是在内核源码的
Documentation 也就是内核源码中的文档中所发现的一个小功能
值得一提的是这个
Documentation中的文件都是非常重要的
对我们都非常有帮助
在里面我们可以找到很多的有意思的文件
比如说我们可以在它的x86目录下
boot.txt中 我们就可以找到
关于启动时的一些说明
像这里有内存一开始的分配
还比如说就在
Documentation下的Changes
那我们在这里可以知道
知道编译内核最少需要的工具是哪些
当然我们可以在Documentation中找到中断
相关的一些文档
比如说Documentation下的IRQ
在这里就解释了什么是IRQ
这里可是开发人员的解释
相对应的我们还有一些
中断的API介绍
是位于Documentation下的core-api
这个文件中
在这个文件的最后我们就可以发现一些介绍
像我们刚才所看到的manage.c
chip.c handle.c 这些文件
在这里都有说明 那这个小功能是位于
Documentation下的IRQ-affinity.txt文件中
我们可以来演示一下这个功能
这个功能就是如果我们的机器有多个CPU
我们可以来指定产生的中断是在哪一个CPU上来进行处理
也就是绑定CPU
关于这里我们应该合理地根据自己的生产环境
和应用的特点来平衡IRQ中断
这有助于提高我们系统整体的吞吐能力和性能
不同的场景下我们需要不同的设置
也不是说我们修改了某些参数就叫做
性能优化 还需要经过大量的测试 观察和改进
我们来在红帽下演示
首先我自己的系统已经在运行irqbalance服务
这个服务就是要平衡我们的中断到各个CPU
这个服务可能对我们的演示造成一定的影响 所以我们关闭这个服务
我们先来查看我们的中断情况
这是我们的网卡
我们可以看到网卡的中断是由CPU0114来处理的
而CPU1没有进行处理 我们再来看一下文件
对应网卡的irq是19
我们来看这个文件
我们可以看到这里是1 对应的二进制也是1 那么就是
仅仅在我们的CPU0来处理网卡中断
而CPU1不进行 现在我们来进行修改
再来查看
2对应的二进制是10 也就是我们只使用CPU1
来处理我们的网卡中断 而CPU0不响应
我们再次来查看中断情况
这里可以看到是156-14再次查看
还是156这个变成18 再次查看
156-21也达到了我们想要的效果 这就是本次视频的全部内容
谢谢大家
-1.1 Linux操作系统概述
-1.2 Linux内核结构以及内核模块编程
--Video
-1.3 Linux内核源码中的双链表结构
--Video
-1.4 源码分析-内核中的哈希表
--Video
-1.5 动手实践-Linux内核模块的插入和删除
--Video
-第1章 概述--章节测验
-2.1 内存管理之内存寻址
--Video
-2.2 段机制
--Video
-2.3分页机制
--Video
-2.4 动手实践-把虚拟地址转换成物理地址
--Video
-第2章 内存寻址--章节测验
-3.1 进程概述
--Video
-3.2 Linux进程创建
--Video
-3.3 Linux进程调度
--Video
-3.4 动手实践-打印进程描述符task_struct中的字段
--Video
-3.5工程实践-基于内核模块的负载监控
--Video
-第3章 进程管理--章节测验
-4.1 Linux内存管理机制
--Video
-4.2 进程用户空间管理机制
--Video
-4.3 物理内存分配与回收机制(上)
--Video
-4.4 物理内存分配与回收机制(下)
--Video
-4.5 动手实践-Linux内存映射基础(上)
--Video
-4.6 动手实践-Linux内存映射实现(中)
--Video
-4.7 动手实践-Linux内存映射测试(下)
--Video
-4.8 初学者对内存管理的常见疑惑
-第4章 内存管理--章节测验
-5.1 中断机制概述
--Video
-5.2 中断处理机制
--Video
-5.3 中断下半部处理机制
--Video
-5.4 时钟中断机制
--Video
-5.5 动手实践-中断上半部的代码分析及应用
--Video
-5.6 动手实践-中断下半部的代码分析及应用
--Video
-第5章 中断--章节测验
-6.1 Linux中的各种API
--Video
-6.2 系统调用机制
--Video
-6.3 动手实践-添加系统调用(系统调用日志收集系统)
--Video
-第6章 系统调用--章节测验
-7.1 内核同步概述
--Video
-7.2 内核同步机制
--Video
-7.3 动手实践-内核多任务并发实例(上)
--Video
-7.4 动手实践-内核多任务并发实例(下)
--Video
-第7章 内核同步--章节测验
-8.1 虚拟文件系统的引入
--Video
-8.2 虚拟文件系统的主要数据结构
--Video
-8.3 文件系统中的各种缓存
--Video
-8.4 页高速缓存机制以及读写
--Video
-8.5 动手实践-编写一个文件系统(上)
--Video
-8.6 动手实践-编写一个文件系统(中)
--Video
-8.7 动手实践-编写一个文件系统(下)
--Video
-第8章 文件系统--章节测验
-9.1 设备驱动概述
--Video
-9.2 I/O空间管理
--Video
-9.3 设备驱动模型
--Video
-9.4 字符设备驱动程序简介
--Video
-9.5 块设备驱动程序简介
--Video
-9.6 动手实践-编写字符设备驱动程序
--Video
-9.7工程实践-编写块设备驱动的基础(上)
--Video
-9.8 工程实践-块设备驱动程序分析(中)
--Video
-9.9 工程实践-块设备驱动程序实现(下)
--Video
-第9章 设备驱动--章节测验
-致谢与说明
--Video