内核模块编程
我试图通过内核模块读取和写入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);
}
链接地址: http://www.djcxy.com/p/91273.html
上一篇: Kernel Module Programming
下一篇: Run function exactly once for each row in a Pandas dataframe