内核模块编程

我试图通过内核模块读取和写入一个proc文件
但是当我运行这个命令:

echo "hello" >> /proc/hello && cat /proc/hello

它不打印任何东西,当我通过文本编辑器打开文件。 我发现了这样的神秘符号

  ^@^@^@^@^@^@^@^@^@^@ 

任何帮助将不胜感激提前

 #include <linux/module.h> #include <linux/kernel.h> #include <linux/proc_fs.h> #include<linux/sched.h> #include <asm/uaccess.h> #include <linux/slab.h> int len,temp; char *msg; int read_proc(struct file *filp,char *buf,size_t count,loff_t *offp ){ if(count>temp){count=temp;} temp=temp-count; copy_to_user(buf,msg, count); if(count==0)temp=len; return count; } int write_proc(struct file *filp,const char *buf,size_t count,loff_t *offp){ copy_from_user(msg,buf,count); len=count; temp=len; return count; } struct file_operations proc_fops = { read: read_proc, write: write_proc }; void create_new_proc_entry(void){ proc_create("hello",0,NULL,&proc_fops); msg=kmalloc(GFP_KERNEL,10*sizeof(char)); } int proc_init (void){ create_new_proc_entry(); return 0; } void proc_cleanup(void){ remove_proc_entry("hello",NULL); } MODULE_LICENSE("GPL"); module_init(proc_init); module_exit(proc_cleanup); 

除了你的内核模块的其他问题(如边界检查)

这个

 msg=kmalloc(GFP_KERNEL,10*sizeof(char)); 

不得不

  msg=kmalloc(10*sizeof(char), GFP_KERNEL); 

随着你对kmalloc的调用,你可能试图分配太多或者不足够的字节,并拒绝你的kmalloc请求。

您应该始终检查kmalloc返回值是否一致: != NULL

你可以在slab.h中找到kmalloc:

 static __always_inline void *kmalloc(size_t size, gfp_t flags) { if (__builtin_constant_p(size)) { if (size > KMALLOC_MAX_CACHE_SIZE) return kmalloc_large(size, flags); #ifndef CONFIG_SLOB if (!(flags & GFP_DMA)) { int index = kmalloc_index(size); if (!index) return ZERO_SIZE_PTR; return kmem_cache_alloc_trace(kmalloc_caches[index], flags, size); } #endif } return __kmalloc(size, flags); }