[LINUX] Un petit exemple de note de list_head

supposition

ubuntu# uname -a
Linux ubuntu 4.4.0-93-generic #116-Ubuntu SMP Fri Aug 11 21:17:51 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
ubuntu# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS"

Je ne sais pas comment cela fonctionne, alors j'y reviendrai plus tard. Pour le moment, j'ai lu le code Linux et je ne l'ai pas bien compris, donc j'ai pris note uniquement du code de travail minimum (pas de traitement de libération de mémoire).

code

kure.c


#include <linux/module.h>       /* MODULE, THIS_MODULE */
#include <linux/moduleparam.h>
#include <linux/kernel.h>       /* printk() */
#include <linux/errno.h>        /* error codes */
#include <linux/list.h>         /* list_*() */
#include <linux/slab.h>         /* kmalloc() */

MODULE_AUTHOR("kuredev");
MODULE_LICENSE("Dual BSD/GPL");

struct kurest
{
        int no;
        struct list_head list_head_;
};

struct kurest data1 = {
        .no = -1,
};

static int kure_init(void)
{
        printk(KERN_ALERT "Listtest init\n");
        struct kurest *data2, *data3;
        struct list_head *ptr;
        struct kurest *entry;
        INIT_LIST_HEAD(&data1.list_head_);

        data2 = kmalloc(sizeof(struct kurest), GFP_KERNEL);
        data2->no = 2;
        list_add(&data2->list_head_, &data1.list_head_);

        data3 = kmalloc(sizeof(struct kurest), GFP_KERNEL);
        data3->no = 3;
        list_add(&data3->list_head_, &data1.list_head_);

        list_for_each(ptr, &data1.list_head_){
                 entry = list_entry(ptr, struct kurest, list_head_);
                 printk("no: %d\n", entry->no);
        }

        return 0;
}


static void kure_exit(void)
{
        printk(KERN_ALERT "Listtest exit\n");
}

module_init(kure_init);
module_exit(kure_exit);

Makefile


KERNEL_DIR = /lib/modules/$(shell uname -r)/build
BUILD_DIR := $(shell pwd)
VERBOSE   := 0
obj-m := kure.o
all:
        make -C $(KERNEL_DIR) SUBDIRS=$(BUILD_DIR) KBUILD_VERBOSE=$(VERBOSE) modules
clean:
        rm -rf  *.o *.ko *.mod.c *.symvers *.order .tmp_versions .kure.*

Courir

# make
# insmod kure.ko
# tail /var/log/syslog
Sep 18 23:12:16 ubuntu kernel: [23064.945863] Listtest init
Sep 18 23:12:16 ubuntu kernel: [23064.945869] no: 3
Sep 18 23:12:16 ubuntu kernel: [23064.945870] no: 2
Sep 18 23:12:21 ubuntu kernel: [23069.543457] Listtest exit

référence

Comment utiliser la liste fournie par le noyau Linux - le journal de mmitou http://d.hatena.ne.jp/mmitou/20120626/1340731801

Recommended Posts

Un petit exemple de note de list_head
Un simple exemple de pivot_table.
Un petit mémorandum d'openpyxl
Une petite note qui suit printf
Juste une note
Écrire une note sur la version python de python virtualenv
[Note] Début de la programmation
Prenez note de la liste des utilisations de base de Pandas
Une note sur __call__
[Note] Contenu de la forme [0], forme [1], forme [2]
Une note sur le sous-processus
Une note sur mprotect (2)
Une note d'essayer un simple tutoriel MCMC sur PyMC3
note de montage de liaison
Note Python: Le mystère de l'attribution d'une variable à une variable
Remarque sur le comportement par défaut de collate_fn dans PyTorch
[Note] Importation de fichiers dans le répertoire parent en Python
Remarque sur la compilation du noyau
Une note sur KornShell (ksh)
[Remarque] Exemple de code CADquery
Une note sur TensorFlow Introduction
Exemple d'utilisation de pickle Python
Un bref résumé de Linux
Un mémorandum d'utilisation de eigen3
Une note sur [python] __debug__
[python] Une note que j'ai commencé à comprendre le comportement de matplotlib.pyplot