自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(8)
  • 收藏
  • 关注

原创 160万次加法只剩14万?Linux内核竞态问题复现实验(下)

tee` 会因为内核写操作返回 `ETIMEDOUT` 而报错,耗时大约五秒,stats 中 `timeouts` 增加 1。剩余两个等待者应打印 `woke`,最后 `waiters=0`、`wakeups=3`。`complete_all()` 之后,新来的等待者也会立即通过,直到执行 `reinit` 开始下一轮。一次 `complete` 只交付一个完成事件,所以通常只会有一个等待者打印 `woke`,同时 stats 变为 `wakeups=1`、`waiters=2`。这是预期的超时路径。

2026-08-17 19:34:55 310

原创 160万次加法只剩14万?Linux内核竞态问题复现实验(上)

tee` 会因为内核写操作返回 `ETIMEDOUT` 而报错,耗时大约五秒,stats 中 `timeouts` 增加 1。剩余两个等待者应打印 `woke`,最后 `waiters=0`、`wakeups=3`。正常情况下会出现 `CC [M]`、`MODPOST`、`LD [M]` 等信息,目录中生成 `ch5_sync.ko`。一次 `complete` 只交付一个完成事件,所以通常只会有一个等待者打印 `woke`,同时 stats 变为 `wakeups=1`、`waiters=2`。

2026-08-17 18:34:04 348

原创 Linux 驱动加了锁,为什么还是会死锁?5 个并发 Bug 带你读懂 LDD3 第五章

若同一状态也会被本地硬中断访问,进程侧通常要使用 `spin_lock_irqsave()`,否则进程持锁时被中断打断,中断再等同一把锁,就会原地死锁。读路径拿 `state_lock`,关闭路径只拿 `open_lock`;可不少故障恰恰发生在已经有锁的代码里:锁保护错了对象,临界区漏掉了状态转换的一半,进程路径与中断路径用了不同规则,或者对象释放时还有回调握着旧指针。把它带回日常驱动开发,最有价值的变化不是“代码里多了一把锁”,而是每把锁都能回答三个问题:它保护什么、谁必须遵守、对象何时才允许消失。

2026-08-15 14:14:36 382

原创 Linux驱动调试实战:基于LDD3思想,从printk到Oops定位全过程

本文基于Linux驱动开发实践,系统介绍了内核模块调试的常用工具链与方法论。文章首先强调驱动编译成功仅是调试起点,提出"函数调用追踪、用户空间请求传递、日志分析、故障定位"四大核心问题。通过一个miscdevice实验模块,作者详细演示了八大实验场景:1) printk日志级别控制;2) dynamic debug动态调试;3) debugfs状态查询;4) strace系统调用跟踪;5) MagicSysRq取证;6) LKDTM生成WARNING;7) gdb/objdump符号映射;8) 安全清理环境

2026-08-12 12:58:06 163

原创 LDD3 边读边学(4-理论篇):内核调试——先留下证据,再追凶

seq_file 的思想却一直保留:把输出看成一个序列,用 start、next、stop、show 迭代,内核负责分段读取、偏移和缓冲管理。工具换了,核心问题没变:在尽量少扰动现场的前提下,记录“什么时候、谁、以什么参数经过了哪里”。对驱动开发而言,strace 最有价值的不是“看到很多调用”,而是把一次用户操作还原成准确的接口事实:打开的是哪个节点、flags 是什么、read 请求多长、ioctl 命令是多少、失败返回 EINVAL 还是 EFAULT。保存日志、卸载模块,必要时立即重启。

2026-08-11 16:19:04 564

原创 LDD3边读边学(第三章)字符设备驱动 scull 实验全过程

通过本次实验,完成了一个简单的 Linux 字符设备驱动 scull 的实现,并掌握了以下关键知识:1. Linux 字符设备驱动的基本结构2. 内核模块的编译与加载过程3. 设备文件 /dev 与驱动之间的关系4. 用户空间程序与内核驱动之间的通信机制5. copy_to_user() 与 copy_from_user() 的使用实验验证了 Linux 字符设备驱动中 open、read、write、release 等接口能够正常工作。

2026-03-13 20:33:03 430

原创 Linux Device Drivers,3rd Edition(LDD3) 读书笔记与实验操作(第二章)

第二章进入编程实操环节。这一章介绍模块和内核编程,将通过运行一个完整模块建立认识框架。这一章解决的包括:• 模块是什么• 模块如何被构建、加载• 模块和普通程序有什么本质区别• 模块在内核空间运行意味着什么。

2026-02-27 18:10:13 678

原创 Linux Device Drivers,3rd Edition(LDD3) 读书笔记与实验操作(第一章)

当然,我们还需要考虑同步与异步操作,能否被多次打开,完整地使用硬件功能,进行策略相关的操作等等······一旦具备上述功能,不仅有利于用户的使用,也方便后续的维护和进一步编写。对于我们的DD,其实也是相同的逻辑。在这个时代,硬件成本急速下降,网络上的开源资源广袤无边,让写自己的驱动以及探索内核变得更加触手可及,LDD3应运而生,虽驱动各异,其质一也。本书基于2.6内核版本,重点是2.6.10版本的所有功能(也就是作者写作时的版本),进行后续的实验只要拥有2.6版本的功能和工具,没有额外的专门要求。

2026-02-27 17:07:56 728

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除