[Linux] [module du noyau] Créer kthread dans le module du noyau

Remarques sur la création de kthreads dans un module de noyau

Veuillez vous référer à ce qui suit pour savoir comment créer et construire un module de noyau chargeable. [Linux] [module de noyau] Construire et charger un module de noyau chargeable simple - Qiita

La source

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);

Flux de base

Principale

La macro kthread_run (3, ...) ressemble à ceci:

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;                                                               \
})

Après avoir exécuté kthread_create (3, ...), wake_up_process (1) est exécuté. Pour namefmt, vous pouvez utiliser des spécificateurs de format comme printf et définir des noms de threads à l'aide de variables.

côté kthread

TODO: Étudiez le comportement de schedule ()

Exemple d'exécution

Exemple d'exécution


$ 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

Il a été confirmé que le thread a été démarré et terminé dans le module du noyau. J'ai également pu vérifier le fil créé avec la commande ps,

Relation

[Linux] [module de noyau] Construire et charger un module de noyau chargeable simple - Qiita [Linux] [module noyau] Comment passer des paramètres comme arguments lors du chargement d'un module noyau chargeable --Qiita [Linux] [module noyau] Spécifier / limiter le CPU d'exécution de kthread --Qiita

référence

Implémentation de la boucle et de l'arrêt des threads du noyau dans un module du noyau - l'avenir des humains et du Web macro kthread_run - Mémorandum Linux ... (Vers la table des matières) [PDF] kthreads

Recommended Posts

[Linux] [module du noyau] Créer kthread dans le module du noyau
[Linux] [module du noyau] Spécifier / limiter le CPU d'exécution de kthread
Créez vos propres commandes Linux en Python
Autorisations Linux sur Java
À propos des paramètres du noyau Linux
Créer un module Python
Version du noyau Linux 5.x (2/4)
[Linux] [module de noyau] Construire et charger un module de noyau chargeable simple
Créer Spatia Lite en Python
Créez Amazon Linux avec AWS EC2 et connectez-vous
Vérifiez la version du noyau Linux
Version du noyau Linux 5.x (3/4)
Seurat sous Linux (installation)
Version du noyau Linux 5.x (4/4)
Version du noyau Linux 5.x (1/4)
Comment obtenir le pointeur d'instruction (= compteur de programme) dans le noyau Linux
Structures de données de type liste et leurs opérations dans le noyau Linux
Créer une fonction en Python
Créer un dictionnaire en Python
Noyau Linux auto-construit avec clang
Restrictions SSH dans l'environnement Linux
Estimation de la densité du noyau en Python
linux: créer la commande Terminal d'origine
Linux: remplacement DNS dans systemd.
Exécutez Amazon Linux 2 dans VirtualBox
[Reconstruction du noyau LINUX] Mise à jour (4.18.0 → 5.8.8)
Jusqu'à ce que diverses implémentations de cryptage dans Linux Kernel for ARM soient appelées
Envisagez d'améliorer l'efficacité de l'implémentation de crypt / xor.c dans le noyau Linux risc-v (discussion uniquement)