【问题标题】:locking inside system calls using kernel modules使用内核模块锁定内部系统调用
【发布时间】:2015-06-27 17:14:26
【问题描述】:

我已经替换了系统调用表中的 sys_open 系统调用来实现一个计数系统。我必须使用什么锁? spin_lock_irqsave() 函数冻结系统。我在 Linux 3.16.0-4-686-pae 上使用 Intel Core i3-4330。

部分但相关的代码:

static DEFINE_SPINLOCK(spin);
static int tally = 0;

static asmlinkage long my_sys_open(const char __user *filename, int flags, int mode)
{
    unsigned long fl;
    spin_lock_irqsave(&spin, fl); // system freeze

    tally++;

    spin_unlock_irqrestore(&spin, fl);

    printk("sys_open used %i times\n", tally);

    return old_sys_open(filename, flags, mode);
}

【问题讨论】:

  • 您没有使用“mutex_lock”的任何特殊原因? hep.by/gnu/kernel/kernel-locking/API-mutex-lock.html
  • 奇怪。你的代码看起来不错。你怎么知道spin_lock_irqsave 发生了冻结?如果您注释掉锁定代码,它不会冻结?有没有其他代码使用spin

标签: c linux linux-kernel kernel kernel-module


【解决方案1】:

你在做什么?什么是“计数”系统?你是如何断定 spin_lock_irqsave 行引起了麻烦的?

首先,在系统调用入口点中断被启用,所以这应该是 spin_lock_irq。但是这段代码有0个理由关心禁用中断,所以这应该是spin_lock。除了你只是增加一个计数器,这可以通过原子操作完成,因此不需要锁定。

不管怎样,代码不应该引起问题,所以其他地方出了问题。在内核配置中启用调试工具并可能获得一个 vmcore(阅读有关 kdump 的信息)可以在这里进行。

【讨论】:

    【解决方案2】:

    这不会直接解决您的锁定问题,正如其他人在您的问题评论中所说的那样,代码看起来不错。但作为替代方案,您可以使用 atomic_t 类型作为计数器并避免一起使用自旋锁。大致如下:

    atomic_t tally = ATOMIC_INIT(0);
    

    然后增加值使用:

    atomic_inc(&tally);
    

    当你想最终读取值时,你可以使用atomic_read(&tally)

    您可以阅读有关 atomic here 的更多信息。

    【讨论】:

      猜你喜欢
      • 2016-08-26
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      • 2016-07-20
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多