3

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

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

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

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

或者是否有任何其他可以在内核和用户空间中使用的锁定技术,这样如果用户应用程序持有锁,内核模块应该无法获得它,反之亦然。

4

4 回答 4

8

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

pthread_spin_lock()我认为最好的尝试是。

于 2013-12-18T05:35:03.787 回答
4

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

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

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

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

于 2013-02-06T08:03:54.600 回答
1

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

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

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

于 2013-02-06T08:18:03.563 回答
0

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

于 2013-02-09T16:02:01.130 回答