在用户空间应用程序中使用自旋锁

时间:2013-02-06 07:42:28

标签: c linux linux-kernel locking linux-device-driver

我正在尝试创建一个具有结构和结构的内核模块。我想在用户空间应用程序中使用相同的结构,这个应用程序适用于给定的模块。

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

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

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

还是有其他锁定技术可用于内核和用户空间,以便如果用户应用程序持有锁,则内核模块应该无法获取它,反之亦然。

4 个答案:

答案 0 :(得分:4)

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

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

处理它的简单方法是在内核中包含所有信息,并让用户空间代码发出系统调用来访问它。

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

答案 1 :(得分:2)

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

我认为最好的尝试是pthread_spinlock。

答案 2 :(得分:1)

spinlooks是内核结构,不能在用户空间中使用。 对于用户空间,诸如pthread互斥锁之类的互斥锁是最好的方法。

如果您希望相同的代码也可以在用户空间以及内核模式下工作,则需要使用ifdefs。 #ifdef KERNEL将允许您在使用类型时进行选择。

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

答案 3 :(得分:0)

执行此操作的最佳方法是创建用于锁定内核资源的IOCTL接口。我假设您的内核模块向用户空间公开了一个char驱动程序接口。来自用户空间的此IOCTL调用将在调用时设置并重置内核自旋锁。您还可以使用相同的接口来检查资源是否被内核锁定。