0

我正在编写一个内核函数 foo ,它以结构指针作为参数

void foo(struct struct1 *param)
{

    if(param!=NULL)
    {
        if(param->param1!=NULL)
        {
            if(param->param1->bool_value)
                Some code
        }
    }
    some code
}

该函数在进程上下文中运行。我在上述函数的这一行发生了崩溃。if(param->param1->bool_value). 这次崩溃是一次崩溃,并且再也没有发生过。

BADVA 地址指向用户空间地址。这个地址是param1->bool_value的地址吗?如果是这样,内核模式代码是否可以在不使用 copy_from_user 的情况下访问该地址以进行读取?

4

2 回答 2

2

param->param1可能未初始化或已被覆盖。

初始化struct1时,是否总是将其成员设置为 NULL?如果您不这样做,您的问题可能与使用未初始化的数据有关,并且处理起来相对简单。如果您总是初始化为 NULL,则其他一些代码可能已经覆盖了该成员;这将更难诊断。

于 2012-10-10T12:05:20.720 回答
1

您是否确保(使用锁)在测试和访问之间不会从您的下方修改结构?也许你可以使用

void foo(struct somestruct *const param)
{
    if (param) {
        struct otherstruct *const param1 = param->param1;

        if (param1 && param1->bool_value) {
            /* Do stuff */
        }
    }
}

请注意,C 为 指定短路逻辑&&,因此如果param1在最里面的测试中为 NULL,param1不会取消引用。

这种访问模式(没有最外层的if (param))在 Linux 内核中很常见。唯一需要注意的是,丢弃param1仍然必须受到某种锁的保护,以便在其他 CPU 仍在访问它时(通过缓存指针)它不会被释放。

于 2012-10-10T12:32:59.527 回答