2013-02-06 33 views
2

我正在尝试创建一个具有结构的内核模块&我想在用户空间应用程序中使用相同的结构,并且此应用程序与给定模块一起工作。在用户空间应用程序中使用自旋锁

主要问题是这个结构中包含一个名为spinlock_t type的变量。它在内核中用于锁定,但不知道如何在用户空间应用程序中使用它。

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

有什么办法在用户空间应用程序中使用自旋锁。

或者是否有任何其他锁定技术可以在内核&用户空间中使用,以便如果锁由用户应用程序保存,则内核模块应该无法获取它,反之亦然。

+0

您是否试图将此结构传递给ioctl – doron

回答

4

我知道这个结构在内存中,它在内核和用户进程之间共享。如果没有,您可以使用ifdef KERNEL在内核和用户空间中使用不同的锁定。

但是,如果它是共享的,则不能在其上使用spinglocks,因为不允许用户空间阻塞内核。

处理该问题的简单方法是获取内核中的所有信息,并通过用户空间代码发出系统调用来访问它。

另一种方法是使用无锁数据结构(环形缓冲区很流行)进行此通信。

1

spinlooks是内核结构,不能在用户空间中使用。 对于用户空间来说,像pthread mutex这样的互斥锁是最好的选择。

如果您希望相同的代码也能在用户空间和内核模式下工作,则需要使用ifdefs。 #ifdef KERNEL将允许您选择,而您使用的键入。

您应该创建调用适当功能(spinlook或mutex)的包装函数(可以是内联函数)。并根据ifdefs编译实际的实现。

0

最好的办法是创建一个IOCTL接口来锁定你的内核资源。我假设你的内核模块向用户空间公开了一个字符驱动程序接口。来自用户空间的这个IOCTL调用将在调用时设置并重置内核螺旋锁。您也可以使用相同的接口来检查资源是否被内核锁定。

1

内核螺旋锁不适合用户空间,因为如果使用_irqsave/_irqrestore,它将禁用抢占和禁用IRQ。 在用户空间中甚至不可能抢占或禁用IRQ。

我认为最好的尝试是pthread_spinlock。