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

使用proc文件系统将信息从LKM写入用户空间,c,linux,struct,linux-kernel,C,Linux,Struct,Linux Kernel,我正在尝试使用proc文件系统从linux内核模块函数向用户空间写入数据。我想使用seq_文件iteration实现,这样它可以处理页面大小和所有好的东西。我有一个不断记录数据、创建结构并用数据填充结构的函数。我想将这些结构注入proc文件系统,以便用户空间中的应用程序可以获取这些结构并适当地处理它们。当用户空间准备好接收数据时,它将从proc文件系统中读取数据,这将启动所有这一切。我想我无法将结构传递到seq\u file show函数中。因此,我可以全局声明结构并从seq\u show函数将

我正在尝试使用
proc
文件系统从linux内核模块函数向用户空间写入数据。我想使用
seq_文件
iteration实现,这样它可以处理页面大小和所有好的东西。我有一个不断记录数据、创建结构并用数据填充结构的函数。我想将这些结构注入
proc
文件系统,以便用户空间中的应用程序可以获取这些结构并适当地处理它们。当用户空间准备好接收数据时,它将从proc文件系统中读取数据,这将启动所有这一切。我想我无法将结构传递到
seq\u file show
函数中。因此,我可以全局声明结构并从
seq\u 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
文件中,以便在用户空间中适当地处理它们。这将是快速射击数据,因此感觉不到将复制到用户是一种方法。正如你所看到的,我不确定我在做什么,所以非常感谢任何指导或帮助!谢谢

假设您正在维护一个
struct数据数组
,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;
}

procfs
用于很少访问的文本数据。你为什么要用它?我的朋友,我想用它来获取从内核空间到用户空间应用程序的日志信息。谢谢有关日志记录的更多信息将非常有用。你在哪里登录?是否维护包含数据结构的日志缓冲区?另外,您想在读取proc文件时查看所有日志信息还是只查看未读信息?谢谢您的帮助!我正在记录一个特定进程的信息,如EIP、寄存器等。您可以想象它正在快速变化,我想将此信息转储到proc文件系统,以便我的用户空间应用程序可以处理它。我只想要未读的信息。