我已经替换了系统调用表中的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)
你可以在这里阅读更多关于原子能的信息。