【问题标题】:Weird behavior of custom file open function on overriding sys_call_table in Linux KernelLinux内核中覆盖sys_call_table时自定义文件打开函数的奇怪行为
【发布时间】:2015-05-31 18:06:26
【问题描述】:

为了了解 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. 将参数传递给原始文件打开系统调用时我做错了吗?

请帮助我理解这一点。

【问题讨论】:

    标签: c linux filesystems kernel system-calls


    【解决方案1】:

    在这里,您尝试将在内核空间中分配的内存传递给系统调用,而系统调用需要在用户空间中分配的内存。我不知道如何从内核空间分配用户空间中的内存,但我认为这个链接 (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);
    

    【讨论】:

      猜你喜欢
      • 2010-12-07
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      相关资源
      最近更新 更多