Pourquoi ne pouvons-nous pas utiliser les fonctions de la bibliothèque standard C dans le développement du kernel?

Je viens juste de commencer à apprendre le développement du kernel et j’ai un petit doute. Pourquoi ne pouvons-nous pas utiliser les fonctions c dans le développement du kernel après l’avoir lié à la bibliothèque c? Pourquoi est-ce que le kernel n’est jamais lié à la bibliothèque AC mais a sa propre implémentation de certaines fonctions standard comme printk() au lieu de printf() . Si le kernel est écrit en c et compilé à l’aide du compilateur ac, pourquoi ne pas utiliser la fonction standard de la bibliothèque c?

Parce que la bibliothèque GNU C que vous connaissez est implémentée pour le mode utilisateur, pas pour le mode kernel. Le kernel ne peut pas accéder à une API d’espace utilisateur (qui peut appeler un appel syscall au kernel Linux).

De la FAQ KernelNewbies

Puis-je utiliser les fonctions de bibliothèque dans le kernel?

Les bibliothèques système (telles que glibc, libreadline, libproplist, etc.) qui sont généralement disponibles pour les programmeurs en espace utilisateur ne sont pas disponibles pour les programmeurs du kernel. Lorsqu’un processus est en cours de chargement, le chargeur charge automatiquement les bibliothèques dépendantes dans l’espace d’adressage du processus. Aucun de ces mécanismes n’est disponible pour les programmeurs du kernel: oubliez les bibliothèques ISO C, les seules choses disponibles sont ce qui est déjà implémenté (et exporté) dans le kernel et ce que vous pouvez implémenter vous-même.

Notez qu’il est possible de “convertir” les bibliothèques pour qu’elles fonctionnent dans le kernel; cependant, ils ne vont pas bien, le processus est fastidieux et source d’erreurs, et il peut y avoir des problèmes importants avec la gestion de la stack (le kernel est limité à une petite quantité de stack, alors que les programmes utilisateur n’ont pas cette limitation) provoquant une corruption de mémoire aléatoire.

De nombreuses fonctions couramment demandées ont déjà été implémentées dans le kernel, parfois dans des versions “légères” qui ne sont pas aussi performantes que leurs homologues de l’espace utilisateur. Veillez à grep les en-têtes de toutes les fonctions que vous pourriez être en mesure d’utiliser avant d’écrire votre propre version à partir de zéro. Certains des plus couramment utilisés se trouvent dans include / linux / ssortingng.h.

Chaque fois que vous estimez avoir besoin d’une fonction de bibliothèque, vous devez considérer votre conception et vous demander si vous pouvez déplacer tout ou partie du code dans l’espace utilisateur.

Si vous devez utiliser des fonctions de la bibliothèque standard, vous devez implémenter cette fonctionnalité pour une raison simple: il n’y a pas de bibliothèque C standard.

La bibliothèque C est essentiellement implémentée sur le kernel Linux (ou sur le kernel d’un autre système d’exploitation).

Par exemple, la fonction mkdir (3) de la bibliothèque C n’est rien de plus qu’un wrapper pour l’appel système du kernel Linux mkdir (2).

http://linux.die.net/man/3/mkdir http://linux.die.net/man/2/mkdir