【问题标题】:Failed to get kernel data using copy_to_user not working with debugfs使用 copy_to_user 获取内核数据失败,无法使用 debugfs
【发布时间】:2020-07-15 08:21:51
【问题描述】:

我正在尝试实现简单的 debugfs 接口模块。附上代码供参考。要写入数据,我正在使用 echo 'string' > /sys/kernel/debug/debugexercise/text 并将其按预期工作,数据被复制到内核缓冲区中。 但是当我尝试使用 cat 命令检索数据时 即cat /sys/kernel/debug/debugexercise/text ,它不会在终端上打印任何数据。

我也尝试过使用 simple_read_from_buffer 而不是 copy_to_user 但得到了相同的结果。 任何人都知道这段代码有什么问题。 4.13.0-45-generic 是我系统上的内核版本。

#include <linux/module.h>
#include <linux/debugfs.h>
#include <linux/fs.h>
#include <linux/uaccess.h>

#define LEN 512 

static struct dentry *test_dir;
static struct dentry *test_file;

static char ker_buf[LEN] ;
/* read file operation */
static ssize_t test_read(struct file *fp, char __user *user_buffer, size_t count, loff_t *position){
    printk(KERN_NOTICE "debugfs_read called, count %d\n", count);
    return copy_to_user(user_buffer, ker_buf, LEN);

}

static ssize_t test_write(struct file *fp, const char __user *user_buffer, size_t count, loff_t *position){
    printk(KERN_NOTICE "debugfs_write called, count %d\n",count);
    if(count > LEN )
        return -EINVAL;

    copy_from_user(ker_buf, user_buffer, count);
    printk(KERN_NOTICE "write buffer complete: %s\n",ker_buf);
    return count;
}

static struct file_operations fops_debug = {
    .read = test_read,
    .write = test_write,
};

static int __init init_debug(void)
{
    test_dir = debugfs_create_dir("debugexercise", NULL);
    if(NULL == test_dir){
        printk(KERN_ERR "debugfs_create_dir() Failed\n");
        return -1;
    }
    else
        printk(KERN_NOTICE "debugexercise created\n");

    test_file = debugfs_create_file("text", 0644, test_dir, NULL, &fops_debug);
    if(NULL == test_file){
        printk(KERN_ERR "debugfs_create_file() Failed\n");
        debugfs_remove(test_dir);
        return -1;
    }
    else
        printk(KERN_NOTICE "text under debugexercise created\n");

    return 0;
}

static void __exit exit_debug(void)
{
    printk(KERN_NOTICE "removing module\n");
    debugfs_remove(test_file);
    debugfs_remove(test_dir);
}
module_init(init_debug)
module_exit(exit_debug)
MODULE_LICENSE("GPL");



【问题讨论】:

    标签: linux debugging kernel


    【解决方案1】:

    copy_to_user 返回无法复制的字节数。成功后,这将是零。因此,猫显示 0 个字符。我相信你应该这样做:

    if (copy_to_user(user_buffer, ker_buf, LEN)){
             printk(KERN_INFO "copy to user failed.\n");
             return -EINVAL; /* For instance ... */
    }
    
    return LEN;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      • 2021-01-03
      • 2013-01-17
      • 2014-12-16
      • 1970-01-01
      • 2023-02-11
      • 2016-05-27
      相关资源
      最近更新 更多