内核模块编程

7
我正在尝试通过内核模块读写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);

1
只是一句话:你从msg中复制了一些东西,但是msg的大小为10个字符=>在write_proc中确保不允许count超过10,否则你将会有一个缓冲区溢出! - Garf365
是的,你说得对,我很感激。 - Master AN HA
2个回答

4
除了内核模块的其他问题(如边界检查),还存在一些问题。
这个。
msg=kmalloc(GFP_KERNEL,10*sizeof(char));

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

如果您调用kmalloc时分配的内存过多或不足,它将拒绝您的kmalloc请求。

您应始终检查kmalloc返回值的一致性:!= NULL


是的,你说得完全正确,非常感谢,并且很抱歉这个实现不够好。我只是一个内核编程方面的初学者,正在努力理解事物的工作原理。 - Master AN HA

0

你可以在 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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接