[Linux] [Kernelmodul] Erstellen Sie kthread im Kernelmodul

Hinweise zum Erstellen von kthreads in einem Kernelmodul

Im Folgenden erfahren Sie, wie Sie ein ladbares Kernelmodul erstellen und erstellen. [Linux] [Kernelmodul] Erstellen und Laden eines einfachen ladbaren Kernelmoduls - Qiita

Quelle

testmod.c


#include <linux/module.h>
#include <linux/sched.h>
#include <linux/kthread.h>

MODULE_LICENSE("MIT");

struct task_struct *k;

static void kthread_main(void)
{
	schedule();
}

static int kthread_func(void* arg)
{
	printk(KERN_INFO "[%s] start kthread\n", k->comm);

	while (!kthread_should_stop()) {
		kthread_main();
	}

	printk(KERN_INFO "[%s] stop kthread\n", k->comm);

	return 0;
}

static int __init testmod_init(void)
{
	printk(KERN_INFO "driver loaded\n");

	k = kthread_run(kthread_func, NULL, "testmod kthread");

	return 0;
}

static void __exit testmod_exit(void)
{
	kthread_stop(k);
	printk(KERN_INFO "driver unloaded\n");
}

module_init(testmod_init);
module_exit(testmod_exit);

Grundablauf

Maine

Das Makro kthread_run (3, ...) sieht folgendermaßen aus:

kthread_run


#define kthread_run(threadfn, data, namefmt, ...)                          \
({                                                                         \
       struct task_struct *__k                                            \
               = kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \
       if (!IS_ERR(__k))                                                  \
               wake_up_process(__k);                                      \
       __k;                                                               \
})

Nach dem Ausführen von "kthread_create (3, ...)" wird "wake_up_process (1)" ausgeführt. Für namefmt können Sie Formatbezeichner wie printf verwenden und Thread-Namen mithilfe von Variablen festlegen.

kthread Seite

TODO: Untersuchen Sie das Verhalten von sched ()

Ausführungsbeispiel

Ausführungsbeispiel


$ sudo insmod testmod.ko
$ ps aux | head -1 && ps auwx | grep "\[testmod kthread\]"
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     28716 84.8  0.0      0     0 ?        R    23:14  16:07 [testmod kthread]
$ sudo rmmod testmod.ko
$ dmesg | tail
[187744.330108] driver loaded
[187744.330326] [testmod kthread] start kthread
[187812.178718] [testmod kthread] stop kthread
[187812.178743] driver unloaded

Es wurde bestätigt, dass der Thread im Kernelmodul gestartet und beendet wurde. Ich konnte auch den mit dem Befehl ps erstellten Thread überprüfen.

Beziehung

[Linux] [Kernelmodul] Erstellen und Laden eines einfachen ladbaren Kernelmoduls - Qiita [Linux] [Kernelmodul] Übergeben von Parametern als Argumente beim Laden eines ladbaren Kernelmoduls --Qiita [[Linux] [Kernelmodul] Geben Sie die Ausführungs-CPU von kthread --Qiita an / begrenzen Sie sie (http://qiita.com/koara-local/items/a912155d4a423e8f9588).

Referenz

Implementieren von Schleifen und Stoppen von Kernel-Threads in einem Kernel-Modul - die Zukunft von Mensch und Web kthread_run-Makro - Linux-Memorandum ... (Zum Inhaltsverzeichnis) [PDF] kthreads

Recommended Posts

[Linux] [Kernelmodul] Erstellen Sie kthread im Kernelmodul
[Linux] [Kernelmodul] Geben Sie die Ausführungs-CPU von kthread an / begrenzen Sie sie
Erstellen Sie Ihre eigenen Linux-Befehle in Python
Linux-Berechtigungen für Java
Informationen zu Linux-Kernelparametern
Erstellen Sie ein Python-Modul
Linux Kernel Release 5.x (2/4)
[Linux] [Kernelmodul] Erstellen und laden Sie ein einfaches ladbares Kernelmodul
Erstellen Sie Spatia Lite in Python
Erstellen Sie Amazon Linux mit AWS EC2 und melden Sie sich an
Überprüfen Sie die Linux-Kernelversion
Linux Kernel Release 5.x (3/4)
Seurat unter Linux (Installation)
Linux Kernel Release 5.x (4/4)
Linux Kernel Release 5.x (1/4)
So erhalten Sie den Anweisungszeiger (= Programmzähler) im Linux-Kernel
Datenstrukturen vom Listentyp und ihre Operationen im Linux-Kernel
Erstellen Sie eine Funktion in Python
Erstellen Sie ein Wörterbuch in Python
Selbst erstellter Linux-Kernel mit Clang
SSH-Einschränkungen in der Linux-Umgebung
Schätzung der Kerneldichte in Python
Linux: Erstellen Sie den ursprünglichen Terminal-Befehl
Linux: DNS-Ersatz in systemd.
Führen Sie Amazon Linux 2 in VirtualBox aus
[LINUX-Kernel neu erstellen] Upgrade (4.18.0 → 5.8.8)
Bis verschiedene Krypto-Implementierungen im Linux Kernel for ARM aufgerufen werden
Erwägen Sie, die Effizienz der Implementierung von crypt / xor.c im Linux-Kernel von risc-v zu verbessern (nur Diskussion).