Maison >Opération et maintenance >Nginx >Découvrez Linux ABI en dix minutes

Découvrez Linux ABI en dix minutes

WBOY
WBOYavant
2023-08-03 16:33:041078parcourir

十分钟让你了解 Linux ABI

Traduction LCTT : Hier, AlmaLinux a déclaré qu'il abandonnerait la compatibilité 1:1 avec RHEL, mais maintiendrait la compatibilité ABI avec RHEL afin que les logiciels exécutés sur RHEL puissent fonctionner de manière transparente sur AlmaLinux. Certains étudiants peuvent ne pas être très clairs sur le concept d'ABI, j'ai donc traduit cet article pour que tout le monde puisse le comprendre.

De nombreux passionnés de Linux connaissent le célèbre avertissement de Linus Torvalds : « Nous ne détruisons pas l’espace utilisateur », mais sa signification n’est peut-être pas claire pour tous ceux qui l’entendent.

Cette « Première règle » rappelle aux développeurs la stabilité de l'Application Binary Interface (ABI), qui est utilisée pour la communication et la configuration entre les applications et le noyau. Ce qui suit est destiné à familiariser le lecteur avec les concepts ABI, à expliquer pourquoi la stabilité de l'ABI est importante et à discuter de ce qui est inclus dans une ABI stable Linux. La croissance et l'évolution continues de Linux ont nécessité des modifications de l'ABI, dont certaines ont été controversées.

Qu’est-ce que l’ABI ?

ABI signifie Applications Binary Interface. Une façon de comprendre le concept d’ABI est de considérer en quoi il diffère des autres concepts. Pour de nombreux développeurs, l'interface de programmation d'applications (API) est plus familière. En règle générale, les fichiers d'en-tête et la documentation d'une bibliothèque sont considérés comme son API, ainsi que la documentation standard telle que HTML5 . Les programmes appelant la bibliothèque ou échangeant des données au format chaîne doivent respecter les conventions décrites dans l'API, sinon vous risquez d'obtenir des résultats inattendus.

Les ABI sont similaires aux API dans la mesure où elles spécifient comment les commandes sont interprétées et les données binaires sont échangées. Pour les programmes C, l'ABI inclut généralement le type de retour et la liste d'arguments des fonctions, la disposition des structures ainsi que la signification, l'ordre et la portée des types énumérés. Depuis 2022, le noyau Linux est encore presque entièrement constitué de programmes C et doit donc respecter ces spécifications.

La description de "Kernel System Call Interface" se trouve dans le "Linux Manual Section 2" et comprend quelque chose comme "mount 和 sync 的 C 版本函数。这些函数的二进制布局是 Linux ABI 的第一个重要组成部分。对于问题 “Linux 的稳定 ABI 包括哪些内容?”,许多用户和开发人员的回答是 “sysfs(/sys)和 procfs(/proc) qui peut être appelé à partir d'une application middleware. En fait, official L'ABI Linux la documentation se concentre principalement sur ces systèmes de fichiers virtuels

La section précédente s'est concentrée sur la façon dont l'ABI Linux est utilisée dans les programmes, mais n'a pas couvert les facteurs humains tout aussi importants des exigences fonctionnelles de l'ABI. La communauté du noyau, les compilateurs C. (comme GCC ou clang), des développeurs créant des bibliothèques C de l'espace utilisateur (généralement glibc) et des applications binaires présentées dans le Executable and Linking Format (ELF) Efforts de collaboration au sein de la

十分钟让你了解 Linux ABIcommunauté de développement

Pourquoi nous soucions-nous d’ABI ?

La garantie de stabilité de l'ABI Linux de Torvalds lui-même permet aux distributions Linux et aux utilisateurs individuels de mettre à jour le noyau de manière indépendante sans être affecté par le système d'exploitation.

Si Linux n'avait pas d'ABI stable, la plupart, voire la totalité, du système d'exploitation devraient être réinstallées chaque fois que le noyau devait être corrigé pour résoudre un problème de sécurité. De toute évidence, la stabilité de l’interface binaire est l’un des facteurs importants pour la convivialité et l’adoption généralisée de Linux.

十分钟让你了解 Linux ABISortie du terminal

Comme le montre l'image ci-dessus, le noyau (dans linux-libc-dev ) et Glibc (dans libc6-dev ) fournissent tous des définitions des autorisations de fichiers. Masque de bits. Évidemment, ces deux ensembles de définitions doivent concorder ! apt Le gestionnaire de packages identifiera chaque fichier fourni par le package. Les parties potentiellement instables de l'ABI Glibc sont situées dans bits/ répertoire. linux-libc-dev 中)和 Glibc(在 libc6-dev 中)都提供了定义文件权限的位掩码。显然,这两个定义集必须一致!apt 软件包管理器会识别软件包提供每个文件。Glibc ABI 的潜在不稳定部分位于 bits/ 目录中。

在大部分情况下,Linux ABI 的稳定性保证运作良好。按照 康韦定律Conway's Law,在开发过程中出现的烦人技术问题往往是由于不同软件开发社区之间的误解或分歧所致,而这些社区都为 Linux 做出了贡献。不同社区之间的接口可以通过 Linux 包管理器的元数据轻松地进行想象,如上图所示。

Y2038:一个 ABI 破坏的例子

通过考虑当前正在进行的、缓慢发生 的 “Y2038” ABI 破坏的例子,可以更好地理解 Linux ABI。在 2038 年 1 月,32 位时间计数器将回滚到全零,就像较旧车辆的里程表一样。2038 年 1 月听起来还很遥远,但可以肯定的是,如今销售的许多物联网设备仍将处于运行状态。像今年安装的 智能电表 和 智能停车系统 这样的普通产品可能采用的是 32 位处理器架构,而且也可能不支持软件更新。

Linux 内核已经在内部转向使用 64 位的 time_t 不透明数据类型来表示更晚的时间点。这意味着像 time() 这样的系统调用在 64 位系统上已经变更了它们的函数签名。这些努力的艰难程度可以在内核头文件中(例如 time_types.h)清楚地看到,在那里放着新的和 _old

La garantie de stabilité Linux ABI fonctionne bien dans la plupart des cas. Selon la Loi de Conway, les problèmes techniques gênants qui surviennent au cours du processus de développement sont souvent dus à des malentendus ou des désaccords logiciels différents. entre les communautés qui ont contribué à Linux. L'interface entre les différentes communautés peut être facilement imaginée grâce aux métadonnées du gestionnaire de packages Linux, comme le montre la figure ci-dessus.

十分钟让你了解 Linux ABIY2038 : Un exemple de rupture d'ABI en considérant les exemples de rupture d'ABI "Y2038" actuellement en cours et à évolution lente pour mieux comprendre l'ABI Linux. En janvier 2038, le compteur horaire 32 bits reviendra à zéro, tout comme le compteur kilométrique des véhicules plus anciens. Janvier 2038 peut paraître encore lointain, mais il y a fort à parier que de nombreux appareils IoT vendus aujourd’hui seront toujours opérationnels. Comme les compteurs intelligents

et les Système de stationnement intelligent

Ces produits ordinaires peuvent utiliser une architecture de processeur 32 bits et peuvent ne pas prendre en charge les mises à jour logicielles. Le noyau Linux est passé à l'utilisation de 64 bits en interne -indent: 0px; display: inline-block;">time_t Type de données opaque pour représenter un point temporel ultérieur. Cela signifie quelque chose comme time() ont vu leurs signatures de fonction modifiées sur les systèmes 64 bits. L'ampleur de ces efforts est clairement visible dans les fichiers d'en-tête du noyau tels que time_types.h, où Place new et _ancienne version de la structure de données.

🎜🎜Inversion du compteur kilométrique🎜🎜🎜Le projet Glibc 🎜prend également en charge le temps 64 bits🎜, donc vous êtes prêt, n'est-ce pas ? Malheureusement, d'après les discussions sur la 🎜liste de diffusion Debian🎜, ce n'est pas le cas. Les distributions sont confrontées au choix difficile entre fournir deux versions de tous les packages binaires pour les systèmes 32 bits ou fournir deux versions pour le support d'installation. Dans ce dernier cas, les utilisateurs en temps 32 bits devront recompiler leurs applications et les réinstaller. Comme toujours, les applications propriétaires sont un véritable casse-tête. 🎜

Qu'est-ce qui est exactement inclus dans l'ABI stable Linux ?

Comprendre l'ABI stable est un peu délicat. Une chose à considérer est que même si la plupart des sysfs sont une ABI stable, les interfaces de débogage sont définitivement instables car elles exposent les composants internes du noyau à l'espace utilisateur. Linus Torvalds a dit un jour : "Ne brisez pas l'espace utilisateur", et il parlait généralement de protéger les utilisateurs ordinaires qui "veulent juste que cela fonctionne", plutôt que les programmeurs système et les ingénieurs du noyau, qui devraient être capables de lire la documentation du noyau et le code source pour comprendre. ce qui a changé entre les versions. L'image ci-dessous illustre cette différence.

十分钟让你了解 Linux ABIGaranties de stabilité

Il est peu probable que l'utilisateur moyen interagisse avec des parties instables de l'ABI Linux, mais les programmeurs système peuvent le faire involontairement. Sauf /sys/kernel/debug Sauf, sysfs (/sys) et procfs (/proc) sont stables. /sys/kernel/debug 以外,sysfs(/sys)和 procfs(/proc)的所有部分都是稳定的。

那么其他对用户空间可见的二进制接口如何呢,包括 /dev 中的设备文件、内核日志文件(可通过 dmesg

Qu'en est-il des autres interfaces binaires visibles dans l'espace utilisateur, notamment Fichiers de périphérique et fichiers journaux du noyau dans /dev (accessibles via dmesg command to read), métadonnées du système de fichiers ou dans Qu'en est-il les "paramètres de démarrage" fournis dans la "ligne de commande" du noyau (visibles dans les chargeurs de démarrage tels que GRUB ou u-boot) ? Bien sûr, « ça dépend ».

Montage d'anciens systèmes de fichiers

Outre le fait qu'un système Linux se bloque lors du démarrage, l'incapacité de monter un système de fichiers est la chose la plus décevante. Si le système de fichiers se trouve sur le SSD d'un client payant, le problème est vraiment grave. Un système de fichiers Linux qui était montable sous une ancienne version du noyau devrait toujours être montable lorsque le noyau est mis à niveau, n'est-ce pas ? En fait, « ça dépend ».

En 2020, un développeur Linux blessé s'est plaint

sur la liste de diffusion du noyau :

Le noyau a accepté ceci comme format de système de fichiers montable valide sans aucun bug ni problème d'aucune sorte. Avertissement, et travaille ainsi de manière fiable depuis ans... J'ai généralement pensé que le montage d'un système de fichiers racine existant tombait dans les limites de l'espace utilisateur du noyau<-> ou du système existant du noyau<->, tel que défini par La mise à niveau du noyau devrait être compatible avec les espaces utilisateur existants et systèmes, définis par ce qui est accepté par le noyau et utilisé avec succès par les espaces utilisateur existants.

Mais il y a un problème : ces systèmes de fichiers non montables sont créés à l'aide d'un outil propriétaire qui s'appuie sur des indicateurs définis par le noyau, mais non utilisés par celui-ci. Cet indicateur n'apparaît pas dans les en-têtes de l'API Linux ou dans procfs/sysfs, mais est un détail d'implémentation. Par conséquent, interpréter cet indicateur dans le code de l'espace utilisateur signifie s'appuyer sur "Comportement non défini", une phrase qui fait frémir presque tous les développeurs de logiciels. Lorsque la communauté du noyau a amélioré ses tests internes et a commencé à travailler sur de nouveaux contrôles de cohérence, l'appel système "man 2 mount

" a soudainement commencé à rejeter les systèmes de fichiers aux formats propriétaires. Étant donné que le créateur du format était clairement un développeur de logiciels, il n'a pas réussi à gagner la sympathie des responsables du système de fichiers du noyau.

十分钟让你了解 Linux ABILe panneau de construction indique que les équipes travaillent sur les arbres

🎜

Journal dmesg du noyau threadé

Le format de fichier dans le répertoire /dev est-il garanti stable ou instable ? la commande dmesg /dev 目录中的文件格式是否保证稳定或不稳定?dmesg 命令 会从文件 /dev/kmsg 中读取内容。2018 年,一位开发人员 为 dmesg 输出实现了线程化,使内核能够“在打印一系列 printk() 消息到控制台时,不会被中断和/或被其他线程的并发 printk() 干扰”。听起来很棒!通过在 /dev/kmsg 输出的每一行添加线程 ID,实现了线程化。密切关注的读者将意识到这个改动改变了 /dev/kmsg 的 ABI,这意味着解析该文件的应用程序也需要进行相应的修改。由于许多发行版没有编译启用新功能的内核,大多数使用 /bin/dmesg 的用户可能没有注意到这件事,但这个改动破坏了 GDB 调试器 读取内核日志的能力。

确实,敏锐的读者会认为 GDB 的用户运气不佳,因为调试器是开发人员工具。实际上并非如此,因为需要更新以支持新的 /dev/kmsg lira à partir du fichier /dev/kmsg. En 2018, un développeur a implémenté le threading pour la sortie dmesg, permettant au noyau d'"imprimer une série de printk() Lorsque le message est envoyé à la console, il ne sera pas interrompu et/ou accepté par d'autres threads printk() interférence". Ça a l'air génial ! Par /dev/kmsg Ajoute un ID de thread à chaque ligne de sortie pour réaliser le threading. Les lecteurs attentifs se rendront compte que ce changement change /dev/kmsg, ce qui signifie que l'application qui analyse le fichier doit également être modifiée en conséquence. Étant donné que de nombreuses distributions ne compilent pas le noyau avec les nouvelles fonctionnalités activées, la plupart utilisent /bin/dmesg Les utilisateurs ne le remarqueront peut-être pas, mais ce changement interrompt GDB Debugger La possibilité de lire les journaux du noyau.

En effet, les lecteurs avisés penseront que les utilisateurs de GDB n'ont pas de chance car le débogueur est un outil de développement. Ce n'est en fait pas le cas car il doit être mis à jour pour prendre en charge le nouveau /dev/kmsg Le code au format est situé dans la partie "in-tree" du propre référentiel de code source Git du noyau. Pour un projet normal, ce serait une erreur évidente que les programmes d'une même base de code ne fonctionnent pas ensemble, c'est pourquoi un correctif

pour permettre à GDB de fonctionner avec /dev/kmsg

threadé a été fusionné. Et les programmes BPF ? BPF est un outil puissant qui peut être surveillé dans le noyau en cours d'exécution et même configuré en temps réel. BPF a été initialement conçu pour prendre en charge la configuration réseau en temps réel en permettant aux administrateurs système de modifier les filtres de paquets à la volée depuis la ligne de commande. Alexei Starovoitov et d'autres ont considérablement étendu BPF pour pouvoir tracer des fonctions arbitraires du noyau. Le traçage est clairement le domaine des développeurs, et non des utilisateurs réguliers, il n'est donc évidemment soumis à aucune garantie ABI (bien que l'appel système

bpf()

ait les mêmes promesses de stabilité que les autres appels système). D'un autre côté, la création de programmes BPF avec de nouvelles fonctionnalités ouvre la possibilité de "remplacer les modules du noyau comme moyen standard de facto d'étendre le noyau". Les modules du noyau assurent le bon fonctionnement des périphériques, des systèmes de fichiers, du chiffrement, de la mise en réseau, etc., tout comme les fonctionnalités sur lesquelles s'appuie l'utilisateur moyen qui "veut juste que cela fonctionne". Le problème est que, contrairement à la plupart des modules du noyau open source, les programmes BPF ne figurent généralement pas dans le code source du noyau.

Au printemps 2022, une proposition a été mise au point, proposant de prendre en charge une large gamme de périphériques à interface humaine (tels que des souris et des claviers) à l'aide de programmes mini-BPF au lieu de correctifs de pilotes de périphériques.

🎜Une discussion animée s'ensuit, mais le problème a apparemment été résolu dans 🎜les commentaires de Torvalds 🎜 lors de l'Open Source Summit : 🎜

Il souligne que si vous cassez « les vrais outils de l'espace utilisateur utilisés par les utilisateurs normaux (non-développeurs du noyau) », alors vous devez le réparer, que eBPF soit utilisé ou non.

Un consensus semble émerger sur le fait que les développeurs qui souhaitent que leurs programmes BPF fonctionnent toujours après une mise à jour du noyau devront les engager dans un emplacement encore non spécifié dans le référentiel de code source du noyau. Restez à l'écoute pour voir quelles politiques la communauté du noyau adopte concernant la stabilité du BPF et de l'ABI.

Conclusion

Les garanties de stabilité ABI du noyau s'appliquent aux procfs, sysfs et à l'interface d'appel système, mais il existe des exceptions importantes. Lorsqu'un changement de noyau interrompt le code « dans l'arborescence » ou une application de l'espace utilisateur, le correctif incriminé est souvent rapidement annulé. Pour le code propriétaire qui s'appuie sur les détails d'implémentation du noyau, bien que ces détails soient accessibles depuis l'espace utilisateur, il n'est pas protégé et reçoit une sympathie limitée lorsque des problèmes surviennent. Lorsque des problèmes comme Y2038 ne peuvent éviter la rupture de l’ABI, la transition est effectuée de la manière la plus délibérée et la plus systématique possible. Et de nouvelles fonctionnalités telles que les programmes BPF soulèvent des questions sans réponse sur les limites de la stabilité de l'ABI.

REMERCIEMENTS

Merci à Akkana Peck, Sarah R. Newman et Luke S. Crawford pour leurs commentaires utiles sur les versions antérieures du matériel.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
Article précédent:Nginx - configuration minimaleArticle suivant:Nginx - configuration minimale