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.