news 2026/6/15 22:14:10

20252820_中断和异常管理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
20252820_中断和异常管理

20252820_中断和异常管理

实验内容:Tasklet / Workqueue / 信号捕获
实验平台:openEuler
内核版本:5.10.0+


1. 实验目的

  1. 理解 Linux 内核中下半部机制(Bottom Half)的基本思想与使用方式。
  2. 掌握tasklet的创建、调度与释放流程。
  3. 掌握workqueue(工作队列)的创建、延迟调度、周期执行与退出清理流程。
  4. 理解 Linux 用户态信号机制,能捕获并处理Ctrl+C / Ctrl+Z / Ctrl+\对应信号。

2. 实验环境与准备

2.1 软硬件环境

  • 操作系统:openEuler
  • 内核版本:5.10.0+
  • 编译工具:gcc / make
  • 内核构建目录:/lib/modules/$(uname -r)/build -> /usr/src/kernels/5.10.0+

2.2 实验目录结构

chapter4_interrupt_exception/ ├── task1_tasklet/ │ ├── tasklet_intertupt.c │ └── Makefile ├── task2_workqueue/ │ ├── workqueue_test.c │ └── Makefile └── task3_signal/ ├── catch_signal.c └── Makefile

2.3 建立目录

mkdir-p chapter4_interrupt_exception/{task1_tasklet,task2_workqueue,task3_signal}

3. 任务一:Tasklet 打印 HelloWorld

3.1 实验内容说明

本任务通过 tasklet 实现一个简单的下半部处理:模块加载时初始化 tasklet 并调度执行,在 tasklet 处理函数中打印Hello World!,模块卸载时使用tasklet_kill()确保 tasklet 安全退出。

3.2 核心代码要点(tasklet_intertupt.c)

文件位置:chapter4_interrupt_exception/task1_tasklet/tasklet_intertupt.c

  • tasklet_init(&tasklet, handler, data):初始化 tasklet
  • tasklet_schedule(&tasklet):调度 tasklet 执行
  • tasklet_kill(&tasklet):退出时确保 tasklet 不再运行

3.3 Makefile 配置(关键点:KERNELDIR)

文件位置:chapter4_interrupt_exception/task1_tasklet/Makefile

  • 外部模块编译:make -C $(KERNELDIR) M=$(PWD) modules
  • openEuler 推荐:KERNELDIR=/lib/modules/$(shell uname -r)/build

3.4 实验步骤

1)进入目录并编译:

cdchapter4_interrupt_exception/task1_taskletmakeclean&&make

2)加载模块并查看输出:

sudoinsmod tasklet_intertupt.kodmesg|tail-n30

3)卸载模块并查看输出:

sudormmod tasklet_intertuptdmesg|tail-n30

3.5 运行结果与截图

  • 截图1:make编译成功(生成.ko
    【截图:任务1-编译成功】


  • 截图2:insmoddmesg中出现Start...Hello World...
    【截图:任务1-加载与打印】

3.6 结果分析与总结

  • tasklet 属于下半部机制之一,适合执行短小、非阻塞的延后处理。
  • 退出时必须tasklet_kill(),避免模块卸载后 tasklet 仍可能访问已释放代码导致异常。

4. 任务二:Workqueue 周期打印 HelloWorld

4.1 实验内容说明

本任务使用工作队列实现“周期打印”效果:创建专用 workqueue,初始化 delayed_work,首次延迟入队;在 work 回调中打印信息并再次queue_delayed_work()自己,从而形成周期执行;卸载模块时取消 delayed_work 并销毁工作队列。

4.2 核心代码要点(workqueue_test.c)

文件位置:chapter4_interrupt_exception/task2_workqueue/workqueue_test.c

关键点:

  • create_singlethread_workqueue()创建队列
  • INIT_DELAYED_WORK(&mywork, work_handle)初始化延迟任务
  • queue_delayed_work(queue, &mywork, period*HZ)延迟调度
  • work_handle()中再次queue_delayed_work()实现周期循环
  • 退出时:cancel_delayed_work_sync()+destroy_workqueue()避免竞态与悬挂任务

4.3 Makefile 配置

文件位置:chapter4_interrupt_exception/task2_workqueue/Makefile

  • KERNELDIR ?= /lib/modules/$(shell uname -r)/build

4.4 实验步骤

1)进入目录并编译:

cdchapter4_interrupt_exception/task2_workqueuemakeclean&&make

2)加载模块(设置周期参数 5 秒):

sudoinsmod workqueue_test.koperiod=5

3)观察周期打印:

dmesg-w

4)卸载模块:

sudormmod workqueue_test

