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.

AltStyle ă«ă‚ˆăŁăŠć€‰æ›ă•ă‚ŒăŸăƒšăƒŒă‚ž (->ă‚ȘăƒȘă‚žăƒŠăƒ«) /