Spis treści

13 - Lista

list.c

list.c
/* Przykład użycia generycznych funcji dostępnych w jądrze do stworzenia listy
   Dwie listy są tworzone przy ładowaniu modułu, trawersowane i usuwane przy jego
   wyładowywaniu */
#include <linux/kernel.h>
#include <linux/module.h>
 
/* Funkcje do obsługi list, proszę zwrócić uwagę, że nie ma odpowiadającego pliku
   *.c. Wszystkie operacje są makrami lub funkcjami inline. */
#include <linux/list.h>
 
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Marcin Bis");
MODULE_DESCRIPTION("List example");
 
/* Struktura zawierająca dane (val) */
struct my_data_struct {
  int val;
  struct list_head full_list;
  struct list_head odd_list;
};
 
/* Inicjujemy dwie listy */
LIST_HEAD(my_full_list);
LIST_HEAD(my_odd_list);
 
static int __init mod_list_init(void)
{
  int i;
  struct my_data_struct *obj;
 
  for (i = 1; i < 101; i++) {
    obj = (struct my_data_struct *)
            kmalloc(sizeof(struct my_data_struct), GFP_KERNEL);
    obj->val = i;
    /* Wszystkie elementy do listy my_full_list */
    list_add(&obj->full_list, &my_full_list);
    /* Elementy z wartościami nieparzystymu do listy my_odd_list */
    if (obj->val & 0x1) {
      list_add(&obj->odd_list, &my_odd_list);
    }
  }
  return 0;
}
module_init(mod_list_init);
 
static void __exit mod_list_exit(void)
{
  struct my_data_struct *my_obj;
  struct list_head *item, *tmp_pos;
 
  printk("Full list\n");
  list_for_each(item, &my_full_list) {
    my_obj = list_entry(item, struct my_data_struct, full_list);
    printk(KERN_INFO "%d\n", my_obj->val);
  }
 
  printk("Odd list\n");
  list_for_each_entry(my_obj, &my_odd_list, odd_list) {
    printk(KERN_INFO "%d\n", my_obj->val);
  }
 
  printk("Freeing list\n");
  list_for_each_safe(item, tmp_pos, &my_full_list) {
    struct my_data_struct *tmp;
    tmp = list_entry(item, struct my_data_struct, full_list);
    list_del(item);
    kfree(tmp);
  }
  return;
}
module_exit(mod_list_exit);

Makefile

Makefile
obj-m += list.o
 
all:
	make -C /lib/modules/$(shell uname -r)/build \
		SUBDIRS=$(shell pwd) modules
 
clean:
	make -C /lib/modules/$(shell uname -r)/build \
		SUBDIRS=$(shell pwd) clean
ostatnio zmienione: 2011/06/16 16:06