Linux内核:为什么这会调用kstrtol崩溃?

时间:2013-10-04 16:19:00

标签: c linux linux-kernel

我正在学习内核编程并对kstrtol进行简单调用我正在使用将字符串转换为数字。但是,每次我编译这个模块并使用insmod将它放在内核中时,我得到“BUG:无法在f862b026处理内核分页请求”,然后是寄存器和堆栈转储。

我正在遵循此处的定义:https://www.kernel.org/doc/htmldocs/kernel-api/API-kstrtol.html。这似乎是一个非常简单的电话。我在这做错了什么?

#include <linux/kernel.h>

static int __init convert(void)
{
    long myLong;
    char *myNumber = "342";
    myNumber[2] = '\0'; //Overwriting the '2', just so I know for sure I have a terminating '\0'

    if (kstrtol(myNumber, 10, &myLong) == 0)
    {
        printk("We have a number!\n");
    }
return 0;
}

static void __exit convert_exit(void)
{
    printk("Module unloaded\n");
}

module_init(convert);
module_exit(convert_exit); 

1 个答案:

答案 0 :(得分:3)

您无法修改字符串文字。首先将其复制到数组中。

编辑:改用

char mystr[] = "abdc";

EDIT2: 其根本原因是,指向字符串文字的字符指针指向数据段,通常是只读。如果你改变了这个记忆,你可能会崩溃。 当你创建一个chars数组时,字符串文字被复制到堆栈中的数组中,你可以安全地修改它。