我正在学习内核编程,并且对 kstrtol 进行了简单的调用,我用它来将字符串转换为数字。然而,每次我编译这个模块并使用 insmod 将其放入内核时,我都会收到“BUG:无法处理 f862b026 处的内核分页请求”,然后是寄存器和堆栈转储。
我遵循这里的定义:https://www.kernel.org/doc/htmldocs/kernel-api/API-kstrtol.html 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);
您无法修改字符串文字。首先将其复制到数组中。
编辑:用这个代替
char mystr[] = "abdc";
编辑2:
其根本原因是,指向字符串文字的 char 指针指向数据段,通常是只读的。如果你改变这个内存,你可能会崩溃。
相反,当您创建字符数组时,字符串文字会被复制到堆栈上的数组中,您可以在其中安全地修改它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)