Linux 为什么这个代码工作得很好?更改常量存储区域字符串;

Linux 为什么这个代码工作得很好?更改常量存储区域字符串;,linux,module,kernel,constants,Linux,Module,Kernel,Constants,这是一个简单的linux内核模块代码,用于反转一个字符串,该字符串应该在insmod之后Oops,但它工作得很好,为什么 #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> static char *words = "words"; static int __init words_init(void) { printk(KERN_INFO "debug in

这是一个简单的linux内核模块代码,用于反转一个字符串,该字符串应该在insmod之后Oops,但它工作得很好,为什么

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static char *words = "words";
static int __init words_init(void)
{
  printk(KERN_INFO "debug info\n");
  int  len = strlen(words);
  int  k;
  for ( k = 0; k < len/2; k++ )
  {
     printk("the value of k %d\n",k);
     char  a = words[k];
     words[k]= words[len-1-k];
     words[len-1-k]=a;        
 }
 printk(KERN_INFO "words is %s\n", words);
 return 0;
}
static void __exit words_exit(void)
{
  printk(KERN_INFO "words exit.\n");
}
module_init(words_init);
module_exit(words_exit);
module_param(words, charp, S_IRUGO);
MODULE_LICENSE("GPL");
#包括
#包括
#包括
静态字符*words=“words”;
静态整数uuu init单词u init(void)
{
printk(内核信息“调试信息”);
int len=strlen(字);
int k;
对于(k=0;k
静态
!=<代码>常量

static
在您的示例中表示“仅在当前文件中可见”。看

const
仅表示“可以看到此声明的代码不应该更改变量”。但在某些情况下,仍然可以创建指向同一地址的非常量指针并修改内容

建议不可能写入字符串值

由于
static
是您的代码与问题代码之间的唯一区别,因此我进一步研究发现:


试试静态常量char*word,这应该可以解决问题。

静态
!=<代码>常量

static
在您的示例中表示“仅在当前文件中可见”。看

const
仅表示“可以看到此声明的代码不应该更改变量”。但在某些情况下,仍然可以创建指向同一地址的非常量指针并修改内容

建议不可能写入字符串值

由于
static
是您的代码与问题代码之间的唯一区别,因此我进一步研究发现:


试试静态常量char*word,应该可以了。

哈哈!,我自己从linux内核源代码中得到答案;当您使用insmod时,它将调用init_moude、load_module、strndup_usr和memdup_usr函数;memdup_usr函数将使用kmalloc_track_调用者从slab中分配内存,然后使用copy_from_usr将模块paragram复制到内核中;这意味着linux内核模块paragram存储在堆中,而不是在常量存储区中!!所以我们可以改变它的内容

哈哈!,我自己从linux内核源代码中得到答案;当您使用insmod时,它将调用init_moude、load_module、strndup_usr和memdup_usr函数;memdup_usr函数将使用kmalloc_track_调用者从slab中分配内存,然后使用copy_from_usr将模块paragram复制到内核中;这意味着linux内核模块paragram存储在堆中,而不是在常量存储区中!!所以我们可以改变它的内容

我的意思是“hello”这个词,在表达式中,“hello”存储在恒定的存储区域,我们不能改变它的内容;如果你用main在一个普通的c程序中编写单词_init函数,它会出现分段错误;但是为什么它在linux内核模块中工作得很好呢?您应该相信
“hello”
在文本段中。您是否通过查看汇编程序输入或转储目标文件的符号表来检查此问题?我是指表达式中的“hello”字存储在常量存储区域中,我们无法更改其内容;如果你用main在一个普通的c程序中编写单词_init函数,它会出现分段错误;但是为什么它在linux内核模块中工作得很好呢?您应该相信
“hello”
在文本段中。您是否通过查看汇编程序输入或转储目标文件的符号表来检查此问题?我是指表达式中的“hello”字存储在常量存储区域中,我们无法更改其内容;如果你用main在一个普通的c程序中编写单词_init函数,它会出现分段错误;但是为什么它在linux内核模块中工作得很好呢?您应该相信
“hello”
在文本段中。您是通过查看汇编程序输入还是通过转储对象文件的符号表来检查这一点的?