使用内核模块锁定系统调用

时间:2015-06-27 17:14:26

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

我已经替换了系统调用表中的sys_open系统调用来实现计数系统。我必须使用什么锁? spin_lock_irqsave()函数冻结系统。我在Linux 3.16.0-4-686-pae上使用英特尔酷睿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);
}

2 个答案:

答案 0 :(得分:1)

你正在做什么?什么是'理货'系统?你怎么断定spin_lock_irqsave线造成了麻烦?

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

无论如何,代码不应该造成麻烦,所以其他东西出错了。在内核配置中启用调试工具并可能获得一个vmcore(读取有关kdump)可以在这里设置光。

答案 1 :(得分:0)

这不会直接解决您的锁定问题,正如其他人在您的问题的评论中所述,代码看起来很好。但作为替代方案,您可以使用atomic_t类型作为计数器并一起避免螺旋锁。有点像:

atomic_t tally = ATOMIC_INIT(0);

然后增加值的使用:

atomic_inc(&tally);

最后,当您想要最终读取值

时,可以使用atomic_read(&tally)

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