【问题标题】:Creating entry in /proc from LKM从 LKM 在 /proc 中创建条目
【发布时间】:2013-07-29 19:25:38
【问题描述】:

我正在尝试在/proc 中创建一个条目,以便我可以控制我的内核模块。我想我得到了write 部分,但我不知道read 部分应该如何工作。

static char proc_data[1];

static ssize_t read_proc(struct file *file, char __user *buf, size_t count, loff_t *pos){
    int ret;
    if(pos > 0){
        ret = 0;
    }else{
        memcpy(buf, proc_data, 1);
        ret = 1;
    }
    return ret;
}

static ssize_t write_proc(struct file *file, const char __user *buf, size_t count, loff_t *pos){

    if(count > 2)
        return -EINVAL;

    if(copy_from_user(proc_data, buf, 1))
        return -EFAULT;

    if(strcmp("1", proc_data) == 0){
        //Do something
    }else if(strcmp("0", proc_data) == 0){
        //Undo something
    }

    return count;
}

如果我从 read_proc 返回 1,如果我在 /proc 中输入我的条目,它不会停止输出相同的值。如果我返回 0,它不会输出任何东西。所以我猜我应该第一次返回 1,然后返回 0,但我不知道如何。

【问题讨论】:

  • 也许你应该打印从你的第一次和后续调用中收到的参数......也许特别是偏移参数。它们不是 0 / 非零,因为您的代码似乎已经解决了吗?
  • @mah 我想过,但我看不到它们之间的任何关系,因为计数是 65535 并且它是空的。
  • 我希望您在所有情况下(无论调用者要求什么)都会收到相同的大小计数以提高块效率,并且随着来自同样打开。请记住,内核调用代价高昂,因此系统希望最大限度地减少它们,并将通过最大程度地减少调用次数的大缓冲区来实现。

标签: c linux-kernel kernel-module kernel


【解决方案1】:

.read.write回调中,通常需要在返回之前更新loff_t *pos。 如果您的模块已读取或写入 count 字节,则将 *pos 增加该数量。

此外,请注意,当.read 回调返回 0 时,它表示 EOF。如果它从不返回 0,那么当您 cat 文件时,系统将无限期地循环尝试“将文件读到底”。这就是为什么第一次返回 1 然后返回 0 起作用的原因。

【讨论】:

  • pos 在第一次调用我的回调时应该为 0,对吧?我得到一个非常随机且很大的负数(大约-131940446716000,给/取100000)。我在我的printk 中使用%lld and (long long int)pos,对吗?
  • @alexandernst,您打印的是pos 还是*pos?我多次犯过这样的错误。您所描述的看起来更像是一个指针,如果表示为有符号整数,内核中结构的地址就是这样的负数,至少在 x86 上是这样。我希望 *pos 在第一次回调时为 0。
  • 糟糕...我打印的是pos,而不是*pos!多么愚蠢的错误。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 2013-04-28
  • 2015-08-05
  • 1970-01-01
  • 2010-10-14
相关资源
最近更新 更多