行为或-EFAULT,Linux内核

时间:2016-04-15 19:40:51

标签: linux-kernel segmentation-fault

我正在运行一些测试用例,我知道这会导致我的程序(在内核空间中运行)返回-EFAULT。以下是返回错误的代码:

for (index = 0; index < size; index++){
        //copy_from_user checks to make sure input parameter is valid. Returns 0 on success
        if(copy_from_user(&currentArrayElement, &data[index], sizeof(long))) {
            printk("copy from user error \n");          
            return -EFAULT;
            printk("copy from user error: just returned efault");   
        } 
        else {
        //parameter is ok
        if (currentArrayElement < kernelStats.min)
            kernelStats.min = currentArrayElement;

        if (currentArrayElement > kernelStats.max)
            kernelStats.max = currentArrayElement;

        kernelStats.sum += currentArrayElement;     
        }
    }

    //print debugging info
    printk("Min: %ld Max: %ld Sum: %ld\n", kernelStats.min, kernelStats.max, kernelStats.sum);  

当触发第一个if块时,似乎正在返回EFAULT,因为“从用户错误中复制:刚返回的efault”不会打印。但是,不是完全退出该功能,而是打印底部的调试信息。它似乎打印是否有EFAULT。这是EFAULT的特质吗?或者我做错了什么?

1 个答案:

答案 0 :(得分:2)

(评论太长了。)

无论参数如何,

return都会按预期执行。

我敢打赌你不止一次调用这个函数。在您第一次看到copy from user error时,您第二次看到调试信息。

要测试这个理论,请在顶部添加一个额外的printk