从create_proc_read_entry转到proc_create并使用seq_files

时间:2014-07-25 01:55:56

标签: c linux-kernel

我试图从已弃用的函数create_proc_read_entry转到使用proc_create。我一直在研究使用seq_files的新实现。以前我使用/proc文件系统将指针传递给I copy_from_user到内核空间的结构。这个结构中有信息(和其他数据),我用它来确定接下来调用的函数。我正在努力应对新的实施。具体来说,我如何获得指向从用户空间传递的结构的指针。根据我的研究,seq_files实现使用seq文件来方便地遍历结构,而不必处理指针内容。

struct sCmd_t {
    u32 length;
    u8 type;
    int number;
    u16 command;
    u8 version;
} sCmd_t

ctrl_file = create_proc_read_entry("ctrl",
                                   0666,
                                   PROC_FILE,
                                   read_proc_ctrl,
                                   NULL);

ctrl_file->write_proc = write_proc_ctrl;

static int write_proc_ctrl( struct file *filp, const char __user *buff, unsigned long len, void *data){

    sCmd_t *sCmd = NULL;
    const unsigned char *curbuf = NULL;

    sCmd = (sCmd_t *) kmalloc(sizeof(sCmd_t), GFP_KERNEL);

    if (sCmd == NULL)
          return ERROR;

    memset(cmd, 0, sizeof(sCmd));

    curbuf = buff;

    if (copy_from_user( cmd, curbuf, sizeof(sCmd_t)))
            return -EFAULT;

    switch (sCmd->command){
     //based on the command the appropriate
    }

所以我想要做的就是从seq_show函数中获取指向我的结构的指针,但它不起作用。

static int seq_show(struct seq_file *seqfile, void *v)
{
    //in here I'm trying to grab a pointer to the struct here
    sCmd_t *sCmd = NULL;
    const unsigned char *curbuf = NULL;

    sCmd = (sCmd_t *) kmalloc(sizeof(sCmd_t), GFP_KERNEL);

    if (sCmd == NULL)
          return ERROR;

    memset(cmd, 0, sizeof(sCmd));

    curbuf = v;

    if (copy_from_user( cmd, curbuf, sizeof(sCmd_t)))
//blah blah blah.....

    return 0;
}

static void *seq_start(struct seq_file *seqfile, loff_t *pos)
{
    return pos;
 }

static void *seq_next(struct seq_file *seqfile, void *v, loff_t *pos)
{
    return pos;
}

static void seq_stop(struct seq_file *seqfile, void *v)
{
   return;
}

static struct seq_operations seq_ops = {
    .start  = seq_start,
    .next   = seq_next,
    .stop   = seq_stop,
    .show   = seq_show
};

static int proc_open(struct inode *inode, struct file *file)
{
    return seq_open(file, &seq_ops);
}

static const struct file_operations fops = {
 .owner     = THIS_MODULE,
 .open      = proc_open,
 .read      = seq_read,
 .llseek    = seq_lseek,
 .release   = single_release,
 };

ctrl_file = proc_create("ctrl", 0644, proc_dir, &fops);

这只是第一次尝试。当我尝试这个代码时,它会解释当我解释结构的命令成员时。正如您所看到的,我的结构非常小,所以它并不像这个实现必须使用seq文件来检查它是否运行到另一个页面上。这就是为什么我试图抓住show函数中的指针,因为我认为它必须迭代或者#34; next"到结构或页面。从我读过的seq_file迭代中可以很容易地迭代结构但我首先需要了解如何从用户空间获取指向我写入/proc文件系统的指针。

1 个答案:

答案 0 :(得分:0)

seq_file是实现只读文件的助手。 show回调的缓冲区是一个内核缓冲区,您应该在其中写入要返回给用户空间的数据。

您可以选择是否使用seq_file;但这里没有意义。

但无论如何,procfs操作都是用struct file_operations定义的; 要实现写回调,只需在write中实现fops