使用内核模块锁定内部系统调用
locking inside system calls using kernel modules
我在系统调用table中替换了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);
}
这不会直接解决您的锁定问题,正如其他人在您问题的评论中所说,代码看起来不错。但作为替代方案,您可以使用 atomic_t
类型作为计数器并避免自旋锁。大致如下:
atomic_t tally = ATOMIC_INIT(0);
然后增加值使用:
atomic_inc(&tally);
终于可以使用atomic_read(&tally)
当你想最终读取值
您可以阅读有关原子的更多信息 here。
你在做什么?什么是 'tallying' 系统?您如何断定 spin_lock_irqsave 行导致了问题?
首先,在系统调用入口点中断被启用,所以这应该是 spin_lock_irq。但是这段代码没有理由关心禁用中断,所以这应该是 spin_lock。除了你只是增加一个计数器,这可以用原子操作来完成,因此不需要锁定。
无论如何,代码不应该造成问题,所以其他地方出了问题。在内核配置中启用调试功能并可能获得 vmcore(阅读有关 kdump 的信息)可以在此处安排灯光。
我在系统调用table中替换了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);
}
这不会直接解决您的锁定问题,正如其他人在您问题的评论中所说,代码看起来不错。但作为替代方案,您可以使用 atomic_t
类型作为计数器并避免自旋锁。大致如下:
atomic_t tally = ATOMIC_INIT(0);
然后增加值使用:
atomic_inc(&tally);
终于可以使用atomic_read(&tally)
当你想最终读取值
您可以阅读有关原子的更多信息 here。
你在做什么?什么是 'tallying' 系统?您如何断定 spin_lock_irqsave 行导致了问题?
首先,在系统调用入口点中断被启用,所以这应该是 spin_lock_irq。但是这段代码没有理由关心禁用中断,所以这应该是 spin_lock。除了你只是增加一个计数器,这可以用原子操作来完成,因此不需要锁定。
无论如何,代码不应该造成问题,所以其他地方出了问题。在内核配置中启用调试功能并可能获得 vmcore(阅读有关 kdump 的信息)可以在此处安排灯光。