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

我正在学习内核编程,并有一个简单的调用kstrtol我正在使用将string转换为数字。 但是,每次我编译这个模块,并使用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); 

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

编辑:使用此代替

 char mystr[] = "abdc"; 

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