【问题标题】:Writing information from a LKM to userspace using the proc file system使用 proc 文件系统将信息从 LKM 写入用户空间
【发布时间】:2014-08-05 01:43:24
【问题描述】:

我正在尝试使用 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 不是要走的路。如您所见,我不确定我在做什么,因此非常感谢任何方向或帮助!谢谢!

【问题讨论】:

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

标签: c linux struct linux-kernel


【解决方案1】:

假设您正在维护一个 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;
}

【讨论】:

    猜你喜欢
    • 2017-11-07
    • 1970-01-01
    • 2011-03-21
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多