[英]Why does a shared memory (in ipc) not require context switching ? Is it a memory from kernel space that gets mapped to user space?
[英]Does context switching occurs when IOCTL is issued from user space while kernel module is holding a spin_lock without disabling interrupts?
我在內核模塊中有一個關鍵部分,它受spin_lock()
保護。 我已經使用spin_lock()
在不禁用 irq 或 softirqs 的情況下獲取鎖。 正如我們所知,IOCTL 是通過軟件中斷 128 (0x80) 進入內核的系統調用。 因此,如果在獲取spin_lock()
的臨界區中間時從用戶空間發出 IOCTL,是否會發生上下文切換? 如果在 IOCTL 的后端也使用相同的spin_lock()
會怎樣? 會導致死鎖嗎?
我已經使用 spin_lock() 在不禁用 irq 或 softirqs 的情況下獲取鎖
IRQ/SoftIRQ 與系統調用無關。 當受保護的數據結構可能在中斷上下文中使用時,需要禁用 IRQ 或 softIRQ 。 順便說一句,有一個特殊的spin_lock
-API,如spin_lock_bh()/spin_unlock_bh()
、 spin_lock_irq()
/ spin_unlock_irq()
等。您應該閱讀本指南。
會發生上下文切換嗎?
我沒有看到任何阻止它的東西(如果你的意思是系統調用上下文切換)。 當系統調用發生時,它在用戶上下文(進程上下文 - 例如引發系統調用的進程上下文)中進入內核模式(上下文切換),而不是中斷或軟中斷上下文。 因此,如果您的數據結構只能從用戶上下文中訪問 - 您應該為用戶上下文使用常規鎖定 API。
至於在持有自旋鎖時內核模式下的上下文切換 - 它不會發生,因為自旋鎖本身禁用了搶占:
static inline void __raw_spin_lock(raw_spinlock_t *lock)
{
preempt_disable();
spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock);
}
那么只有更高優先級的代碼可以搶占(IRQ、softIRQ),但是如果“更高優先級的代碼”不會嘗試獲取您持有的鎖,則無需擔心(從死鎖的角度來看)。
如果在 IOCTL 的后端也使用相同的 spin_lock() 會怎樣?
在您釋放鎖之前,它肯定會“旋轉”。
會導致死鎖嗎?
取決於您將如何使用它。
PS互斥體有什么問題?
另請閱讀:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.