4.5 运行结果与截图

  • 截图1:make编译成功(生成.ko
    【截图:任务2-编译成功】


  • 截图2:insmoddmesg连续多次输出(体现周期性)
    【截图:任务2-周期打印】

4.6 结果分析与总结

  • workqueue 在进程上下文中执行,允许睡眠/阻塞,适合执行相对更复杂的任务。
  • 周期执行推荐在 work 回调中自我重新入队,而不是在module_init()sleep,避免insmod阻塞。
  • 退出必须同步取消 delayed_work,防止模块卸载后工作仍被调度。

5. 任务三:捕获 Ctrl+C / Ctrl+Z / Ctrl+\ 信号

5.1 实验内容说明

本任务在用户态编写程序捕获三类终端按键信号:

  • Ctrl + CSIGINT
  • Ctrl + ZSIGTSTP
  • Ctrl + \SIGQUIT

程序打印当前进程 PID,注册信号处理函数,在捕获到信号后输出对应提示并退出。

5.2 核心代码要点(catch_signal.c)

文件位置:chapter4_interrupt_exception/task3_signal/catch_signal.c

  • 使用signal(SIGxxx, handler)注册处理器
  • 使用pause()阻塞等待信号到来
  • 在 handler 中区分不同sig并输出提示

5.3 编译与运行步骤

1)进入目录并编译:

cdchapter4_interrupt_exception/task3_signalmakeclean&&make

2)运行程序:

./catch_signal

3)分别测试三种按键(每次测试重新运行一次程序):

  • Ctrl + C(SIGINT)
  • Ctrl + Z(SIGTSTP)
  • Ctrl + \(SIGQUIT)

5.4 运行结果与截图

  • 截图1:程序启动输出 PID
    【截图:任务3-启动输出PID】

  • 截图2:按下Ctrl+C捕获 SIGINT 输出,按下Ctrl+Z捕获 SIGTSTP 输出,按下Ctrl+\捕获 SIGQUIT 输出

5.5 结果分析与总结

  • 信号是 Linux 用户态重要的异步事件通知机制,终端按键会向前台进程组发送特定信号。
  • 通过注册 handler 可以实现自定义行为(打印、资源释放、优雅退出等)。
  • 本实验通过 handler 拦截默认行为,实现“捕获并提示”的效果。

6. 实验中遇到的问题与解决方案

6.1 问题:内核源码目录找不到导致编译失败

现象:make[1]: *** /root/raspberrypi-kernel: No such file or directory
原因:Makefile 中KERNELDIR指向了不存在路径。
解决:openEuler 使用:/lib/modules/$(uname -r)/build(本机链接到/usr/src/kernels/5.10.0+)。


7. 实验结论

完成 tasklet、workqueue 与用户态信号捕获三个任务,理解了 Linux 中断下半部与异步事件处理的基本机制,并掌握了模块编译加载、日志验证、退出清理等关键流程。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 11:42:19

uPlot图表库实战指南:轻量级高性能数据可视化的终极解决方案

还在为网页图表卡顿而烦恼吗?🤔 当你的数据量突破万级,传统图表库就开始"力不从心"——页面卡顿、内存飙升、用户体验直线下降。今天,让我们一起来认识这个仅50KB却能轻松驾驭数十万数据点的图表神器:uPlot&…

作者头像 李华
网站建设 2026/6/14 16:33:26

30、FrameMaker使用技巧与页面布局优化指南

FrameMaker使用技巧与页面布局优化指南 在使用FrameMaker进行文档编辑和排版时,掌握一些实用的技巧和方法能够显著提高工作效率,优化文档的呈现效果。下面将为大家详细介绍FrameMaker的一些常见问题及解决方法。 1. 索引标记与字符格式处理 删除空索引标记 :在FrameMake…

作者头像 李华
网站建设 2026/6/11 13:34:49

ChineseFoodNet:解锁中国美食图像识别新境界

ChineseFoodNet:解锁中国美食图像识别新境界 【免费下载链接】ChineseFoodNet大规模中国食物图像识别数据集分享 ChineseFoodNet是一个大规模的中国食物图像识别数据集,旨在为研究人员和开发者提供丰富的图像资源,用于训练和测试食物识别模型…

作者头像 李华
网站建设 2026/6/14 15:38:12

Autoware Universe 终极指南:从零开始构建自动驾驶系统

Autoware Universe 是一个功能完整的开源自动驾驶软件平台,专为开发者和研究人员设计。它基于ROS 2框架,提供了从感知、规划到控制的完整解决方案,让自动驾驶技术变得更加可及。 【免费下载链接】autoware.universe 项目地址: https://git…

作者头像 李华
网站建设 2026/6/12 12:59:57

解锁Web AR商业价值:MindAR.js实战指南

解锁Web AR商业价值:MindAR.js实战指南 【免费下载链接】mind-ar-js Web Augmented Reality. Image Tracking, Face Tracking. Tensorflow.js 项目地址: https://gitcode.com/gh_mirrors/mi/mind-ar-js 在数字化浪潮中,Web增强现实技术正成为商业…

作者头像 李华
网站建设 2026/6/14 0:41:09

3、探索 Unix 哲学:高效编程的秘诀

探索 Unix 哲学:高效编程的秘诀 1. Unix 文化的价值与可借鉴性 痛苦的开发环境会浪费劳动力和创造力,还会在时间、金钱和机会方面产生巨大的隐性成本。即便 Unix 在其他方面不尽如人意,其工程文化也值得研究,因为它让开发充满乐趣,而这种乐趣是高效开发的标志。 Unix 程…

作者头像 李华