用途:引导代理处理 Linux 内核同步问题,包括自旋锁、互斥锁、信号量、RCU、顺序锁、completion 与内存顺序规则,用于编写正确的驱动和子系统补丁。
适用时机:IRQ 处理程序与进程上下文共享数据;需要 RCU 的读多写少结构;为 probe 与 ioctl 路径选锁;调试死锁或 scheduling while atomic。
主要做法与用法: 选锁依据上下文能否睡眠。不可睡眠(IRQ、持自旋锁、抢占关闭)用 spin_lock_irqsave()/atomic_t;可睡眠时,独占且长期持有用 mutex,读写分离用 rw_semaphore 或 RCU(读多写少),一次性信号用 completion。持自旋锁期间不得睡眠(不得调用 kmalloc(GFP_KERNEL)、mutex_lock)。与 softirq/tasklet 共享时用 spin_lock_bh。 自旋锁加 IRQ 的典型写法:spin_lock_irqsave(&lock, flags); /* 临界区,不可阻塞 / spin_unlock_irqrestore(&lock, flags); 互斥锁在进程上下文:mutex_lock(&m); / 可分配、可睡眠 */ mutex_unlock(&m); RCU:读者用 rcu_read_lock()/rcu_dereference()/rcu_read_unlock(),不加锁;写者 kmalloc 新对象后 rcu_assign_pointer(),再 synchronize_rcu(),最后 kfree(old)。RCU 读者不能无限阻塞,宽限期在所有 CPU 静止后完成。 顺序锁用于 jiffies、时间戳:读者用 read_seqbegin()/read_seqretry() 重试循环,写者用 write_seqlock()/write_sequnlock()。 completion:DECLARE_COMPLETION(done);等待方 wait_for_completion(&done);通知方 complete(&done)。 内存屏障:内核提供 smp_mb()、smp_wmb()、smp_rmb();设备 MMIO 使用 readl/writel(多数架构上有序)。
常见问题与修法:scheduling while atomic 源于持自旋锁睡眠,改用 GFP_ATOMIC 或延迟工作;死锁源于 AB-BA 加锁顺序,需统一全局加锁顺序;RCU stall 因读者阻塞过久,应缩短 rcu_read_lock 区段;丢失唤醒因 complete 早于 wait,可每轮用 INIT_COMPLETION;计数器损坏因 IRQ 中非原子读改写,改用 atomic_t 或加锁。
限制:本资料未提供安装命令、收费或平台信息,暂未提供。