c-使用内核模块锁定系统内部调用



我已经替换了系统调用表中的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 timesn", tally);
    return old_sys_open(filename, flags, mode);
}

你在做什么?什么是"理货"系统?您是如何得出spin_lock_irqsave行造成麻烦的结论的?

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

不管怎样,代码不应该造成麻烦,所以出现了其他问题。在内核配置中启用调试功能,并可能获得vmcore(阅读关于kdump的内容),可以在这里轻松调度。

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

atomic_t tally = ATOMIC_INIT(0);

然后增加值使用:

atomic_inc(&tally);

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

你可以在这里阅读更多关于原子能的信息。

最新更新