软中断上下文原则
- 不可睡眠: 在软中断上下文中,代码不能睡眠或阻塞,不能调用可能导致睡眠的函数(如 schedule()、mutex_lock() 等)。
- 不可抢占: 传统上,软中断上下文是不可抢占的,但在 CONFIG_PREEMPT_RT 实时内核中,软中断可以被抢占。
- 不可被中断: 软中断处理程序可以被硬中断打断,但不会被其他软中断打断。
- 无法访问用户空间: 软中断上下文无法访问用户空间内存,不能调用 copy_to_user() 或 copy_from_user() 等函数。
软中断的使用限制
在软中断上下文中,禁止调用任何可能导致睡眠的函数,例如:
- 内存分配: 不能使用 kmalloc(GFP_KERNEL),应使用 kmalloc(GFP_ATOMIC)。
- 同步原语: 不能使用 mutex 或 semaphore,应使用自旋锁(spin_lock)等非阻塞的同步机制。
- 无法访问用户空间: 软中断上下文无法访问用户空间内存,不能调用 copy_to_user() 或 copy_from_user()