【问题标题】:using spinlocks in user-space application在用户空间应用程序中使用自旋锁
【发布时间】:2013-02-06 07:42:27
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您是否尝试将此结构传递给 ioctl

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-05
          • 1970-01-01
          • 2020-02-02
          • 1970-01-01
          • 2018-04-18
          • 1970-01-01
          相关资源
          最近更新 更多