Comment printk fonctionne-t-il exactement en interne?

10

Je sais qu'il a printfbesoin de l'aide du système d'exploitation pour faire son travail.

Je sais également que printfne fonctionne pas dans le code source Linux car il n'y a pas de bibliothèque. Et nous avons donc printkpour le débogage.

Comment ça printkmarche quand le système d'exploitation démarre encore?

gpuguy
la source

Réponses:

11

Cette référence semble avoir des réponses à vos questions, intitulées: Linux Kernel Development Second Edition .

extrait

printk ()

La fonction d'impression du noyau printk(), se comporte presque de manière identique à la printf()fonction de bibliothèque C. En effet, tout au long de ce livre, nous n'avons utilisé aucune différence réelle. Pour la plupart des intentions, c'est bien; printk()est simplement le nom de la fonction d'impression formatée du noyau. Il a cependant quelques différences.

La robustesse de printk ()

Une propriété printk()rapidement prise pour acquise est sa robustesse. La printk()fonction peut être appelée à peu près n'importe où dans le noyau à tout moment. Il peut être appelé à partir d'un contexte d'interruption ou de processus. Il peut être appelé alors qu'un verrou est maintenu. Il peut être appelé simultanément sur plusieurs processeurs, mais il ne nécessite pas que l'appelant détienne un verrou.

C'est une fonction résiliente. Ceci est important car l'utilité de printk()repose sur le fait qu'il est toujours là et fonctionne toujours.

La non-robustesse de printk ()

Il existe une faille dans l'armure de printk()la robustesse de. Il est inutilisable avant un certain point du processus de démarrage du noyau, avant l'initialisation de la console. En effet, si la console n'est pas initialisée, où la sortie est-elle censée aller?

Ce n'est normalement pas un problème, sauf si vous déboguez des problèmes très tôt dans le processus de démarrage (par exemple, dans setup_arch(), qui effectue une initialisation spécifique à l'architecture). Un tel débogage est un défi pour commencer, et l'absence de toute sorte de méthode d'impression ne fait qu'aggraver le problème.

Il y a de l'espoir, mais pas beaucoup. Les pirates d'architecture hardcore utilisent le matériel qui fonctionne (par exemple, un port série) pour communiquer avec le monde extérieur. Croyez-moi, ce n'est pas amusant pour la plupart des gens. Certaines architectures prises en charge implémentent une solution saine, mais d'autres (i386 inclus) ont des correctifs disponibles qui sauvent également la journée.

La solution est une printk()variante qui peut sortir à la console très tôt dans le processus de démarrage: early_printk(). Le comportement est le même que printk(), seul le nom et sa capacité à travailler plus tôt sont modifiés. Ce n'est cependant pas une solution portable, car toutes les architectures prises en charge n'ont pas une telle méthode implémentée. Il pourrait devenir votre meilleur ami, si c'est le cas.

À moins que vous n'ayez besoin d'écrire sur la console très tôt dans le processus de démarrage, vous pouvez printk()toujours compter pour travailler.

slm
la source
4

Comment fonctionne printK alors que le système d'exploitation démarre encore?

printk()va à la console si possible et la priorité est suffisamment élevée; Je ne sais pas à quel moment le noyau initialise un VT pour que cela soit possible, mais c'est évidemment assez tôt.

[src]/kernel/printk/printk.cest assez bien documenté. L'accès à la console semble être contrôlé via des sémaphores. Le message est également injecté /dev/dmsg, quelle que soit la priorité.

boucle d'or
la source