函数spin_lock_bh()用于获取指定锁,同时它会禁止所有下半部的执行。相应的spin_unlock_bh()函数执行相反的操作 由于下半部可以抢占进程上下文中的代码,所以当下半部和进程上下文共享数据时,必须对进程上下文中的共享数据进行保护,所以需要加锁的同时还要禁止下半部执行。同样,由于中断处理程序可以抢占下半部,所以如果...
还有就是软中断与软中断自我抢占临界区访问时,也需要使用 spin_lock_bh 以上的中断锁,因为有可能软中断在执行的过程中,自己被硬件中断打断,然后又执行到同样的代码,在别的 CPU 执行还好说,毕竟软中断可以在不同的 CPU 上执行同一个中断函数,但是假设不幸运行在同一个 CPU 上,则会导致死锁。Taskset 由于在运行...
函数spin_lock_bh()用于获取指定锁,同时它会禁止所有下半部的执行。相应的spin_unlock_bh()函数执行相反的操作 由于下半部可以抢占进程上下文中的代码,所以当下半部和进程上下文共享数据时,必须对进程上下文中的共享数据进行保护,所以需要加锁的同时还要禁止下半部执行。同样,由于中断处理程序可以抢占下半部,...
LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock); } 首先disable local irq(禁止当前cpu的中断),再禁止调度,此时没有任何情况可以打断,是完全安全的。如果临界资源中断处理函数也会使用,需要使用spin_lock_irq来保证同步。 spin_lock_irqsave spin_lock_irqsave() -> _raw_spin_lock_irqsave(...
(2) 硬件中断中:spin_lock 3.2 spin_lock_irq 上下文/软中断 + 硬件中断 3.3 spin_lock_irqsave 这种类型的使用方式是最为安全以及便捷的; 3.4 spin_lock_bh 只关闭中断底半部,其实就是关闭了软中断、Taskset 以及 Timer 等的一个抢占能力 代码临界区只存在软中断/Taskset/Timer + 进程上下文这样的组合:sp...
如果代码能够确定在执行锁之前中断一定是打开的,那么使用 spin_lock_irq 是更佳的选择。 spin_lock_bh 使用场景 这种类型的变种是一种比 spin_lock_irq 更轻量的变种,只关闭中断底半部,其实就是关闭了软中断、Taskset 以及 Timer 等的一个抢占能力, ...
还有就是软中断与软中断自我抢占临界区访问时,也需要使用 spin_lock_bh 以上的中断锁,因为有可能软中断在执行的过程中,自己被硬件中断打断,然后又执行到同样的代码,在别的 CPU 执行还好说,毕竟软中断可以在不同的 CPU 上执行同一个中断函数,但是假设不幸运行在同一个 CPU 上,则会导致死锁。Taskset 由于在运行...
spin_lock_bh()中首先会调用local_bh_disable()禁止当前CPU的软件中断。而函数spin_unlock_bh()则调用local_bh_enable()来势能本地CPU的软件中断。在软件中断被禁止的时候,本地CPU的所有软中断都不会被执行。如果一个softirq 与 用户上下文共享数据,就有两个问题:首先,当前的用户上下文可能被...
spin_trylock_irq(lock) //该宏类似于spin_trylock_irqsave,只是该宏不保存标志寄存器。如果该宏获得自旋锁lock,需要使用spin_unlock_irq来释放。 spin_trylock_bh(lock) // 该宏如果获得了自旋锁,它也将失效本地软中断。如果得不到锁,它什么//也不做。因此,如果得到了锁,它等同于spin_lock_bh,如果得 不...
其实变种还不止这几个,还有read_lock_xxx/write_lock_xxx、spin_lock_bh/spin_unlock_bh、spin_trylock_xxx等等。但常用的就上面几种。 3. raw_spin_lock 在2.6.33之后的版本,内核加入了raw_spin_lock系列,使用方法和spin_lock系列一模一样,只是参数有spinlock_t变为了raw_spinlock_t。而且在内核的主线版本...