-1

我正在学习内核编程,并且对 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); 
4

1 回答 1

3

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

编辑:改用这个

char mystr[] = "abdc";

edit2:其根本原因是,指向字符串文字的 char 指针指向数据段,通常是只读的。如果您更改此内存,您可能会崩溃。相反,当您创建一个字符数组时,字符串文字会被复制到堆栈上的数组中,您可以在其中安全地对其进行修改。

于 2013-10-04T16:21:15.473 回答