модуль ядра: чтение существующего файла pro c (proc_create) - PullRequest
0 голосов
/ 06 января 2020

Я абсолютный новичок ie на Linux ядре. Приносим искренние извинения, если на это был дан ответ. Я потратил много часов и не смог ее решить, поэтому решил спросить (читая также книгу драйверов Linux). Моя постановка проблемы: я хотел бы прочитать файл pro c (/ proc / pid / maps) в моем модуле ядра (еще несколько). На proc_create имеется множество примеров, которые создают файл, а затем записывают / читают его. Я просто хочу прочитать существующий файл pro c. Похоже, что все предыдущие опции устарели (read_pro c, create_proc_read_entry и т. Д.). Вариант, который я прочитал, это вызвать proc_pid_maps_operations из task_mmu. c. Это происходит, когда вызывается / proc / pid / maps? Это правильный подход? Или я могу абстрагировать его.

Фрагмент кода proc_create из различных учебных пособий находится здесь. В тот момент, когда я изменяю имя на существующий файл, insmod перестает работать.

        if (!proc_create( "testcpuinfo", // define ENTRY_NAME "hello_world"
                      0,             // permissions 0644 
                      NULL,          // proc directory
                      &fops))        // file_operations
    {
            printk("ERROR! proc_create\n");
            remove_proc_entry(ENTRY_NAME, NULL);
            return -ENOMEM;
    }

1 Ответ

0 голосов
/ 04 февраля 2020

Я задал этот вопрос, поскольку хотел отфильтровать / proc / pid / maps. Он имеет большое количество записей и влияет на производительность моей рабочей нагрузки. Спасибо @ 0andriy и @Tsyvarev за то, что они вели меня как новичка ie. Я включил код, который я должен фильтровать и создавать модифицированные карты. Я приложил фрагмент кода на случай, если он поможет новичку ie, как я, в создании их версии /proc/pid/maps.

  static int proc_show(struct seq_file *s, void *v) {
  struct task_struct *task;
  struct pid *pid_struct;
  struct mm_struct *mm;
  struct vm_area_struct *vma;
  unsigned long start, end;
  const char *region = NULL;

  // Look for task which PID was provided as parameter, falling back to current task if not found
  if(pid == 0) {
    printk(KERN_INFO "pages_activity: no pid argument provided, using current process instead\n");
    task = current;
  } else {
    pid_struct = find_get_pid(pid);
    if(pid_struct == NULL) {
      printk(KERN_INFO "pages_activity: process with pid %d not found, using current process instead\n", pid);
      task = current;
    } else {
      task = pid_task(pid_struct, PIDTYPE_PID);
    }
  }
  mm = task->mm;
  vma = mm->mmap;
...