web-dev-qa-db-fra.com

Pourquoi le noyau Linux n'a-t-il pas de fonctions optimisées telles que Glibc (par exemple, Memchr, Strchr)?

Lorsque j'essaie de mettre en œuvre la bibliothèque de cordes C moi-même, j'ai trouvé que Glibc et le noyau Linux ont une manière différente de mettre en œuvre certaines fonctions. Par exemple, GLIBC MEMCHR et GLIBC STRCHR Utilisez une astuce pour accélérer la fonction mais le memchr du noya et le noyau Strchr Pas. Pourquoi les fonctions de noyau Linux ne sont-elles optimisées comme GLIBC?

25
Windsooon

Le noyau a des versions optimales de certaines de ces fonctions, dans les répertoires spécifiques à la voûte; Voir par exemple la mise en oeuvre X86 de memchr (voir toutes les définitions memchr et tous les éléments strchr définitions ). Les versions que vous avez trouvées sont les versions génériques de secours; Vous pouvez les repérer en recherchant la vérification protectrice, #ifndef __HAVE_Arch_MEMCHR pour memchr et #ifndef __HAVE_Arch_STRCHR pour strchr.

Les versions optimisées de la bibliothèque C ont tendance à utiliser un code plus sophistiqué, de sorte que ce qui précède n'explique pas pourquoi le noyau ne va pas à une telle longueur pour aller vite. Si vous pouvez trouver des scénarios où le noyau bénéficierait d'une version plus optimisée de l'une de ces fonctions, j'imagine qu'un patch serait le bienvenu (avec des preuves justificatives appropriées, et tant que la fonction optimisée est toujours compréhensible - voir - Cette ancienne discussion concernant memcpy ). Mais je soupçonne que les utilisations du noyau de ces fonctions ne le rendront pas souvent. Par exemple, memcpy et les fonctions associées ont tendance à être utilisées sur de petits tampons dans le noyau. Et ne jamais escompter les gains de vitesse à partir d'une fonction courte qui convient au cache ou peut être inlincé ...

De plus, comme mentionné par iwillnotexist idonotexist , MMX et SSE==== Si vous ne pouvez pas facilement être utilisé dans le noya et de nombreuses versions optimisées de La recherche de la mémoire ou la copie des fonctions reposent sur ceux-ci.

Dans de nombreux cas, la version utilisée finit par être la version intégrée du compilateur de toute façon, et celles-ci sont fortement optimisées, bien plus que même que même la bibliothèque C peut être (par exemple, memcpy sera souvent converti en une charge de registre et de stocker, voire un magasin constant).

41
Stephen Kitt

Je me souviens que je devais corriger un bogue de bombe de noyau de noyau à Solaris en 2006 qui a été déclenché avec un système de fichiers ISO-9660 + Rock Rock créé par autre chose que mkisofs.

Ce logiciel de formatage ISO n'incluait pas le nom du fichier Rock Ridge au milieu de la saisie du répertoire ISO-9660 (comme effectué par mkisofs) mais à la fin de la saisie du répertoire ISO-9660. Maintenant, vous devez savoir que les noms de fichiers Rock Ridge ne sont pas terminés par un octet nul ...

Ce qui s'est passé était que les routines de chaîne (à cette époque trop optimisées) dans le noyau Solaris pouvaient dépasser l'une dans certains cas et si le nom du fichier Rock Ridge s'est terminé exactement à la fin d'un secteur 2K et que ce secteur s'est terminé juste à la fin. d'une page de mémoire de noyau 4K, cet accès de dépassement a provoqué une panique de noyau en raison d'un accès illégal de la mémoire.

Nous devions réécrire le code d'accès très conservateur afin d'empêcher ce noyau panique à l'avenir.

Comme vous le voyez, il est parfois beaucoup plus difficile d'écrire du code en toute sécurité pour le noyau et ce code est parfois un peu plus lent que pour éviter une panique du noyau.

BTW: Le problème avec une préfetch potentiellement imprévisible de la CPU dans les programmes spatiaux utilisateur peut être géré en laissant la liaison ajouter quelques octets après les segments s'il est possible de toucher la fin de A MMU = page. Cela ne fonctionne pas dans un noyau qui dépend des zones de mordonnées OM.

6
schily