在Linux内核中重写sys_call_table时自定义文件打开函数的奇怪行为

时间:2015-03-27 12:02:41

标签: c linux filesystems kernel system-calls

在我学习Linux内核的过程中,我编写了一个模块,它使用我的自定义(custom_sys_open)函数覆盖系统调用sys_open。我的custom_file_open的代码: -

#define CUSTOM_CHECK_FILE "/home/xxxx/Programming/kernel_module/custom.txt"
asmlinkage long custom_file_open(const char __user *fileName, int flags, umode_t mode)
{
    long retVal = 0;
    int len = strlen(fileName);
    if(strcmp(fileName+len-9,"check.txt")== 0){
       retVal= (*orig_file_open)(CUSTOM_CHECK_FILE, flag, mode);
    }
    return retVal;
}

它不起作用,retVal在这种情况下总是-14。 但是,如果我只是将CUSTOM_FILE_CHECK字符串复制到" fileName"它开始工作,如下面的代码: -

asmlinkage long custom_file_open(const char __user *fileName, int flags, umode_t mode)
{
    long retVal = 0;
    int len = strlen(fileName);
    if(strcmp(fileName+len-9,"check.txt")== 0){
       memcpy((void*)fileName, (void*)CUSTOM_CHECK_FILE, strlen(CUSTOM_CHECK_FILE));
       retVal = (*orig_file_open)(fileName, flag, mode);
    }
    return retVal;
}

它按预期工作。但我无法理解: -

  1. 以前的自定义文件打开功能有什么问题?
  2. 将参数传递给原始文件open syscall?
  3. 时,我做错了什么

    请帮助我理解这一点。

1 个答案:

答案 0 :(得分:2)

在这里,您尝试将内核空间中分配的内存传递给系统调用,而系统调用则需要在用户空间中分配内存。我不知道如何从内核空间分配用户空间中的内存,但我认为这个链接(Allocating memory for user space from kernel thread)对它有所了解。 还有另一种方法可以做到这一点,你要做的就是禁用内存地址有效性检查。为此,请尝试以下代码: -

mm_segment_t orig_fs = get_fs();
set_fs(KERNEL_DS);
retVal= (*orig_file_open)(CUSTOM_CHECK_FILE, flag, mode);
set_fs(orig_fs);