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

标签 c linux linux-kernel kernel kernel-module

我已经替换了系统调用表中的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);
}

最佳答案

你在做什么?什么是“计数”系统?您如何断定 spin_lock_irqsave 行导致了问题?

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

无论如何,代码不应该造成问题,所以其他地方出了问题。在内核配置中启用调试功能并可能获得 vmcore(阅读有关 kdump 的信息)可以在此处安排灯光。

关于c - 使用内核模块锁定内部系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31091367/

相关文章:

c - 尝试反转 char 数组时出错

c - 将字符串解析为单个单词

从 windows 和 mac 通过 ssh 编译和运行 C 程序 -- windows 出现 seg 错误

linux - bash 脚本。限制用户输入

linux-kernel - skb_reserve 注释说明

linux-kernel - SMP linux 内核中的障碍

c++ - 有没有生成 Makefile 的好工具?

java - 如何将 jchararray 作为参数发送给 C 函数

linux - Ubuntu新用户登录但username@不存在

linux - linux进程VSZ等于0是不是意味着内核空间申请?