C 在用户空间应用程序中使用自旋锁
我试图创建一个具有结构的内核模块&我希望在用户空间应用程序中使用相同的结构,并且该应用程序与给定的模块一起工作 主要问题是此结构包含一个名为C 在用户空间应用程序中使用自旋锁,c,linux,linux-kernel,locking,linux-device-driver,C,Linux,Linux Kernel,Locking,Linux Device Driver,我试图创建一个具有结构的内核模块&我希望在用户空间应用程序中使用相同的结构,并且该应用程序与给定的模块一起工作 主要问题是此结构包含一个名为spinlock\u t type的变量。它在内核中用于锁定,但不知道如何在用户空间应用程序中使用它 struct new_struct { ...some variable... spinlock_t u_lock; }; 是否有任何方法可以在用户空间应用程序中使用旋转锁 struct new_struct { ...some variabl
spinlock\u t type
的变量。它在内核中用于锁定,但不知道如何在用户空间应用程序中使用它
struct new_struct
{
...some variable...
spinlock_t u_lock;
};
是否有任何方法可以在用户空间应用程序中使用旋转锁
struct new_struct
{
...some variable...
spinlock_t u_lock;
};
或者是否还有其他锁定技术可以在内核和用户空间中使用,这样,如果锁由用户应用程序持有,内核模块将无法获得锁,反之亦然。我知道此结构在内存中,由内核和用户进程共享。如果没有,您可以使用
ifdef KERNEL
在内核和用户空间中使用不同的锁定
但是如果它是共享的,就不能在它上面使用Spinglock,因为不允许用户空间阻塞内核
处理它的简单方法是将所有信息放在内核中,并让用户空间代码发出系统调用来访问它
另一种方法是使用无锁数据结构(环形缓冲区很流行)进行此通信。自旋外观是内核结构,不能在用户空间中使用。 对于用户空间,像pthread mutex这样的互斥是最好的方式 如果您希望相同的代码也在用户空间和内核模式下工作,那么需要使用ifdefs。
#ifdef内核
允许您在使用类型时进行选择
您应该创建包装函数(可以是内联函数),它调用适当的功能(spinlook或mutex)。实际的实现是根据ifdef编译的。最好的方法是创建一个IOCTL接口来锁定内核资源。我假设您的内核模块向用户空间公开了一个char驱动程序接口。来自用户空间的IOCTL调用将在调用时设置并重置内核自旋锁。您还可以使用相同的接口检查资源是否被内核锁定 内核自旋锁不适用于用户空间,因为如果使用_irqsave/_irqrestore,它将禁用抢占和IRQ。 抢占或IRQ禁用在用户空间中甚至是不可能的
我认为最好的尝试是pthread\u spinlock。是否尝试将此结构传递给ioctl