реализовать список операций чтения в debugfs

Я реализую модуль ядра. используя несколько методов. 1 из них – давать чтение / запись различным переменным модуля. Я смог читать / записывать все переменные, кроме списка, который у меня есть в моем модуле. связанный список:

static struct node { struct list_head list; unsigned int x; struct tm time; }; 

я хотел бы иметь соответствующий файл в debugfs, который будет печатать полный список. Я пробовал все «простые» функции чтения, но никто из них не работает. 🙁

Вы можете прочитать список, используя функцию, аналогичную этой:

 struct k_list { struct list_head links; int data; }; struct k_list my_list; static ssize_t pop_queue(struct file * file, char *buf, size_t count, loff_t *ppos) { struct list_head *pos, *q; struct k_list *tmp; printk(KERN_INFO "--Listing inserted numbers--"); list_for_each_safe(pos, q, &my_list.links) { tmp = list_entry(pos, struct k_list, links); printk(KERN_INFO "object: %d ", tmp->data); } printk(KERN_INFO "--End of list--"); return count; } 

Ядро Linux предоставляет интерфейс seq_file для простого выполнения файлов, представленных перечислением вещей, например списками.

Все, что вам нужно, – предоставить до 4 функций, которые инкапсулируют перечисление:

 // Assume this is the head of your list. static struct my_list; // Start iteration static void *my_start (struct seq_file *m, loff_t *pos) { // Use ready-made helper for lists. return seq_list_start(&my_list, *pos); } // Next iteration static void * my_next(struct seq_file *m, void *v, loff_t *pos) { // Use ready-made helper for lists. return seq_list_next(v, &my_list, pos); } // Output on single iteration static int my_show (struct seq_file *m, void *v) { // Get original structure struct node* node = list_entry(v, struct node, list); // Eg, print content of 'x' field seq_printf(m, "%u,", node->x); return 0; // Success } static struct seq_operations my_seq_ops = { .start = &my_start, .stop = NULL, // Not needed in this case .next = &my_next, .show = &my_show }; 

Структура с этими функциями должна быть передана seq_open() при открытии файла:

 static int my_open(struct inode* inode, struct file* filp) { return seq_open(filp, &my_seq_ops); } 

И используйте seq_read как .read функцию в файловых операциях:

 static struct file_operations my_file_ops = { .open = &my_open, .read = &seq_read, }; 

Обратите внимание, что запись в такой файл вы должны реализовать вручную , seq_lock не помогает с этим.