我正在尝试创建一个具有结构和结构的内核模块。我想在用户空间应用程序中使用相同的结构,这个应用程序适用于给定的模块。
主要问题是此结构包含名为spinlock_t type
的变量。它在内核中用于锁定,但不知道如何在用户空间应用程序中使用它。
struct new_struct
{
...some variable...
spinlock_t u_lock;
};
有没有办法在用户空间应用程序中使用自旋锁。
还是有其他锁定技术可用于内核和用户空间,以便如果用户应用程序持有锁,则内核模块应该无法获取它,反之亦然。
答案 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调用将在调用时设置并重置内核自旋锁。您还可以使用相同的接口来检查资源是否被内核锁定。