Bibliothèques et fonctions utiles
Bibliothèques
À l’intérieur du noyau Linux on ne dispose pas des bibliothèques standard C. Par contre, le noyau fournit toute une série de bibliothèques et de fonctions fort utiles.
String dans <linux/string.h>
- Relié à la mémoire:
memset,memcpy,memmove,memscan,memcmp,memchr - Relié aux chaînes de caractères:
strcpy,strcat,strcmp,strchr,strrchr,strlenet d’autres variantes - Allocation et copie de blocs mémoire:
kmemdump - Allocation et copie de chaînes de caractères:
kstrdup,strrndup
Conversion de string dans <linux/kernel.h>
- Conversion de strings en entiers:
kstrtoul,kstrtol,kstrto* - Fonctions sur les chaînes de caractères:
sprintf,sscanf
Listes chaînées <linux/list.h> (simple doubly linked list)
- Très pratique et utilisées à des milliers d’endroits dans le noyau
- Ajouter un membre
struct list_headdans la structure des éléments participant à la liste chaînée. On le nommera généralementlistou parfoisnode. - Créer une liste : Si la liste est globale on utilisera la macro
LIST_HEAD, si la liste fait partie d’une structure on définira un élémentstruct list_headet on l’initialisera avec la macroINIT_LIST_HEAD - Pour manipuler les éléments de la liste chaînée, on pourra utiliser
- Ajouter des éléments:
list_add(),list_add_tail() - Supprimer, déplacer ou remplacer des éléments:
list_del(),list_move(),list_move_tail(),list_replace() - Tester la liste:
list_empty() - Itérer sur la liste:
list_for_each_*()de la famille des macros
- Ajouter des éléments:
- Il existe également des variantes sûres (safe) de ce méthodes
Exemple de liste chaînée
// definition of a list element with struct list_head as member
struct element {
// some members
struct list_head list;
};
// definition of the global list
static LIST_HEAD (my_list);
// allocate on element and add it at the tail of the list
void alloc_ele () {
struct element* ele;
// create a new element
ele = kzalloc(sizeof(*ele), GFP_KERNEL);
if (ele != NULL)
// add element at the end of the list
list_add_tail(&ele->list, &my_list);
}
// process all elements of the list
void process_all() {
struct element* ele;
// iterate over the whole list
list_for_each_entry(ele, &my_list, list) {
// do something with ele
}
}