[LINUX] Eine kleine Beispielnotiz von list_head

Annahme

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"

Ich weiß nicht, wie es funktioniert, also werde ich später darauf eingehen. Vorerst habe ich den Linux-Code gelesen und ihn nicht gut verstanden, daher habe ich nur den minimalen Arbeitscode notiert (keine Verarbeitung der Speicherfreigabe).

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.*

Lauf

# 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

Referenz

Verwendung der vom Linux-Kernel bereitgestellten Liste --mmitous Tagebuch http://d.hatena.ne.jp/mmitou/20120626/1340731801

Recommended Posts

Eine kleine Beispielnotiz von list_head
Ein einfaches Beispiel für pivot_table.
Ein kleines Memorandum von openpyxl
Eine kleine Notiz, die auf printf folgt
Nur eine Notiz
Schreiben Sie eine Notiz über die Python-Version von Python Virtualenv
[Hinweis] Beginn der Programmierung
Notieren Sie sich die Liste der grundlegenden Verwendungszwecke von Pandas
Ein Hinweis zu __call__
[Anmerkung] Inhalt der Form [0], Form [1], Form [2]
Ein Hinweis zum Unterprozess
Ein Hinweis zu mprotect (2)
Ein Hinweis zum Ausprobieren eines einfachen MCMC-Tutorials auf PyMC3
Hinweis zum Binden
Python Hinweis: Das Rätsel, einer Variablen eine Variable zuzuweisen
Hinweis zum Standardverhalten von collate_fn in PyTorch
[Hinweis] Import von Dateien in das übergeordnete Verzeichnis in Python
Hinweis zur Kernel-Kompilierung
Ein Hinweis zu KornShell (ksh)
[Hinweis] CADquery-Beispielcode
Ein Hinweis zur TensorFlow-Einführung
Beispiel für die Verwendung von Python Pickle
Eine kurze Zusammenfassung von Linux
Ein Memorandum zur Verwendung von eigen3
Ein Hinweis zu [Python] __debug__
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann