c - 使用 proc 文件系统将信息从 LKM 写入用户空间

标签 c linux struct linux-kernel

我正在尝试使用 proc 文件系统将数据从 linux 内核模块函数写入用户空间。我想使用 seq_file 迭代实现,以便它处理页面大小和所有有用的东西。我有一个函数,它不断地记录数据并创建一个结构并用数据填充该结构。我想将这些结构泵送到 proc 文件系统,以便用户空间中的应用程序可以获取这些结构并适本地处理它们。当用户空间准备好接收数据时,它将从 proc 文件系统读取数据,这将启动所有这些。我在想我不能将结构传递给 seq_file show 函数。那么我可以全局声明结构并将其从 seq_show 函数打印到 /proc/info 文件吗?下面是我目前正在尝试实现的。

  typedef struct data_t{
    unint32_t address;
    unint8_t pid;
    unint8_t info;
  } data_t;

  data_t data = NULL;

  static void datalog(uint32_t addy, unint8_t info){
   // this function is constantly logging data
   data->address = addy;
   data->info = info;
  }

  static void *seq_start(struct seq_file *s, loff_t *pos)
  {
     // seq file start stuff
  }

  static int seq_show(struct seq_file *s, void *v)
  {
   //print the data struct to the /proc/info file
   return 0;
   }

   static void *seq_next(struct seq_file *s, void *v, loff_t *pos)
   {
   // move the pointer along
   return v;
   }

   static void seq_stop(struct seq_file *s, void *v)
   {

   }

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

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

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

 static int init(void)
 {
 struct proc_dir_entry *entry = NULL;
 entry = proc_create("info", 0777, NULL, &fops);
 data = (data_t *) kmalloc(sizeof(data_t), GFP_KERNEL);
 return 0;
 }

所以datalog函数已经在一个常量循环中了。我想将所有这些结构抽取到 /proc/info 文件中,以便它们可以在用户空间中得到适当的处理。这将是速射数据,因此感觉 copy_to_user 不是可行的方法。如您所见,我不确定自己在做什么,因此非常感谢任何指导或帮助!谢谢!

最佳答案

假设您正在维护一个 struct data 数组,并且 count 是此类结构的编号。以下函数应该可以帮助您从用户空间读取结构。下面的代码假定日志缓冲区或数组在您读取时没有被修改(这是一个简单的例子)。您可以修改以下内容以满足您的需要。确保同步您的数据结构,例如日志缓冲区,以确保您读取的内容与当前的内容一致。

是的!您可以使用全局声明结构并在 seq_show 中使用它。

static void *seq_start(struct seq_file *s, loff_t *pos)
{
    if (*pos > count)
        return NULL;
    return pos;
}

static int seq_show(struct seq_file *s, void *v)
{
    loff_t *pos = (loff_t *)v;

    if (*pos == 0) {
        seq_printk(s, "Address\t\t\tPID\tInfo\n");
    }
    seq_printk(s, "0x%p\t%u\t%u\n", drv_data[*pos].address, drv_data[*pos].pid,
                     drv_data[*pos].info);
    return 0;
}

static void *seq_next(struct seq_file *s, void *v, loff_t *pos)
{
    (*pos)++;
    if (*pos >= count)
        return NULL;
    return pos;
}

关于c - 使用 proc 文件系统将信息从 LKM 写入用户空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25130028/

相关文章:

实时服务器上的 Linux apache/etc/hosts 设置

function - 结构嵌入、函数输入、多态性

c++ - C++将结构传递给函数以访问嵌套结构

试用软件的编码

c - 程序执行停止在 scanf?

谁能用写模式解释我的 popen()

C - 通过管道发送结构数组

c - 循环中的阻塞函数

c++ - linux + Visual Studio 2013 + VisualGDB, undefined reference 'dlopen'

linux - 监听端口上的选择性多播组