簡體   English   中英

在用戶空間應用程序中使用自旋鎖

[英]using spinlocks in user-space application

我正在嘗試創建一個具有結構的內核模塊,並且我想在用戶空間應用程序中使用相同的結構,並且此應用程序與給定模塊一起使用。

主要問題是這個結構包含一個名為spinlock_t type的變量。 在內核中用於鎖定但不知道如何在用戶空間應用程序中使用它。

struct new_struct
{
  ...some variable...
  spinlock_t u_lock;
};

有沒有辦法在用戶空間應用程序中使用自旋鎖。

或者是否存在可以在內核和用戶空間中使用的任何其他鎖定技術,以便如果用戶應用程序持有鎖,則內核模塊應該無法獲取它,反之亦然。

我知道這種結構在內存中,在內核和用戶進程之間共享。 如果沒有,您可以使用ifdef KERNEL在內核和用戶空間中使用不同的鎖定。

但是,如果它是共享的,則不能在其上使用spinglocks,因為不允許用戶空間阻止內核。

處理它的簡單方法是將所有信息都包含在內核中,並通過用戶空間代碼發出系統調用來訪問它。

另一種方法是使用無鎖數據結構(流行的是環形緩沖區)進行此通信。

內核自旋鎖不適用於用戶空間,因為如果使用_irqsave / _irqrestore,它將禁用搶占並禁用IRQ。 在用戶空間中甚至無法進行搶占或IRQ禁用。

我認為最好的嘗試是pthread_spinlock。

spinlooks是內核結構,不能在用戶空間中使用。 對於用戶空間,最好使用pthread互斥鎖等互斥鎖。

如果您希望相同的代碼也可以在用戶空間以及內核模式下工作,則需要使用ifdefs。 #ifdef KERNEL允許您選擇正在使用的類型。

您應該創建調用適當功能(spinlook或mutex)的包裝函數(可以是內聯函數)。 並根據ifdefs編譯實際的實現。

最好的方法是創建一個用於鎖定內核資源的IOCTL接口。 我假設您的內核模塊向用戶空間公開了一個char驅動程序接口。 從用戶空間進行的此IOCTL調用將在調用時設置並重置內核自旋鎖。 您還可以使用相同的接口來檢查資源是否被內核鎖定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM