URL: https://linuxfr.org/news/haiku-a-23-ans-haiku-r1-beta-5-partie-2-le-noyau Title: Haiku a 23 ans - Haiku R1 bĂȘta 5 (partie 2 : le noyau) Authors: pulkomandy Ysabeau đ§¶ et BAud Date: 2024ćčŽ09æ16æ„T21:44:40+02:00 License: CC By-SA Tags: haiku, systĂšme_d'exploitation et sortie_version Score: 47 Haiku est un systĂšme dâexploitation libre destinĂ© aux ordinateurs personnels ou de bureau (pas de serveurs, pas de systĂšmes embarquĂ©s, pas de tablettes ni de tĂ©lĂ©phones). Il sâagit au dĂ©part dâune réécriture libre de BeOS, prĂ©servant la compatibilitĂ© binaire avec ce dernier (les applications BeOS peuvent tourner sur certaines versions de Haiku). AprĂšs la [prĂ©sentation des applications de Haiku](https://linuxfr.org/news/haiku-a-23-ans-haiku-r1-beta-5-partie-1-applications), voici une incursion dans le noyau et la chaĂźne de compilation. Au menu de ce chapitre notamment : processeurs, rĂ©seau, pĂ©riphĂ©riques, son et image, systĂšme de fichier, amĂ©liorations des performances, etc. ---- [dĂ©pĂȘche de l'annĂ©e prĂ©cĂ©dente pour les 22 ans](https://linuxfr.org/news/22-ans-de-haiku) [Site web de Haiku](https://www.haiku-os.org/) [Haiku R1 bĂȘta5 : les applications](https://linuxfr.org/news/haiku-a-23-ans-haiku-r1-beta-5-partie-1-applications) [Haiku a 23 ans - Haiku R1 beta 5](https://pulkomandy.tk/_/_/_Haiku%20a%2023%20ans%20-%20Haiku%20R1%20beta%205) [Haiku a 23 ans - Haiku R1 bĂȘta 5 (partie 3 : documentation, finances et GSOC)](https://linuxfr.org/news/haiku-a-23-ans-haiku-r1-beta-5-partie-3-documentation-finances-et-gsoc) ---- Noyau ===== Le noyau de Haiku est similaire Ă celui de BeOS : il sâagit dâun noyau monolithique, avec du multitĂąche prĂ©emptif et protection mĂ©moire. Rien de trĂšs inhabituel. Il est dĂ©veloppĂ© en C++ (comme le reste du systĂšme), ce qui permet de rendre le code plus lisible que du C tout en conservant des bonnes performances pour ce code bas niveau. Un point intĂ©ressant, le noyau offre une API et une ABI stable pour les pilotes, ce qui fait quâil est en thĂ©orie possible de dĂ©velopper un pilote hors du projet Haiku et de le faire fonctionner avec plusieurs versions du noyau. En pratique, peu de personnes se lancent dans ce genre de chose, il est plus simple dâintĂ©grer les pilotes dans le dĂ©pĂŽt de sources de Haiku pour lâinstant. Pilotes ------- Commençons justement par regarder les nouveautĂ©s du cĂŽtĂ© des pilotes matĂ©riels. Il sâagit pour tout systĂšme dâexploitation dâun point de difficultĂ©, indispensable pour fonctionner sur une large variĂ©tĂ© de systĂšmes. ### Processeurs En principe, un processeur est un matĂ©riel assez bien standardisĂ©, qui implĂ©mente un jeu dâinstruction bien dĂ©fini et ne devrait pas nĂ©cessiter de pilote spĂ©cifique. Cependant, le matĂ©riel moderne de plus en plus complexe, offrant de plus en plus de fonctionnalitĂ©s dans une seule puce Ă©lectronique, fait quâil faut tout de mĂȘme prendre en compte quelques cas particuliers. - Ajout de nouvelles gĂ©nĂ©rations de machines Intel dans le driver _PCH thermal_ (rĂ©cupĂ©ration de la tempĂ©rature du CPU au travers du _platform control hub_). - ImplĂ©mentation du contournement pour la faille *Zenbleed* dans les processeurs AMD. - La mise Ă jour du microcode pour les processeurs Intel nâest pas faite si le CPU est dĂ©jĂ Ă jour (pour gagner un peu de temps au redĂ©marrage du systĂšme). ### RĂ©seau Les cartes rĂ©seau restent aujourdâhui le composant le moins bien standardisĂ© sur les ordinateurs. Il nâexiste pas dâinterface standardisĂ©e, et chaque fabricant propose sa propre façon de faire. Aujourdâhui, la plupart des autres pĂ©riphĂ©riques suivent des spĂ©cifications (xHCI pour les contrĂŽleurs USB3, AHCI pour le SATA, Intel HDA pour les cartes son...) ou bien il ne reste que peu de concepteurs de composants (par exemple pour les cartes graphiques oĂč on ne trouve que Intel, AMD et NVidia). Ăcrire des pilotes pour toutes ces cartes rĂ©seau demanderait beaucoup trop de travail. Câest pourquoi, depuis 2007, Haiku sâest dotĂ© dâune couche de compatibilitĂ© avec FreeBSD, permettant de rĂ©utiliser les pilotes Ă©crits pour ce dernier (une approche [Ă©galement utilisĂ©e par le systĂšme dâexploitation temps rĂ©el RTEMS](https://freebsdfoundation.org/wp-content/uploads/2016/08/FreeBSD-and-RTEMS-Unix-in-a-Real-Time-Operating-System.pdf)). Cependant, les dĂ©veloppeurs de FreeBSD font face au mĂȘme problĂšme, et ont dĂ©cidĂ© dâadopter la mĂȘme solution : une couche de compatibilitĂ© permettant dâutiliser les pilotes de Linux. Cela pose deux problĂšmes pour Haiku : il ne semble pas souhaitable dâempiler les couches de compatibilitĂ©, et il ne semble pas raisonnable dâĂ©crire une couche de compatibilitĂ© avec Linux, dont les API internes Ă©voluent beaucoup trop vite, ce qui nĂ©cessiterait une réécriture permanente de la couche de compatibilitĂ© pour suivre le rythme. Finalement, la solution retenue pour Haiku est dâutiliser les pilotes activement dĂ©veloppĂ©s par OpenBSD et en particulier par [Stefan Sperling](https://www.stefansperling.de/projects.html). La couche de compatibilitĂ© avec FreeBSD est Ă©galement maintenue, et Haiku bĂ©nĂ©ficie donc des pilotes dĂ©veloppĂ©s pour ces deux systĂšmes, en plus des siens propres. Par exemple, les pilotes wifi `iaxwifi200` et `idualwifi7260` proviennent de OpenBSD, tandis que `ipro1000` et `intel22x` sont ceux de FreeBSD 14. Les couches de compatibilitĂ© reçoivent rĂ©guliĂšrement des corrections et amĂ©liorations. En dehors des cartes rĂ©seaux physiques, Haiku dispose dâun nouveau pilote _tun_ permettant de crĂ©eer des tunnels rĂ©seau. Celui-ci a Ă©tĂ© dĂ©veloppĂ© dans le cadre du Google Summer of Code 2023, et permet par exemple dâutiliser un client OpenVPN sous Haiku. Enfin, une Ă©volution qui concerne tous les pilotes rĂ©seaux : le nombre de paquets et dâoctets reçus et envoyĂ©s pour une interface rĂ©seau est maintenant dĂ©comptĂ© par la pile rĂ©seau, plutĂŽt que par chaque pilote dâinterface rĂ©seau. Les pilotes doivent toujours tenir Ă jour les compteurs dâerreurs. Ce changement permet de regrouper le code de comptage Ă un seul endroit, et dâĂ©viter des comportements diffĂ©rents entre pilotes. En particulier, le comptage des paquets pour lâinterface localhost nâĂ©tait pas correct. ### PĂ©riphĂ©riques dâentrĂ©e Haiku permet dâutiliser les claviers et souris connectĂ©s en USB et en PS/2 (encore utilisĂ© dans certains ordinateurs portables, mais il semble en voie de disparition). Les pilotes pour les touchpads et claviers i2c sont encore en cours de dĂ©veloppement, et le Bluetooth arrivera un peu plus tard. Commençons par le pilote PS/2. Il reçoit relativement peu dâĂ©volutions, cependant, les ordinateurs portables rĂ©cents nâimplĂ©mentent plus forcĂ©ment complĂštement le matĂ©riel nĂ©cessaire (lâinterface PS/2 Ă©tant simulĂ©e par l'[embedded controller](https://en.wikipedia.org/wiki/Embedded_controller)). Le pilote PS/2 de Haiku qui essaie de dĂ©tecter de nombreux cas de configuration possibles est parfois un peu dĂ©routĂ© par ces Ă©carts. Cela pouvait provoquer un blocage empĂȘchant dâutiliser le clavier pendant plusieurs secondes aprĂšs le lancement de la machine, le temps que le pilote finisse dâĂ©numĂ©rer les pĂ©riphĂ©riques PS/2. Le problĂšme a Ă©tĂ© corrigĂ© en rĂ©duisant le temps dâattente avant de dĂ©cider quâil nây a aucun pĂ©riphĂ©rique connectĂ©. Du cĂŽtĂ© de lâUSB, une premiĂšre correction concerne la prise en compte de lâattribut « minimum » dans les rapports HID. Le protocole HID permet de dĂ©finir toutes sortes de pĂ©riphĂ©riques (claviers, souris, mais aussi [clubs de golf, simulateurs de tanks...](https://www.usb.org/sites/default/files/hut1_4.pdf)). Les pĂ©riphĂ©riques USB HID envoient Ă lâordinateur une description des contrĂŽles dont ils disposent (groupes de boutons, axes, etc). Pour les boutons et touches de clavier, la valeur « minimum » indique le code du premier bouton dans le groupe, les autres Ă©tant dĂ©duits en incrĂ©mentant la valeur pour chaque bouton prĂ©sent. Ce cas nâĂ©tait pas bien pris en compte par le pilote de clavier, ce qui provoquait lâenvoi de mauvais codes aux applications pour les claviers concernĂ©s. Dâautre part, et de façon plus spĂ©cifique, le pilote de souris bĂ©nĂ©ficie maintenant dâun _quirk_, câest-Ă -dire dâune procĂ©dure de contournement dâun problĂšme, pour les souris et trackballs de la marque Elecom. Ces derniĂšres utilisent en effet toutes le mĂȘme descripteur HID, indiquant la prĂ©sence de 5 boutons, alors que certains modĂšles ont en fait un 6^me bouton non dĂ©clarĂ©. Le descripteur est corrigĂ© Ă la volĂ©e pour les pĂ©riphĂ©riques concernĂ©s. ### Son et image Haiku dispose dâun pilote pour les pĂ©riphĂ©riques USB Audio. Ce pilote est en dĂ©veloppement depuis trĂšs longtemps (cela remonte avant lâapparition de lâUSB 2.0), mais il nâavait jamais pu ĂȘtre finalisĂ© en raison du manque de prise en charge des [transferts isochrones](https://www.abcelectronique.com/acquier/usb4_fr.htm#Isochronous). Ces problĂšmes ont enfin Ă©tĂ© corrigĂ©s, mais le pilote nĂ©cessite encore des travaux pour le rendre compatible avec plus de matĂ©riel (en particulier les pĂ©riphĂ©riques implĂ©mentant la version 2.0 de la spĂ©cification USB Audio) et probablement Ă©galement quelques corrections dans le serveur mĂ©dia pour le prĂ©parer Ă lâapparition et la disparition de cartes son pendant que le systĂšme est en train de tourner (actuellement, cela nĂ©cessitera un redĂ©marrage du serveur). Du cĂŽtĂ© des cartes son PCI, pas de grande nouveautĂ©, mais un gros nettoyage dans le cadre de travaux pour supprimer tous les avertissements du compilateur. Ce travail se fait petit Ă petit, dossier par dossier dans le code de Haiku. Lâanalyse du dossier contenant les pilotes de cartes son a rĂ©vĂ©lĂ© lâexistence de trois pilotes ciblant le mĂȘme matĂ©riel, ainsi que de plusieurs fichiers qui avaient Ă©tĂ© dupliquĂ©s dans plusieurs pilotes (dĂ©veloppĂ©s avant leur rassemblement dans le dĂ©pĂŽt de sources de Haiku Ă partir du mĂšme exemple de code), puis qui avaient divergĂ© au cours du dĂ©veloppement de chaque pilote. Ce code a Ă©tĂ© rĂ©unifiĂ© dans une version partagĂ©e qui inclut toutes les corrections et amĂ©liorations de chaque version. Du cĂŽtĂ© des cartes graphiques, des travaux sont en cours pour pouvoir piloter correctement les cartes graphiques Intel de 12^me gĂ©nĂ©ration. Le pilote existant fonctionne dĂ©jĂ dans certains cas, mais se repose beaucoup sur le travail fait par le _firmware_ (BIOS ou EFI) pour initialiser lâaffichage. Il est ainsi impossible dâutiliser un Ă©cran qui nâa pas Ă©tĂ© configurĂ© au dĂ©marrage de la machine (passer dâune sortie HDMI Ă lâĂ©cran dâun PC portable ou inversement, par exemple). ### Machines virtuelles Haiku est utilisĂ© dans des machines virtuelles pour diverses raisons : Ă des fins de test par les dĂ©veloppeurs, pour lâinfrastructure de compilation des paquets, ou encore par des utilisateurs qui veulent le tester sans lâinstaller sur une machine physique dĂ©diĂ©e. Des pilotes spĂ©cifiques et quelques adaptations sont nĂ©cessaires pour un bon fonctionnement sur ces machines. En particulier, des pilotes sont nĂ©cessaires pour certains pĂ©riphĂ©riques [virtio](https://wiki.libvirt.org/Virtio.html), qui permettent aux machines virtuelles dâĂ©muler un matĂ©riel simplifiĂ©, ne correspondant pas Ă un matĂ©riel rĂ©el existant. Ceci permet de meilleures performances. Le pilote virtio de Haiku a Ă©tĂ© mis Ă jour pour implĂ©menter la version 1.0 de la spĂ©cification. Cela a permis de corriger des problĂšmes dans le pilote `virtio_block` (support de stockage virtualisĂ©). Un nouveau pilote `virtio_gpu` permet lâaffichage de lâĂ©cran sans avoir Ă passer par un pilote pour une carte graphique, ni par les pilotes VESA ou framebuffer EFI qui montrent assez vite leurs limitations (choix de rĂ©solutions dâĂ©cran limitĂ©, par exemple). Plus tard, ce pilote pourrait permettre Ă©galement dâexpĂ©rimenter avec la virtualisation de OpenGL, et donc dâexpĂ©rimenter avec lâaccĂ©lĂ©ration du rendu 3D sans avoir Ă dĂ©velopper un pilote graphique capable de le faire. Ces pilotes virtualisĂ©s facilitent Ă©galement le travail de portage de Haiku vers de nouvelles architectures : il est possible de lancer Haiku dans QEMU avec nâimporte quel processeur, et un ensemble de pĂ©riphĂ©riques virtio pour lesquels les pilotes ont pu dâabord ĂȘtre testĂ©s sur une autre architecture dĂ©jĂ fonctionnelle. ### Autres La bibliothĂšque ACPICA a Ă©tĂ© mise Ă jour avec la derniĂšre version 20230628, et les changements nĂ©cessaires pour son fonctionnement dans Haiku ont Ă©tĂ© [intĂ©grĂ©es en amont](https://github.com/acpica/acpica/pull/918), ce qui facilitera les prochaines mises Ă jour. ACPICA est dĂ©veloppĂ©e par Intel et permet dâimplĂ©menter la spĂ©cification ACPI, pour la gestion dâĂ©nergie, lâĂ©numĂ©ration du matĂ©riel prĂ©sent sur une machine, et diverses fonctionnalitĂ©s liĂ©es (dĂ©tection de la fermeture dâun ordinateur portable, rĂ©cupĂ©ration du niveau de charge des batteries, par exemple). Le pilote `poke`, qui permet aux applications de manipuler directement la mĂ©moire physique sans lâaide dâun pilote spĂ©cifique, a Ă©tĂ© remis Ă jour et finalisĂ©. Il est utile principalement pour expĂ©rimenter avec le matĂ©riel avant de dĂ©velopper un pilote spĂ©cifique. La pile Bluetooth a reçu un premier coup de nettoyage. Pas de grosses Ă©volutions pour lâinstant, seules les couches les plus basses sont implĂ©mentĂ©es, on pourra au mieux Ă©numĂ©rer les pĂ©riphĂ©riques Bluetooth prĂ©sents Ă proximitĂ©. Le dĂ©veloppement des fonctionnalitĂ©s suivantes attendra au moins la publication de la version BĂȘta 5. SystĂšmes de fichiers -------------------- Haiku implĂ©mente plusieurs systĂšmes de fichiers. Celui utilisĂ© pour le systĂšme est BFS, hĂ©ritĂ© de BeOS et qui fournit quelques fonctions indispensables Ă Haiku (comme les requĂȘtes qui permettent dâindexer des attributs Ă©tendus de fichiers dans une base de donnĂ©es). Mais de nombreux autres systĂšmes de fichiers peuvent ĂȘtre lus, et pour certains, Ă©crits. Cela permet de facilement partager des fichiers avec dâautres systĂšmes dâexploitation. Le systĂšme de fichier UFS2 est maintenant complĂštement implĂ©mentĂ© (en lecture seule), inter-opĂ©rable avec FreeBSD, et sera disponible dans lâinstallation de base pour les prochaines versions de Haiku. Du cĂŽtĂ© de Linux, lâinteropĂ©rabilitĂ© est possible en lecture et en Ă©criture avec les systĂšmes de fichiers ext2, 3, et 4 (tous les 3 implĂ©mentĂ©s dans un seul pilote qui sait les reconnaĂźtre et les diffĂ©rencier). Cette implĂ©mentation a reçu quelques corrections de bugs ainsi quâune implĂ©mentation de F_SETFL. Enfin du cĂŽtĂ© de Windows, la prise en charge de NTFS avait dĂ©jĂ Ă©tĂ© mise Ă jour et grandement amĂ©liorĂ©e (en rĂ©utilisant les sources de NTFS-3g). Cette annĂ©e, câest le tour des systĂšmes de fichiers FAT. Le pilote utilisĂ© jusquâĂ maintenant avait Ă©tĂ© publiĂ© par Be il y a trĂšs longtemps. Il avait Ă©tĂ© mis Ă jour pour Haiku mais comportait de nombreux problĂšmes : mauvaise gestion des dates de modification des fichiers, interopĂ©rabilitĂ© avec dâautres implĂ©mentations, voire crash du systĂšme lors de tentative de lecture de partitions corrompues. Ce code a Ă©tĂ© entiĂšrement remplacĂ© par un pilote utilisant lâimplĂ©mentation du FAT de FreeBSD. Enfin, le systĂšme de fichier ramfs (pour stocker des fichiers dans la RAM de lâordinateur de façon non persistente) a reçu des corrections sur la fonction `preallocate`. Cela corrige en particulier des fuites de mĂ©moire dans les navigateurs web basĂ©s sur QWebEngine, qui utilisent ce systĂšme de fichiers pour partager de la mĂ©moire entre plusieurs processus. Un changement un peu plus global, et pas liĂ© Ă un systĂšme de fichier spĂ©cifique, est la rĂ©unification du code pour parser les _requĂȘtes_. Il sâagit dâune mĂ©thode pour rechercher des fichiers Ă partir de leurs attributs Ă©tendus (xattrs) qui sont indexĂ©s Ă la façon dâune base de donnĂ©es. Au dĂ©part, cette fonctionnalitĂ© Ă©tait propre au systĂšme de fichier BFS, mais elle a Ă©tĂ© implĂ©mentĂ©e Ă©galement pour ramfs et packagefs (systĂšme de fichier permettant dâaccĂ©der au contenu des paquets logiciels sans les dĂ©compresser). Lors du dĂ©veloppement de ces deux nouveaux systĂšmes de fichiers, le code permettant de convertir une chaĂźne de caractĂšres exprimant une requĂȘte en opĂ©ration exĂ©cutable avait Ă©tĂ© extrait du pilote BFS pour en faire un module gĂ©nĂ©rique. Mais le pilote BFS nâavait pas encore Ă©tĂ© mis Ă jour pour utiliser ce module. Câest dĂ©sormais chose faite, ce qui assure que le comportement entre les 3 systĂšmes de fichiers est le mĂȘme, et que les corrections de bugs bĂ©nĂ©ficieront Ă tous les trois. Pour terminer sur les systĂšmes de fichiers, lâoutil `fs_shell`, qui permet dâexĂ©cuter le code dâun systĂšme de fichier en espace utilisateur, a reçu deux nouvelles commandes : `truncate` et `touch`. Cet outil permet de tester les systĂšmes de fichiers en cours de dĂ©veloppement dans un environnement plus confortable et mieux contrĂŽlĂ©, et il est aussi utilisĂ© lors de la compilation de Haiku pour gĂ©nĂ©rer les images disques. RĂ©seau ------ La pile rĂ©seau proprement dite a principalement Ă©voluĂ© avec de la mise en commun de code. Par exemple, lâimplĂ©mentation de lâioctl FIONBIO (non standardisĂ©, mais largement implĂ©mentĂ©) pour passer un descripteur de fichier en mode non bloquant a Ă©tĂ© réécrite pour partager du code avec le flag O_NONBLOCK configurable par [fcntl et F_SETFL](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html). Ăgalement, le flag `MSG_PEEK` qui permet de lire des donnĂ©es dâun socket sans les retirer de son buffer de rĂ©ception, est maintenant implĂ©mentĂ© directement par la pile rĂ©seau au lieu dâavoir une version spĂ©cifique Ă chaque type de socket. ### Sockets UNIX Les sockets de la famille `AF_UNIX` sont utilisĂ©s pour les communications locales entre applications sur une mĂȘme machine. Ils sont en particulier utilisĂ©s par WebKit et de nombreux autres moteurs de rendu web, mais assez peu par les applications natives pour Haiku, qui disposent dâautres mĂ©thodes de communications (en particullier les [BMessage](https://www.haiku-os.org/docs/api/classBMessage.html) et les [ports](https://www.haiku-os.org/legacy-docs/bebook/TheKernelKit_Ports.html#create_port)). LâimplĂ©mentation des sockets UNIX est maintenant complĂšte et suffisante pour faire fonctionner toutes les applications qui en ont lâutilitĂ©. ### TCP La pile TCP de Haiku est devenue au fil du temps un goulot dâĂ©tranglement des performances. Dâune part parce que toutes les autres parties du systĂšme se sont amĂ©liorĂ©es, et dâautre part parce que les interfaces rĂ©seaux sont de plus en plus rapides et de plus en plus sollicitĂ©es. Le travail sur la pile TCP cette annĂ©e a commencĂ© par la remise en route de lâoutil `tcp_shell`, qui permet de tester lâimplĂ©mentation de TCP en espace utilisateur et en isolation du reste du systĂšme. Cet outil avait Ă©tĂ© utilisĂ© au tout dĂ©but du dĂ©veloppement de la pile TCP, mais nâavait pas Ă©tĂ© tenu Ă jour depuis. Il permet maintenant de tester la pile TCP communiquant avec elle-mĂȘme, et aussi dâinjecter des paquets Ă partir de fichier [pcap](https://fr.wikipedia.org/wiki/Pcap). Pour lâinstant, la fonction permettant de communiquer avec lâextĂ©rieur nâa pas Ă©tĂ© remise en place. Cet outil a permis dâidentifier et dâanalyser certains des problĂšmes rencontrĂ©s. Le premier problĂšme Ă©tait un envoi dâacquittements TCP en double. Ă premiĂšre vue, cela ne devrait pas poser de gros problĂšmes, il y a seulement un peu de redondance. Mais, en pratique, une implĂ©mentation de TCP qui reçoit des acquittements en double suppose quâil y a eu un problĂšme de congestion rĂ©seau lors de lâenvoi de donnĂ©es dans lâautre sens. Les algorithmes de contrĂŽle de la congestion se mettent en jeu, et le trafic ralentit pour Ă©viter une congestion qui nâexiste pas. Par exemple, la taille de la fenĂȘtre de transmission TCP (le nombre maximum dâoctets qui peuvent ĂȘtre envoyĂ©s sans attendre dâacquittement) peut ĂȘtre rĂ©duite. Et, malheureusement, cela dĂ©clenche un autre problĂšme : la taille de cette fenĂȘtre peut atteindre 0 octet, et dans ce cas, HAiku ne sâautorisait plus Ă Ă©mettre aucun paquet. Cela pouvait se produire au mĂȘme moment dans les deux directions sur une connexion TCP, ce qui fait quâaucune des deux machines connectĂ©es ne sâautorise Ă envoyer de donnĂ©es Ă lâautre. Ce problĂšme a Ă©tĂ© corrigĂ©, les transmissions peuvent maintenant continuer Ă dĂ©bit rĂ©duit, puis reprendre une vitesse optimale petit Ă petit. AprĂšs ces corrections, une mesure des performances de TCP dans un environnement de test montre que la pile TCP est capable de traiter jusquâĂ 5.4 Gbits/s de trafic, alors que le dĂ©bit plafonnait Ă 45 Mbits/s auparavant. Câest donc un centuplage des performances. Autres ------ Plusieurs autres Ă©volutions diverses dans le noyau : LâimplĂ©mentation de [kqueue](https://man.freebsd.org/cgi/man.cgi?kqueue), ajoutĂ©e lâannĂ©e derniĂšre, a reçu plusieurs corrections et amĂ©liorations. Elle couvre dĂ©jĂ plusieurs usages et permet lâutilisation de plus de logiciels portĂ©s depuis dâautres systĂšmes, mais les cas dâutilisation les plus avancĂ©s ne sont pas encore tout Ă fait fonctionnels. Pour rappel, kqueue est une fonction des systĂšmes BSD permettant Ă un thread utilisateur de se mettre en attente de plusieurs types dâĂ©vĂšnements et de ressources du noyau. Lâusage est similaire Ă celui de [epoll](https://www.man7.org/linux/man-pages/man7/epoll.7.html) sous Linux mais lâAPI est diffĂ©rente. La classe ConditionVariable, utilisĂ©e pour la synchronisation entre threads et interruptions dans le noyau, a reçu plusieurs mises Ă jour. Un article sur le site de Haiku dĂ©taille [lâutilisation et le fonctionnement de cette classe](https://www.haiku-os.org/blog/waddlesplash/2023-04-24_condition_variables/). La boucle principale du dĂ©bugger noyau (KDL), qui prend la main sur tous les processeurs en cas de crash du systĂšme ou sur demande de lâutilisateur pour investiguer des problĂšmes, inclus maintenant une instruction [PAUSE](https://www.felixcloutier.com/x86/pause). Cela permet dâinformer le CPU quâil nâest pas nĂ©cessaire dâexĂ©cuter cette boucle Ă la vitesse maximale, Ă©vitant de faire surchauffer la machine sans raison. Cette boucle est principalement en attente dâinstructions de lâutilisateur, via un clavier ou un port sĂ©rie. Du refactoring sur les parties du code qui sont spĂ©cifiques Ă chaque architecture : `arch_debug_get_caller` est maintenant implĂ©mentĂ© via un builtin gcc plutĂŽt que du code assembleur Ă Ă©crire Ă la main pour chaque machine. `arch_debug_call_with_fault_handler` appelait une fonction avec un mauvais alignement de pile sur x8_64, pouvant conduire Ă un crash si la fonction appelĂ©e utilisait des instructions SSE par exemple. Correction Ă©galement dâun problĂšme qui pouvait causer la perte dâune interruption inter-CPU (permettant Ă un cĆur de processeur dâinterrompre lâexĂ©cution de code en cours sur un autre cĆur) dans certains cas. Une modification sur la gestion des descripteurs de fichiers: la structure interne des descripteurs de fichiers Ă©tait pourvue dâun champ indiquant le type (fichier, socket, pipe...). Ce champ et tout le code qui en dĂ©pendait ont Ă©tĂ© supprimĂ©s. Ceci permet Ă des add-ons du kernel de dĂ©clarer leurs propres types de fichiers sans avoir Ă modifier le noyau. Cela pourrait par exemple ĂȘtre utile pour dĂ©velopper une couche de compatibilitĂ© avec Linux, qui fait un usage gĂ©nĂ©reux des descripteurs de fichiers de tous types (eventfd, signalfd, timerfd...). Réécriture du code de debug activĂ© par lâoption `B_DEBUG_SPINLOCK_CONTENTION` qui permet dâinvestiguer les problĂšmes de performances liĂ©s Ă lâutilisation de spinlocks (attente active sur une interruption matĂ©rielle). Un petit changement dâalgorithme sur lâallocateur de pages du noyau. Cet allocateur alloue des pages mĂ©moires par blocs multiples de 4Ko. Les pages libĂ©rĂ©es Ă©taient rĂ©insĂ©rĂ©es une par une dans une liste chaĂźnĂ©e. Cela conduit Ă insĂ©rer les pages dans lâordre inverse de leurs adresses (la derniĂšre page dâune zone mĂ©moire se retrouve au dĂ©but de la liste). Lors des prochaines allocations, cette page se retrouve donc allouĂ©es en premier, puis celle qui se trouve juste avant, et ainsi de suite. La zone mĂ©moire construite par toutes ses pages est donc considĂ©rĂ©e comme discontinue. En inversant lâordre dâinsertion des pages dans la liste, on prĂ©serve les pages dans un ordre globalement croissant dâadresse mĂ©moire, et on augmente les chances quâune allocation de plusieurs pages se trouve avec des pages contiguĂ«s et dans le bon ordre. Cela est utile en particulier pour les allocations qui vont ĂȘtre utilisĂ©es pour des transferts DMA: il sera possible de programmer un seul gros transfert DMA au lieu de plusieurs petits. LâĂ©tat de la [FPU](https://fr.wikipedia.org/wiki/Unit%C3%A9_de_calcul_en_virgule_flottante) du processeur nâĂ©tait pas complĂštement sauvegardĂ© lors dâun changement de contexte. Certains drapeaux de configuration pouvaient donc rester positionnĂ©s avec les valeurs configurĂ©es par un thread, pendant lâexĂ©cution dâun autre. Au mieux cela donnait des rĂ©sultats inattendus, au pire, un crash (par exemple si le FPU est configurĂ© pour lever une exception matĂ©rielle, dans un thread qui ne sây attend pas). Le nouveau code de sauvegarde utilise des instructions dĂ©diĂ©es qui sauvegardent dâun coup tout lâĂ©tat du FPU, ce qui fait quâen plus de fonctionner correctement, il est plus rapide que ce qui Ă©tait fait prĂ©cĂ©demment. Une Ă©volution sur les [sĂ©maphores](https://www.haiku-os.org/legacy-docs/bebook/TheKernelKit_Semaphores.html): la fonction `release_sem_etc` permet de donner une valeur nĂ©gative au paramĂštre « count ». Dans ce cas, le thread qui Ă©tait en attente dâun `acquire_sem` sera rĂ©veillĂ©, mais la fonction `acquire_sem` retournera une erreur indiquant que le sĂ©maphore nâa pas pu ĂȘtre obtenu. Cela permet de simplifier un peu le code de certaines utilisations classiques des sĂ©maphores. Une correction de bug sur le code traitant les « doubles fautes ». Le fonctionnement dâun systĂšme dâexploitation est en partie basĂ© sur lâinterception des « fautes », par exemple, un programme qui essaie dâaccĂ©der Ă de la mĂ©moire qui a Ă©tĂ© Ă©vacuĂ©e dans la swap. Cette mĂ©moire nâest pas immĂ©diatement accessible, le programme est donc interrompu, le noyau prend la main, va rĂ©cupĂ©rer cette mĂ©moire, puis rend la main au programme qui nây voit que du feu et continue son exĂ©cution comme si de rien nâĂ©tait. Les fautes peuvent Ă©galement se produire dans le cas oĂč un programme essaie dâaccĂ©der Ă une zone mĂ©moire non allouĂ©e, on aura alors une erreur de segmentation. Tout ça est trĂšs bien, mais que se passe-t-il si le code qui traite ces problĂšmes dĂ©clenche lui-mĂȘme une faute ? Câest prĂ©vu : il existe un deuxiĂšme morceau de code qui va intercepter ces problĂšmes et tout arrĂȘter pour lancer le debugger noyau, et permettre Ă un humain dâexaminer la situation. Oui, mais que se passe-t-il si ce code dĂ©clenche lui-mĂȘme une faute ? Câest ce quâon appelle une triple faute, dans ce cas, la solution de dernier recours est dâimmĂ©diatement redĂ©marrer la machine. Des utilisateurs se sont plaints de redĂ©marrages intempestifs, et une Ă©tude attentive du code traitant les doubles fautes a rĂ©vĂ©lĂ© un problĂšme qui dĂ©clenchait systĂ©matiquement une triple faute (difficile Ă analyser, car on nâa pas de journaux ou de moyen dâinvestiguer le problĂšme). EspĂ©rons que lâaccĂšs au debugger noyau lors des doubles fautes permettra dĂ©sormais de comprendre dâoĂč elles proviennent. Tout autre sujet, le noyau dispose maintenant dâAPIs pour configurer lâaffinitĂ© des threads, par exemple pour interdire Ă un thread de sâexĂ©cuter sur certains cĆurs de processeurs. Cela peut ĂȘtre utile sur des machines avec des processeurs hĂ©tĂ©rogĂšnes (par exemple ARM BIG.Little), ou encore si le dĂ©veloppeur dâune application pense pouvoir faire mieux que lâordonnanceur par dĂ©faut pour rĂ©partir ses threads sur diffĂ©rents cĆurs. Pour terminer sur les Ă©volutions dans le noyau, la calibration du TSC peut maintenant ĂȘtre faite Ă partir dâinformations obtenues via lâinstruction CPUID. Le TSC est un compteur de cycles qui sâincrĂ©mente Ă une vitesse plus ou moins liĂ©e Ă la frĂ©quence du processeur. Il est utile de connaĂźtre la durĂ©e en microsecondes ou nanosecondes dâun « tick » du TSC pour diffĂ©rents usages. Historiquement, cette durĂ©e est calculĂ©e en utilisant le [Programmable Interval Timer](https://wiki.osdev.org/Programmable_Interval_Timer), un composant prĂ©sent dans les ordinateurs compatibles PC depuis le tout dĂ©but. Ce composant nâa plus beaucoup dâautres utilitĂ©s aujourdâhui, et certains chipsets ne lâimplĂ©mentent plus, ou pas correctement. Ou encore, dans les machines virtuelles, lâĂ©mulation du processeur (virtualisĂ©) nâest pas forcĂ©ment exĂ©cutĂ©e de façon synchrone avec celle du timer, rendant cette mesure peu fiable. Lâinstruction CPUID permet de rĂ©cupĂ©rer lâinformation de façon plus directe. [Un changement similaire dans FreeBSD](https://reviews.freebsd.org/D32512) donne un bon aperçu de la situation. Portages ARM, RISC-V et autres ---------------------- Historiquement, Haiku est dĂ©veloppĂ© en premier pour les machines x86 32-bit. Une version 64 bit est apparue en 2012. Dâautres versions pour les processeurs PowerPC, ARM (32 et 64 bits), RISC-V, Sparc ou encore Motorola 68000 sont dans des Ă©tats dâavancement divers. Les versions ARM et RISC-V sont actuellement celles qui reçoivent le plus dâattention des dĂ©veloppeurs. Il existe un fork de Haiku qui est entiĂšrement fonctionnel sur certaines machines RISC-V, les changements sont intĂ©grĂ©s petit Ă petit avec pas mal de nettoyage Ă faire. Une des problĂ©matiques pour ces nouvelles architectures est la procĂ©dure de « bootstrap ». Pour gagner du temps et simplifier la procĂ©dure, la compilation de Haiku se base sur un certain nombre de dĂ©pendances qui sont prĂ©-compilĂ©es depuis une machine fonctionnant sous Haiku. Cela permet de ne pas avoir Ă compiler des douzaines de bibliothĂšques tierces, avec un environnement de compilation peu contrĂŽlĂ© (on peut compiler Haiku depuis un systĂšme Haiku, depuis un grand nombre de distributions Linux, depuis Mac OS, depuis un BSD, ou mĂȘme depuis Windows avec WSL). Cependant, lors du dĂ©veloppement de Haiku pour une nouvelle architecture, ces paquets prĂ©compilĂ©s ne sont bien entendu pas encore disponibles. Il est donc nĂ©cessaire dâutiliser une procĂ©dure de « bootstrap », qui va se baser sur un autre systĂšme et compiler ce qui est nĂ©cessaire en compilation croisĂ©e, pour aboutir Ă un systĂšme Haiku rĂ©duit au minimum de fonctionnalitĂ©s, juste de quoi pouvoir lancer lâoutil haikuports, qui va lui-mĂȘme ensuite compiler tous les autres paquets. Ce processus est assez complexe, et a Ă©tĂ© laissĂ© un peu Ă lâabandon. Il a Ă©tĂ© rĂ©cemment remis en route, avec des corrections de bugs dans lâoutil haikuporter, des mises Ă jour dans les paquets cross-compilĂ©s (par exemple pour passer de Python 2 Ă Python 3), et divers autres petits problĂšmes. Il est maintenant Ă nouveau possible de construire une image disque de bootstrap au moins pour la version PowerPC. Le portage RISC-V a reçu une mise Ă jour vers gcc 13 (câĂ©tait dĂ©jĂ le cas pour les autres architectures) et a pu ĂȘtre utilisĂ© pour compiler LLVM puis Mesa (lâintĂ©gration dans la ferme de compilation de Haikuports nâest pas encore en place, donc ces compilations doivent ĂȘtre faites par un dĂ©veloppeur qui lance les commandes haikuports nĂ©cessaire et patiente longtemps pendant la compilation de ces gros projets). Les versions 68000 et PowerPC ont Ă©tĂ© un peu dĂ©poussiĂ©rĂ©es, mais il manque toujours un certain nombre de pilotes matĂ©riels de base pour pouvoir les utiliser sur de vraies machines et mĂȘme dans une certaine mesure dans QEMU (ce dernier permettant dâĂ©muler une machine utilisant de nombreux pĂ©riphĂ©riques VirtIO, ce qui pourrait simplifier un peu les choses). La bibliothĂšque libroot a reçu plusieurs mises Ă jour dans les parties qui nĂ©cessitent du code spĂ©cifique Ă chaque architecture, pour ajouter en particulier le RISC-V, et au passage plusieurs autres familles de processeurs. Une partie de Haiku qui nĂ©cessite de grosses Ă©volutions est la gestion des bus PCI. Le pilote existant supposait la prĂ©sence dâun BIOS pour effectuer la dĂ©couverte du bus, ou pouvait Ă©galement utiliser des tables ACPI, mais dâune façon un peu limitĂ©e, qui repose tout de mĂȘme sur le BIOS ou un quelconque firmware pour assigner des adresses valides Ă toutes les cartes PCI. Un problĂšme identifiĂ© depuis longtemps puisquâil sâagit du [bug numĂ©ro 3](https://dev.haiku-os.org/ticket/3) dans lâoutil de suivi de bugs de Haiku. Ce bug fĂȘtera ses 20 ans en mars prochain, espĂ©rons quâil soit corrigĂ© dâici lĂ . Les choses avancent, puisque le pilote PCI va maintenant sâattacher correctement aux nĆuds ACPI correspondants dans le device tree, ce qui permet ensuite dâinterroger ACPI pour dĂ©couvrir les plages dâadresses mĂ©moires disponibles pour lâallocation dâune adresse Ă chaque carte PCI connectĂ©e. Du cĂŽtĂ© des nouveaux ports de Haiku, cela va Ă©galement permettre dâavoir plusieurs bus PCI « racine » indĂ©pendants. Et ces dĂ©veloppements pourraient Ă©galement Ătre utiles pour une prise en charge complĂšte de Thunderbolt et USB 4. Un autre pilote qui sera utile pour les versions ARM et RISC-V est le pilote [SDHCI](https://www.sdcard.org/developers/sd-standard-overview/host-controllers/), qui permet de sâinterfacer avec les lecteurs de cartes SD ainsi que les modules eMMC. Initialement destinĂ© uniquement aux modules connectĂ©s sur un bus PCI, le pilote a Ă©tĂ© conçu pour ĂȘtre facilement extensible, et permet maintenant dâutiliser Ă©galement les contrĂŽleurs SDHCI exposĂ©s via ACPI. Cependant, le pilote a encore quelques problĂšmes de fiabilitĂ©, et il manque une implĂ©mentation des commandes nĂ©cessaiers pour les modules eMMC, qui partagent le mĂȘme protocole de communication que les cartes SD, mais utilisent un jeu de commandes diffĂ©rent (il y a une petite [guerre de standards](https://www.theguardian.com/technology/blog/2007/jun/05/newmicardmemo), le format SD sâest imposĂ© pour les cartes amovibles, mais MMC qui nâa pas de royalties a pu prendre le marchĂ© des modules soudĂ©s sur les cartes mĂšres, oĂč lâinteropĂ©rabilitĂ© avec le matĂ©riel existant ne pose pas autant problĂšmes). Le portage sur ARM64 avance petit Ă petit, il parvient Ă dĂ©marrer une partie de lâespace utilisateur et a reçu derniĂšrement des corrections sur le code permettant les changements de contexte entre diffĂ©rents threads. Lâaffichage du bureau complet pour la premiĂšre fois sur une machine ARM64 ne devrait donc plus ĂȘtre trĂšs loin. Bootloader ========== Le dĂ©marrage de Haiku est pris en charge par un bootloader spĂ©cifique nommĂ© haiku_loader. Contrairement au noyau Linux, qui peut sâinitialiser tout seul quasiment dĂšs le dĂ©marrage du matĂ©riel, le noyau de Haiku a besoin que son bootloader prĂ©pare une grande partie de lâenvironnement (activation de la mĂ©moire virtuelle, initialisation de lâaffichage et mise en place du « splash screen », par exemple). Le bootloader prend en charge toutes ces tĂąches et permet en plus de configurer des options de dĂ©marrage via un menu en mode texte, de dĂ©marrer via le rĂ©seau, dâutiliser un snapshot plus ancien du systĂšme si une mise Ă jour sâest mal passĂ©e. Le bootloader a peu Ă©voluĂ© cette annĂ©e, le changement principal Ă©tant la suppression de logs de warning lors du chagement de fichiers ELF, pour les sections non traitĂ©es PT_EH_FRAME (gĂ©nĂ©rĂ© par les versions modernes de gcc) ainsi que dâautres sections spĂ©cifiques aux processeurs RISC-V qui ne nĂ©cessitent pas de traitement spĂ©cifique dans ce cas. AmĂ©lioration de performances ============================ Beaucoup de travail a Ă©tĂ© fait sur lâamĂ©lioration des performances. Câest un sujet qui a Ă©tĂ© un peu laissĂ© de cĂŽtĂ© au dĂ©but du dĂ©veloppement de Haiku. Le premier but Ă©tait de faire fonctionner les choses, avant de les rendre plus rapides. Maintenant que les dĂ©veloppements sont assez avancĂ©s, il est temps de commencer Ă Ă©tudier ce problĂšme et Ă essayer de se rapprocher des perfomances dâautres systĂšmes. ImplĂ©mentation des IO vectorisĂ©es sur les pĂ©riphĂ©riques de type bloc -------------------------------------------------------------------- Lorsquâon veut lire ou Ă©crire sur un disque, il faut envoyer une commande pour accĂ©der Ă des secteurs consĂ©cutifs. Dans le cas normal, c'est le cache du systĂšme de fichiers qui se charge de regrouper les diffĂ©rents accĂšs et de les ordonnancer de façon optimale. Mais il y a un cas particulier pour les accĂšs directs au disque. Par exemple, si on ouvre le disque directement (via son device dans /dev/disk/) ou encore lorsquâun systĂšme de fichier veut Ă©crire son journal (qui ne passe pas par le cache). Les Ă©critures dans le journal sont faites avec des accĂšs vectorisĂ©s (via `readv` ou `writev`) qui contiennent chacun une liste dâendroits oĂč lire ou Ă©crire des donnĂ©es. Ces accĂšs Ă©taient implĂ©mentĂ©s sous forme dâune boucle appelant plusieurs fois `read` ou `write`. Maintenant, la liste est directement transmise au pilote de disque qui peut ainsi mieux traiter ces accĂšs. RĂ©paration du profiler ---------------------- Haiku dispose dâun outil de profiling, mais celui-ci ne fonctionnait plus et retournait des donnĂ©es incohĂ©rentes. Plusieurs problĂšmes ont Ă©tĂ© corrigĂ©s pour faciliter les mesures de performances et vĂ©rifier que les optimisations rendent rĂ©ellement les choses plus rapides. RĂ©duction des verrouillages du device manager --------------------------------------------- Le problĂšme initial qui a conduit Ă ces amĂ©liorations Ă©tait la lenteur du lancement de nouveaux processus. Un goulet dâĂ©tranglement qui a Ă©tĂ© identifiĂ© est le verrouillage du device_manager pour accĂ©der au pĂ©riphĂ©rique /dev/random pour initialiser le stack protector (qui a besoin dâĂ©crire des valeurs alĂ©atoires sur la pile). Toutes les ouvertures de fichiers dans /dev nĂ©cessitent dâacquĂ©rir un verrou qui empĂȘche lâexĂ©cution en parallĂšle avec de nombreuses autres tĂąches liĂ©es aux pĂ©riphĂ©riques matĂ©riels. Le problĂšme a Ă©tĂ© corrigĂ© de deux façons : dâabord, le stack protector utilise une API permettant de gĂ©nĂ©rer des nombres alĂ©atoires sans ouvrir de fichier dans /dev. Dâautre part, une analyse a montrĂ© que la pile USB passait beaucoup de temps Ă exĂ©cuter du code en ayant verrouillĂ© lâaccĂšs au device manager. Ce code a Ă©tĂ© modifiĂ© pour libĂ©rer le verrou plus souvent. DT_GNU_HASH dans les fichiers ELF --------------------------------- Un autre aspect assez lent du lancement de processus est le chargement des bibliothĂšques et la recherche des symboles dans ces bibliothĂšques. Pour identifier si une bibliothĂšque contient un symbole, la recherche se fait par un hash du nom de la fonction recherchĂ©e. Historiquement, câest la section DT_HASH qui est utilisĂ©e, mais les utils GNU implĂ©mentent Ă©galement DT_GNU_HASH, qui utilise une meilleure fonction de hash et ajoute Ă©galement un *bloom filter* qui permet de tester trĂšs rapidement, mais de façon imparfaite, la prĂ©sence dâun symbole dans une bibliothĂšque. Le chargeur de bibliothĂšques de Haiku sait maintenant utiliser les tables DT_GNU_HASH, mais ce nâest pas encore dĂ©ployĂ© car les gains de performances ne justifient pas lâaugmentation de taille des bibliothĂšques (il faut stocker les tables dans lâancien et dans le nouveau format). Il sera toutefois possible de lâajouter au cas par cas sur les bibliothĂšques oĂč le gain est important (par exemple sâil y a beaucoup de symboles). premapping de mmap ------------------ La fonction `mmap` permet de mapper un fichier directement en mĂ©moire. Les Ă©critures en mĂ©moire sont ensuite directement enregistrĂ©es sur disque. Il nâest pas souhaitable de charger tout le fichier dâun coup au moment de lâappel Ă mmap, ce serait trop lent. Mais il ne fait pas non plus attendre que le logiciel accĂšde Ă cette mĂ©moire et remplir les donnĂ©es au goutte-Ă -goutte (ou plus prĂ©cisĂ©ment, une page de 4Kio Ă la fois). Un cas particulier est le traitement des bibliothĂšques partagĂ©es, qui sont chargĂ©es en mĂ©moire de cette façon. Dans ce cas, le fichier est probablement dĂ©jĂ chargĂ© quelque part en mĂ©moire pour un autre processus, et il devrait ĂȘtre possible de rĂ©utiliser les mĂȘmes donnĂ©es. Le code testant cette possibilitĂ© ne fonctionnait pas Ă tous les coups, ce qui fait que des fichiers qui auraient pu ĂȘtre mappĂ©s tout de suite, ne lâĂ©taient pas. Une autre amĂ©lioration est dâutiliser plusieurs allocateurs sĂ©parĂ©s pour chaque processeur, pour rĂ©duire les blocages entre diffĂ©rents threads qui ont besoin de manipuler des pages de mĂ©moire. Suppression des zones mĂ©moire ----------------------------- Les applications Haiku peuvent crĂ©er des zones de mĂ©moires (appelĂ©es *areas*) qui disposent dâun identifiant unique et peuvent ĂȘtre partagĂ©es avec dâautres processus. Lorsquâune application sâarrĂȘte, il faut supprimer toutes les areas qui ont Ă©tĂ© créées. Cela Ă©tait fait par une simple boucle supprimant ces zones une par une. Mais cela pose un problĂšme: chaque suppression doit verrouiller la liste des areas puis la dĂ©verrouiller. Le code a Ă©tĂ© modifiĂ© pour verrouiller la liste une seule fois et retirer de la liste toutes les zones dâun seul coup, avant de faire les autres opĂ©rations de suppression qui nâont pas besoin dâaccĂ©der Ă la liste. Au total, toutes ces amĂ©liorations conduisent Ă une amĂ©lioration des performances de plus de 25% sur un test en conditions rĂ©elles (compilation dâune partie des sources de Haiku). Calcul des sommes de contrĂŽles des paquets rĂ©seau par le matĂ©riel ----------------------------------------------------------------- Dans un autre domaine, une perte de temps consĂ©quente est le calcul des checksums pour les paquets rĂ©seau reçus et envoyĂ©s. En effet, ce calcul Ă©tait fait systĂ©matiquement par le logiciel, mĂȘme si le matĂ©riel est capable de sâen charger. Il est maintenant possible pour les pilotes rĂ©seaux quâils sont capables de vĂ©rifier et de gĂ©nĂ©rer ces checksums par eux-mĂȘmes, et ainsi la pile rĂ©seau peut sâen dispenser. Cela permet aussi de se passer entiĂšrement de checksums sur les interfaces localhost, qui ne devraient pas subir de corruption de paquets, et ne gagnent rien Ă cette vĂ©rification. Cela a Ă©tĂ© Ă©galement lâoccasion de supprimer quelques copies des donnĂ©es des paquets rĂ©seau. user_mutex ----------- La structure `user_mutex` joue un rĂŽle similaire aux `futex` de Linux. Elle est utilisĂ©e pour implĂ©menter, par exemple, `pthread_mutex` et `pthread_rwlock`. LâimplĂ©mentation avait plusieurs bugs (race conditions), et a Ă©tĂ© remplacĂ©e par un nouveau systĂšme plus efficace. Au total, toutes ces amĂ©liorations permettent des performances 25% meilleures que la version beta 4 de Haiku. Il reste cependant de quoi faire, puisque certains benchmarks (compilation dâune partie du code source de Haiku) restent prĂšs de deux fois plus lent que lâopĂ©ration Ă©quivalente sous Linux. ChaĂźne de compilation ===================== Haiku est compilĂ© avec gcc, ld et les binutils. Ils nĂ©cessitent tout trois un petit nombre de patchs maintenus dans un dĂ©pĂŽt git dĂ©diĂ© et reversĂ©s dans les versions upstream autant que possible. Une version de gcc 2.95.3 est Ă©galement utilisĂ©e pour les parties du systĂšme assurant encore la rĂ©tro compatibilitĂ© avec BeOS, les versions plus rĂ©centes utilisent un [mangling](https://fr.wikipedia.org/wiki/D%C3%A9coration_de_nom) diffĂ©rent et ne sont pas inter opĂ©rables. Lâoutil de compilation utilisĂ© est Jam, dĂ©veloppĂ© Ă lâorigine par Perforce et dont il existe plusieurs forks dont un maintenu par Boost et un autre par Freetype. Haiku utilise sa propre version de Jam avec de nombreuses Ă©volutions. Commençons la liste des changements dans cette section avec des mises Ă jour de dĂ©pendances : Haiku est maintenant compilĂ© avec GCC 13.2 (la version 14 sera intĂ©grĂ©e prochainement). La bibliothĂšque ICU utilisĂ©e pour implĂ©menter toutes les fonctions dâinternationalisation (qui se trouve donc avoir un rĂŽle assez important dans la bibliothĂšque C standard) a Ă©tĂ© mise Ă jour en version 74. Le travail pour supprimer tous les avertissements du compilateur se poursuit petit Ă petit, mais les problĂšmes restants sont de plus en plus difficiles Ă corriger, soit parce quâil sâagit de code tiers (quâil est plus facile de garder en lâĂ©tat pour le synchroniser avec de nouvelles versions), soit parce que lâavertissement ne peut pas ĂȘtre corrigĂ© proprement sans perte de performance, ou encore dâune façon qui contente Ă la fois gcc 13 et gcc 2 pour les parties du code compilĂ©es avec ces deux versions. On peut toutefois mentionner que tous les [trigraphes](http://fvirtman.free.fr/recueil/01_08_03_01_trigraphes.c.php) prĂ©sents dans le code (par accident, par exemple il est facile dâĂ©crire « ??! » dans un commentaire) ont Ă©tĂ© supprimĂ©s. Ils ne sont plus disponibles dans C++ Ă partir de la version 17 et gĂ©nĂšrent des erreurs de compilation. Dâautre part, lâoption de compilation `-Wno-error=deprecated` a pu ĂȘtre dĂ©sactivĂ©e, car plus aucun code ne dĂ©clenche cette erreur. Puisquâon parle dâoptions de compilation : lâoptimisation « autovectorisation » pour la compilation du noyau a Ă©tĂ© dĂ©sactivĂ©e pour lâinstant. Cette option fait que le code utilise des instructions SSE, et faire cela dans le noyau problĂ©matique pour la plupart des machines virtuelles (QEMU, VMWare et Virtual Box). La plupart des autres noyaux nâutilisent pas ces instructions, ce qui fait que des bugs dans les hyperviseurs sont tout Ă fait possibles, par manque de tests. Mais le problĂšme pourrait aussi venir de Haiku. Lâinvestigation est, pour lâinstant, remise Ă plus tard. Un dernier changement dans le systĂšme de build consiste Ă permettre lâutilisation de `git worktree`. Quelques commandes git sont utilisĂ©es lors de la compilation pour calculer le numĂ©ro de version du code en train dâĂȘtre compilĂ©, et ça ne fonctionnait pas correctement dans ce cas de figure.