C Linux内核:为什么对kstrtol的调用会崩溃?
我正在学习内核编程,并对kstrtol进行了一个简单的调用,我正在使用它将字符串转换为数字。然而,每次我编译这个模块并使用insmod将其放入内核时,我都会得到“BUG:无法在f862b026处理内核分页请求”,然后是一个寄存器和堆栈转储 我遵循这里的定义:。这似乎是一个非常简单的电话。我做错了什么C Linux内核:为什么对kstrtol的调用会崩溃?,c,linux,linux-kernel,C,Linux,Linux Kernel,我正在学习内核编程,并对kstrtol进行了一个简单的调用,我正在使用它将字符串转换为数字。然而,每次我编译这个模块并使用insmod将其放入内核时,我都会得到“BUG:无法在f862b026处理内核分页请求”,然后是一个寄存器和堆栈转储 我遵循这里的定义:。这似乎是一个非常简单的电话。我做错了什么 #include <linux/kernel.h> static int __init convert(void) { long myLong; char *myNum
#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);
#包括
静态int\uu init转换(void)
{
龙迈龙;
char*myNumber=“342”;
myNumber[2]='\0';//覆盖'2',以便我确定我有一个终止'\0'
if(kstrtol(myNumber、10和myLong)==0)
{
printk(“我们有一个号码!\n”);
}
返回0;
}
静态无效\uuu退出转换\u退出(无效)
{
printk(“模块已卸载\n”);
}
模块_init(转换);
模块退出(转换退出);
您不能修改字符串文本。首先将其复制到数组中
编辑:改用这个
char mystr[] = "abdc";
编辑2:
其根本原因是,指向字符串文字的char指针指向数据段,通常为只读。如果你改变这个记忆,你可能会崩溃。
当您创建一个字符数组时,字符串文字会被复制到堆栈上的数组中,您可以在那里安全地修改它。问题可能在于覆盖2。文本不应该被修改,问题是我需要对字符串使用字符指针,因为最终我需要解析进入模块的参数输入。我将一个字符串(格式如:120;某物)拆分为数字和单词。因此,我将数字存储在char*中。在这种情况下如何处理?
char*mystr[]=“abcde”;char*myptr=mystr
数组在几乎任何情况下都会衰减为指针,因此它应该是兼容的。@H2CO3,因为我使用参数,例如param=“1234;something”,并将其拆分为两个新字符串(分配内存后)strncpy(number,param,0,5)(类似于“something”部分)number[5]='\0';kstrtol(数字、10和结果)——其中结果是长的。这是一个糟糕的方法吗?如果是,正确的方法是什么approach@Maxthecat这是一个不错的方法。但是你正在处理一个数组。你不是吗?