Nouvelles de Haiku - 1er trimestre 2025
Il est temps de s'intéresser à nouveau aux nouveautés de Haiku pour ce dernier trimestre.
Les gros changements sont:
- Un nouvel allocateur mémoire qui permet enfin d'allouer plus de 3GiB par application (un reste de l'historique de Haiku sur les systèmes 32 bits), tout en étant plus rapide et moins gourmand en mémoire,
- Des raccourcis claviers sans touches modificatrices,
- De grosses mises à jour dans la bibliothèque C,
- La poursuite du nettoyage de code et de l'optimisation du navigateur de fichiers Tracker,
- La reprise du travail sur le pilote NFS4 pour les systèmes de fichiers en réseau,
- Et bien sûr, de très nombreuses corrections de bugs et petites améliorations un peu partout dans le système.
- lien nᵒ 1 : Rapport d'activité de février 2025
- lien nᵒ 2 : Rapport d'activité de mars 2025
- lien nᵒ 3 : Rapport d'activité d'avril 2025
Sommaire
- Google Summer of Code
- Applications
- Kits
- Serveurs
- Pilotes
- Systèmes de fichiers
- libroot
- Noyau
- Scripts de compilation
- Documentation
Google Summer of Code
Le Google Summer of Code est un programme organisé par Google pour encourager de nouveaux développeurs à se lancer dans la contribution aux logiciels libres. Il prend la forme d'un stage, où un projet de logiciel libre fournit un sujet et une équipe d'encadrement, et Google se charge de financer le nouveau contributeur pour quelques semaines.
Cette année, la candidature de Haiku a été rejetée, la préférence étant donnée à des projets engagés dans l'intelligence artificielle et dans la cybersécurité (deux domaines beaucoup demandés par les personnes souhaitant participer au programme). Ce n'est finalement peut-être pas une mauvaise chose pour Haiku: les développeurs d'autres projets se sont plaints d'avoir reçu des centaines de candidatures visiblement générées par des LLM sans aucun travail de préparation, ce qui leur demande donc beaucoup de temps pour faire le tri dans les candidatures. Les développeurs de Haiku vont cette année pouvoir se consacrer à d'autres tâches.
Applications
Tracker
Le travail de refonte du Tracker se poursuit. Les changements intégrés en début d'année ont provoqué un certain nombre de régressions qui sont corrigées petit à petit:
- Il est à nouveau possible d'ouvrir le dossier contenant un résultat de requête en double cliquant la colonne "emplacement" dans les résultats.
- Correction d'un crash et de problèmes de gestion de la mémoire et de problèmes de synchronisation entre threads.
- Ré-optimisation de la gestion des menus dynamiques pour éviter de les reconstruire à chaque clic de souris, mise en cache de certaines parties du menu dont la construction nécessite des accès disque (liste de patrons pour le menu "nouveau document", liste d'add-ons)
Toujours beaucoup de nettoyage de code à faire dans le Tracker:
- correction de dimensions en dur dans les menus spéciaux du Tracker,
- nettoyage du glisser-déposer,
- refactorisation de la logique de dessin,
- amélioraiton du chargement des add-ons,
Optimisation de la méthode de surveillance des dossiers, utilisation d'un "node monitor" (équivalent de inotify sous Linux) récursif pour surveiller un dossier et tous ses sous-dossiers au lieu de créer un monitor pour chaque dossier. Cela a nécessité des changements au niveau du noyau avec l'ajout du flag B_QUERY_WATCH_ALL
pour couvrir ce cas d'usage.
Par jscipione, waddlesplash
MediaPlayer
L'infobulle sur le "scrubber" (barre de navigation temporelle dans le fichier) s'affiche dès que la souris est au-dessus de la barre. Elle contient le marqueur de temps correspondant à la position de la souris, permettant de naviguer avec précision dans le fichier. Ceci a nécessité des évolutions dans BToolTip, la classe responsable des infobulles, qui n'était pas prévue pour faire des infobulles persistantes poursuivant le déplacement de la souris.
Ajout d'une option pour afficher une vidéo à 25% de sa taille originale (les contenus en 4K ou plus se faisant plus courants).
Par AkashKumar7902, x512, waddlesplash
WebPositive
WebPositive ne prétend plus savoir traiter les liens utilsant le protocole gopher. Ces liens ne fonctionnaient plus depuis le retour à l'utilisation de cURL pour la couche réseau de WebKit au lieu d'essayer de réimplémenter un client HTTP maison.
Amélioration de la gestion des sessions : sauvegarde du workspace utilisé pour chaque fenêtre, restauration de la session complète lorsque le navigateur est démarré en cliquant sur un lien, avec ouverture du lien dans une fenêtre du workspace courant s'il y en a déjà une, et dans une nouvelle fenêtre sinon.
Par nephele, ilzu
HaikuDepot
Amélioration de performances, en particulier lors de l'affichage des résultats de recherche, qui étaient très très lents sur les machines un peu anciennes.
Par apl, oco, waddlesplash
ProcessController
Affichage de "system resources" avant "caches" afin de rendre les statistiques d'utilisation mémoire plus claires et plus lisibles.
Correction de problèmes dans la mesure d'utilisation de resources par le noyau.
Par OscarL, waddlesplash
Terminal
Correction d'un bug d'initialisation de la couleur du curseur, visible principalement lorsque le terminal est utilisé comme réplicant dans une autre application. Cette possibilité est utilisée dans l'IDE Genio par exemple.
Par jackburton
StyledEdit
Interdiction d'entrer des caractères de contrôle ASCII dans un fichier texte (via les raccourcis clavier control+une lettre).
Par OscarL
Screenshot
Ajout de la possibilité de sélectionner un rectangle à capturer (en plus des possibilités existantes de capturer tout l'écran ou la fenêtre active).
Préférences
Nettoyage de code inutile dans les préférences d'affichage
Amélioration de la gestion des erreurs dans les préférences de sons si le dossier où devraient se trouver les fichiers son n'existe pas.
Par captain0xff, humdinger
Outils en ligne de commande
strace: Décodage des arguments passés à rlimit
ainsi que de l'argument "type" pour mmap
, affichage correct des valeurs de type ssize_t
ne pouvant pas être représentées sur 32 bits.
Fusion des outils query et filteredquery. Ces deux outils permettent de rechercher des fichiers à partir de leurs attributs (xattrs) qui sont indexés par le système de fichier. Cette méthode de recherche retourne tous les résultats, le filtrage pour limiter à certains dossiers doit donc être fait par l'outil après avoir récupéré les résultats de la recherche. Cette fonction étant très utile, il n'y a pas de raison de l'implémenter comme un outil séparé.
keymap: l'option -h
affiche l'aide, en conformité avec les bonnes pratiques d'interface utilisateur. L'option pour afficher un header est donc réaffectée et devient -H
.
leakanalyzer (outil d'analyse des fuites mémoire): ignore la mémoire allouée en interne par le "locale kit" pour le support des locales dans la librairie C, cette mémoire ne peut pas être libérée.
listusb: correction de l'alignement vertical du statut des ports qui n'était pas en face des autres informations affichées.
waitfor (petite application permettant d'attendre différents évènements, très utile dans certains scripts) peut maintenant attendre la disponibilité d'une connexion réseau.
Par humdinger, jmairboeck, korli, OscarL, waddlesplash
Kits
Interface Kit
Les raccourcis claviers pour les menus peuvent maintenant ne pas utiliser la touche "Commande" du clavier. Cela permet de définir des raccourcis sans touches modificatrices ou avec des touches non-standard. L'utilisation de ce type de raccourcis est relativement rare, mais nécessaire dans quelques cas particuliers. Par exemple, la touche "Supprimer" peut être utilisée pour supprimer un fichier ou un élément de liste de lecture, la touche "F2" pour renommer un fichier dans le Tracker, …
Correction de la gestion des raccourcis claviers dans BPopUpMenu
qui pouvaient être associés à la mauvaise fenêtre.
Amélioration du mode sombre: meilleure méthode de choix de la couleur de fond dans BTextView
, utilisation d'une combinaison de couleurs cohérentes pour les boutons des barres de défilement.
Ajout de définitions et de documentation pour tous les côdes de contrôle ASCII dans InterfaceDefs.h. Certains d'entre eux n'étaient pas documentés, ce qui pouvait laisser penser qu'il restait de la place libre utilisable pour coder d'autres choses.
Ajout de vérifications dans BMenuField::SetLabel
pour traiter correctement les labels NULL
.
Optimisations de BScrollView
et BColumnListView
pour limiter les rafraîchissements inutiles de l'affichage (dans le cadre des améliorations de performances pour HaikuDepot). Dans BColumnListView
, ajout d'APIs pour ajouter et supprimer un ensemble d'éléments d'un seul coup, ce qui est beaucoup plus rapide que de les traiter un par un.
Meilleure gestion du sémaphore de synchronisation des menus dans BWindow
. Tous les menus dans Haiku sont implémentés comme des fenêtres, ce qui signifie que chaque menu s'exécute dans un thread dédié avec sa propre boucle d'évènements. La synchronisation peut donc être particulièrement complexe.
Correction d'un use-after-free (utilisation de mémoire libérée qui ne devrait logiquement plus être accédée) dans BSlider
.
BDecimalSpinner
(un contrôle pour changer une valeur numérique au clavier ou avec des boutons '+' et '-') utilise BNumberFormat
et affiche donc le nombre en fonction des préférences de localisation.
Par apl, bitigchi, jscipione, korli, nipos, nephele, PulkoMandy, waddlesplash, x512
Support Kit
Modification de BObjectList
pour passer l'argument "owning" en paramètre de template plutôt qu'en paramètre du constructeur. Cela améliore les résultats d'analyse statique qui détectaient de nombreux faux positifs "double free" ou "use after free", et rend également plus difficile de faire des erreurs sur la gestion de la mémoire avec ces listes.
Certaines utilisations de BObjectList<BString>
ont été remplacées par la classe dédiée BStringList
, plus simple à utiliser pour ce cas particulier.
Amélioration de performances dans BList
, BMessage
et certaines parties du code les utilisant beaucoup pour réduire la quantité d'allocations mémoire dynamiques, en utilisant la pile comme stockage temporaire ou simplement en retardant au maximum les allocations. Par exemple, plutôt que de pré-allouer de la mémoire pour une liste dès la création de cette dernière, on attend l'insertion du premier élément dans la liste. On élimine ainsi des allocations dans les cas où du code crée une liste, mais n'insère finalement jamais rien dedans.
Amélioration des erreurs remontées par les classes de traitement de fichiers JSON.
Ajout de vérifications de pointeurs NULL
manquantes dans BString
pour corriger des crashs quand il n'y a plus de mémoire et qu'une allocation échoue.
Par ilzu, waddlesplash
Storage Kit
Amélioration de BFilePanel
pour mieux réagir lorsque le dossier de destination n'existe pas.
Inhibition de BBlockCache
lors de l'utilisation d'un allocateur mémoire de debug ou avec des gardes pour détecter les mauvaises utilisations mémoire. Dans ce cas, il vaut mieux se dispenser des gains de performance de la mise en cache mais détecter correctement l'utilisation de mémoire après sa remise à disposition dans le cache.
Ajout d'un type MIME pour les BMessage
serialisés sur disque (souvent utilisés pour sauvegarder les préférences d'applications par exemple).
Par augiedoggie, nephele, waddlesplash
Serveurs
input server
Amélioration du clavier virtuel pour se mettre à jour automatiquement lors des changements de résolution d'écran et de disposition du clavier. Ce clavier virtuel n'est pas inclus par défaut dans l'installation de Haiku, il est réservé aux personnes aventureuses qui utilisent Haiku sur une tablette ou qui débugguent un pilote de clavier en ne disposant que d'un écran tactile comme périphérique d'entrée.
Correction du traitement des appels systèmes interrompus (SIGINT
), ce qui permet à input server de s'arrêter (et de se redémarrer) lorsqu'on le lui demande. Cela est principalement utile pour tester les pilotes de périphériques d'entrée.
screen blanker
L'écran de veille utilise le mot de passe "système" (configuré dans /etc/passwd) au lieu d'implémenter son propre système de mot de passe. La commande screen_blanker permet de lancer l'écran de veille immédiatement, et peut être configurée comme un raccourci clavier pour implémenter un verrouillage simple de la session (note: ne faites pas confiance à l'écran de veille pour sécuriser votre session, actuellement il est assez facile à contourner par exemple à l'aide du debugger noyau).
launch daemon
Améliorations sur le launch_daemon: correction du traitement des conditions échouées pour lancer un service, ajout de la possibilité de définir une condition sur le contenu d'un fichier au format "driver settings" (format similaire aux fichiers ini) en plus des fichiers BMessage
(format binaire), correction de l'arrêt des services.
app server
Remise en route du test_app_server (outil de test permettant de lancer un deuxième app_server dans une fenêtre, et donc de tester des changements sur le serveur graphique sans avoir besoin de redémarrer tout le système).
Correction de bugs dans app_server pour l'affichage de texte: retrait de code dupliqué, ajout de nouveaux cas de test, meilleure gestion du clipping et des "bounding boxes" des glyphes, correction de problèmes sur les lignes de "décoration" (texte souligné, barré) utilisées en combinaison avec une transformation (rotation, déformation).
Par augiedoggie, korli, nipos, madmax
Pilotes
Le pilote i2c prend en charge les plateformes AMD en plus des machines PCH Intel. Le module i2c utilisé (conçu par Designware) est le même pour les deux fabricants à quelques petits détails près.
Amélioration de la détection du pointeur racine ACPI: ce pointeur était fourni par le bootloader sur les machines EFI, mais détecté par l'OS après démarrage sur les machines BIOS. C'est désormais la seule responsabilité du bootloader dans les deux cas, ce qui simplifie le code.
Correction d'un crash sur certaines machines dans le pilote des batteries ACPI.
Ajout de vérifications supplémentaires et corrections du traitement de quelques cas particuliers dans la pile XHCI (USB3).
La gestion des "révisions" des périphériques virtio a été mise en conformité avec la spécification virtio. Pour les anciennes versions de virtio, ce champ de la configuration PCI indiquait la version du protocole virtio à utiliser. Mais cela implique qu'un seul pilote virtio (identifiant les périphériques par leur ID PCI uniquement) doit implémenter toutes les versions de virtio. Pour les nouvelles spécifications, ce sera donc le "device ID" qui va changer, et il sera beaucoup plus simple de développer des pilotes spécifiques "virtio v1", "virtio v2", etc pour chaque version majeure.
Mise à jour des pilotes wifi iaxwifi200 (nommé iwx chez BSD) et ethernet atheros813x pour supporter de nouvelles générations de matériel. Import du nouveau pilote FreeBSD pour les cartes MT7601U, mais il n'y a pas encore de confirmation de son bon fonctionnement sous Haiku.
Nettoyage de code dans les pilotes SCSI et ralinkwifi.
Dans le pilote NVMe, activation de l'option de mise en veille automatique qui permet de réduire la consommation électrique lorsque le disque n'est pas sollicité (réduction de 1W constatée sur certaines machines).
Correction de problèmes dans les pilotes d'entrée (clavier, souris) qui empêchent de redémarrer l'input_server et de retrouver l'usage de ces périphériques.
Ajout de la tablette graphique Cintiq13HD dans le pilote Wacom.
Correction du pilote framebuffer pour ne mapper en mémoire que la zone utilisée pour le framebuffer, et pas toute la mémoire de la carte graphique. Non seulement cela réduit la consommation mémoire reportée, mais surtout, le reste de la mémoire peut ainsi être configuré pour autre chose (par exemple, de l'accélération 3D).
Ajout des cartes Polaris 10 et correction de quelques erreurs de versions du chipset pour d'autres cartes dans le pilote Radeon HD. Ces cartes récentes sont toujours désactivées dans le pilote, le support reste expérimental et peut conduire à un écran noir. Il vaut mieux donc utiliser les pilotes VESA ou framebuffer pour l'instant.
Par ilzu, korli, Lt-Henry, waddlesplash
Systèmes de fichiers
Poursuite d'investigations pour améliorer le temps d'exécution de "git status" qui est anormalement lent par rapport à la même opération sous Linux. Amélioration de l'itération sur les arbres B+ dans BFS, qui faisaient plusieurs "get" et "put" du même bloc disque successif (les opérations "get" et "put" permettent d'obtenir l'accès exclusif à un bloc disque, puis de le libérer, le cache de blocs se chargeant de lire les blocs depuis le disque, puis de les réécrire lorsque c'est nécessaire).
Amélioration également des verrous de parallélisme dans BFS, ce qui devrait corriger quelques kernel panic.
Correction d'un blocage de ramfs lors de l'utilisation de "trim" pour libérer de la mémoire.
Ajout d'un contrôle du flag O_DIRECTORY
dans plusieurs systèmes de fichiers lors de l'ouverture d'un fichier. En particulier cela permet d'écrire une image disque sur un disque à l'aide de la commande cp fichier.image /dev/disk/.../raw
.
Plusieurs corrections sur le pilote NFS4 qui était délaissé depuis quelque temps: gestion des inodes "périmés" (fichier présent dans un cache local, mais supprimé par une autre machine sur le serveur), et correction d'autres problèmes rendant le pilote instable. Ajout également de divers outils de debug pour investiguer l'état du pilote.
Le serveur userlandfs peut être lancé plusieurs fois (B_MULTIPLE_LAUNCH
), ce qui permet d'utiliser plusieurs systèmes de fichiers FUSE ou userlandfs en même temps.
Par augiedoggie, Jim906, waddlesplash, x512
libroot
Bibliothèque C standard
dlsym(RTLD_NEXT)
et d'autres fonctions similaires du runtime_loader recherchent maintenant les symboles dans toutes les régions ELF chargées, et pas seulement dans la première.
Ajout de RTLD_NOLOAD
dans la fonction dlopen
, ce qui permet d'accéder à des symboles déjà présents dans l'exécutable sans charger un fichier de librairie à nouveau. Il ne s'agit pas d'une fonction standard C ou POSIX, mais d'une extension proposée par GNU et la glibc.
Ajout de la fonction getloadavg
qui permet d'obtenir une mesure de la charge du système. Cela peut être simplement informatif (dans des outils comme htop
) ou utilisé pour allouer au mieux les ressources CPU (l'outil de build ninja
peut par exemple utiliser cette valeur pour décider combien de jobs lancer en parallèle)
Mise en conformité de l'ordre d'appel des destructeurs de pthread_key
(il faut potentiellement appeler les destructeurs plusieurs fois, jusqu'à PTHREAD_DESTRUCTOR_ITERATIONS
, pour contourner les problèmes d'interdépendances). Correction de l'ordre d'appel des destructeurs lors de l'arrêt d'une application: les destructeurs globaux C++ doivent être appelés avant les destructeurs de threads (il existe plusieurs méthodes pour enregistrer des fonctions à exécuter à l'arrêt d'un thread ou d'un programme, et c'est assez compliqué de toutes les séquencer correctement).
Une petite optimisation de pthread_cond_signal
pour éviter un appel système dans certains cas.
Poursuite du remplacement de fonctions de la libroot par les versions provenant de musl: memmove
, strlen
, strlcat
, ainsi que toutes les fonctions de conversions entre chaînes de caractères et nombres flottants.
Synchronisation de l'implémentation de glob
avec FreeBSD.
Optimisation de la famille de fonctions memcmp
, strcmp
, strncmp
: utilisation de comparaisons sur 64 bits lorsque c'est pertinent, retrait de calculs inutiles.
Réécriture et optimisation des fonctions génériques memcpy
et memset
(utilisées pour les machines qui n'ont pas une version optimisée manuellement en assembleur). Utilisation de la version optimisée de NetBSD pour les machines x86 32 bits. Pour la version 64 bits, le code utilisé par Haiku est meilleur que celui des autres systèmes, et reste donc en place. Le bootloader utilise uniquement la version générique pour simplifier les choses (il n'a pas besoin de fonctions de très haute performance).
Correction de la fonction write()
avec une taille supèrieure à 2Gio sur les systèmes 64 bits (la taille était accidentellement tronquée à 32 bits).
Mise en conformité POSIX de la fonction dup3
: retour de EINVAL si l'ancien et le nouveau descripteur de fichier sont identiques.
Déplacement de la fonction qsort_r
de la libgnu vers la libroot (elle a été standardisée dans POSIX Issue 8). Il s'agit d'une version de qsort permettant de passer un paramètre supplémentaire à la fonction de comparaison contenant un contexte réservé à l'utilisateur de la fonction.
Nettoyage du code restant dans la libroot qui provient de la glibc: retrait de déclarations internes présentes dans les en-têtes publics, retrait de fonctions qui ont déjà été remplacées, suppression de fichiers non utilisés, remplacement d'un maximum de fonctions par les versions de musl ou de BSD, ajout des fonctions stdio_ext de musl en remplacement des fonctions privées supprimées, retrait d'une partie des fonctions mathématiques au profit de celles de musl, retrait d'une couche d'abstraction pour l'interfaçage entre la glibc et le support des locales dans Haiku. Certaines parties de la glibc continuent d'être utilisées pour assurer la compatibilité avec BeOS, mais l'objectif est de minimiser cette partie et d'utiliser les fonctions de BSD ou de musl, qui sont souvent beaucoup plus simples. La raison est que la glibc est conçue pour pouvoir être utilisée comme librairie C alternative sur de nombreux systèmes, et doit donc avoir un comportement très proche de la librairie C originale. Par exemple, le format des nombres "long double" peut être différent d'une architecture et d'un système à l'autre, et la glibc implémente de nombreux formats spécifiques, là où musl se contente des formats les plus classiques.
Mise à jour de getopt
, printf
et scanf
avec la verson de la glibc 2.41. Pour l'instant ces fonctions continuent d'utiliser la version de la glibc, afin de préserver la compatibilité avec les applications existantes (notamment les applications pour BeOS). En effet, des structures internes sont exposées dans l'ABI et ne peuvent pas être facilement remplacées par une autre implémentation.
Tous ces changements sur la librairie C standard sont faits également en collaboration avec un développeur de la gnulib, dont la suite de tests permet de repérer de nombreux comportements incorrects ou non standards.
Gestion de la mémoire
Finalisation d'un gros chantier de refonte de la gestion de la mémoire, avec en particulier la possibilité de fusionner des zones de mémoire adjacentes lorsqu'elles sont redimensionnées. Suite à ces changements, l'allocateur mémoire hoard2 a pu être remplacé par une nouvelle implémentation basée sur celle de OpenBSD, avec quelques adaptations et améliorations spécifiques à Haiku, dont en particulier un cache d'allocation global pour chaque application. Le nouvel allocateur est légèrement plus rapide en général, et plusieurs ordres de grandeur plus rapide sur certains cas particuliers (par exemple: gcc avec les options de link-time-optimization, ou le compilateur SDCC, ou un test de compilation passe de plusieurs heures à une ou deux minutes). Ce nouvel allocateur est également moins consommateur de mémoire et permet aux applications d'allouer plus de mémoire (hoard2 limitait les allocations à environ 3Go y compris sur les systèms 64 bits).
Amélioration des messsages d'erreur de la "guarded heap" (allocateur mémoire de débug) pour afficher des messages d'erreurs plus spécifiques au lieu de "generic segfault".
Autres changements
Ajout de macros manquantes dans le fichier elf.h ainsi que de la constante MAP_FILE (inutile mais présente sur Linux et tous les systèmes BSD) pour faciliter le portage de WebKit.
Interdiction de l'appel de create_sem
avec un compteur négatif. Cela était interdit par BeOS mais autorisé par Haiku et il n'y a pas vraiment de raison de le faire.
Modification du code assembleur d'appel des appels systèmes pour inclure des informations de debug sur la pile d'appels. D'autre part, dladdr
a été modifié pour pouvoir accéder aux informations sur ces symboles, qui sont chargés dans la commpage (une zone de mémoire partagée entre le noyau et les processus utilisateurs, qui n'est pas à proprement parler une section de code classique en mémoire). Cela permet à libunwind d'analyser une stacktrace comprenant un appel système.
Par korli, PulkoMandy, trungnt2910, waddlesplash, zeldakatze
Noyau
Désactivation des états de veille C5 et C6 sur les machines Intel "Skylake", car elles empêchent ces machines de démarrer correctement pour l'instant.
Réparation du cache d'objets "guarded heap" qui permet de détecter et d'investiguer certains problèmes d'allocation mémoire dans le noyau.
Traitement d'un cas d'erreur dans le cache de fichiers, si la taille d'un fichier est devenue plus petite que son cache entre le moment ou une application demande un accès et le moment où l'accès va effectivement être réalisé.
Protection de l'accès à certains "spinlock" par des mutex. L'accès aux spinlocks doit être rapide, puisque l'attente est faite de façon active et monopolise un coeur de CPU. Il faut donc s'assurer que le spinlock pourra être rapidement disponible. En particulier, l'affichage de logs à l'écran lors du démarrage pouvait considérablement ralentir les choses (l'affichage se fait page à page et le processus de démarrage est mis en pause en attendant que l'utilisateur appuie sur une touche).
Déplacement de la calibration du timer APIc x86 dans le noyau au lieu du bootloader. Amélioration de la précision de la mesure et utilisation de la calibration fournie via les registres CPUID si elle est disponible (c'est le cas pour certains hyperviseurs par exemple, sur lesquels le système virtualisé peut difficilement faire lui-même une mesure fiable).
Correction du traitement d'un cas particulier par mprotect, qui se manifestait par un kernel panic lors de l'utilisation du navigateur Iceweasel.
Ajout d'un timeout sur l'envoi d'infos sur le port série sur les machines x86. Par exemple sur le Steam Deck, le port série n'est pas du tout présent et cela empêchait le démarrage du système.
Réécriture de la fonction x86_{read|write}_msr pour les machines 32 bit en tant que fonction inline (c'était déjà le cas pour les machines 64 bits).
Correction de problèmes trouvés en essayant de démarrer Haiku sur un laptop très récent: ajout du support de X2APIC dans le bootloader EFI, allocation de la page "PML4" avec une adresse physique < 4Go pouvant être codée sur 32 bits, et à l'inverse traitement correct de la table GDT lorsqu'elle se trouve au-delà de cette limite de 4Go.
Déplacement de code de bfs vers le VMCache générique pour traiter le cas particulier du mmap sur un fichier dont la taille n'est pas un multiple de la taille de pages du système. La dernière page doit alors être remplie avec des 0. Cela avait été corrigé pour bfs, mais le problème était également présent pour d'autres systèmes de fichiers dont en particulier ramfs.
Réécriture des FIFOs noyaux (utilisés pour implémenter pipe(2)
). Le benchmark stress-ng --pipe 1
passe de 230 Mo/s à 2.5Go/s (dans une machine virtuelle).
Ajout d'une option syslog_max_history pour pouvoir conserver plus que 2 fichiers de syslog (ce qui reste l'option par défaut).
Nettoyage et optimisation de la structure Thread utilisée dans le noyau pour représenter les threads: utilisation d'une liste doublement chaînée pour accélérer les manipulations de la liste, correction du décomptage du temps CPU utilisé par les processus, correction d'une fuite mémoire, et correction d'un problème dans la fonction get_next_thread_info si les identifiants de threads bouclent (c'est-à dire que plus de 4 milliards de threads ont été créés et que des identifiants de threads ont donc dû être recyclés).
Le kernel panic se produisant si un thread tente de libérer un mutex qui ne lui appartient pas affiche automatiquement la stacktrace du thread qui est propriétaire du mutex.
Ajout d'un appel à cpu_pause dans le code des conditions variables pour réduire la consommation électrique inutile lors d'une attente active.
Correction de plusieurs problèmes de sauvegarde du contexte de la FPU pour l'architecture x86_64:
- Remise à 0 de l'état de la FPU lors des changements de threads,
- Stockage de l'état de la FPU dans la structure d'info sur le thread au lieu de la stocker sur la pile,
- Envoi des bons codes d'exception FPE_* lors des exceptions SIGFPE,
- Gestion des "control words" lors des changements de contexte.
Cela corrige des crashs d'application et même des kernel panic dans certains cas.
Les drapeaux de protection des zones de mémoire du noyau ne sont plus visibles par les utilisateurs non privilégiés. L'utilisateur "user" principal peut toujours y accéder, cela est utilisé par exemple par ProcessController. Correction d'un flag mal positionné pour les zones mémoire de l'allocateur "slab", qui n'étaient pas indiquées comme accessibles en écriture.
Renommage des fonctions concernant la gestion des interruptions pour éviter l'abbréviation "int" qui pouvait prêter à confusion avec "integer" dans certains cas. Utilisation du mot complet "interrupt" lorsque c'est possible, ou à défaut de "intr".
Correction d'une fuite de mémoire dans la gestion de la mémoire physique avec du paging à 5 niveaux (LA57).
Correction d'un interblocage dans le cache du système de fichier identifié à l'aide des tests de gVisor.
Correction d'un bug dans la fonction vsnprintf du noyau qui n'affichait pas correctement les nombres inférieurs à 0.1 (les 0 après le point étaient perdus, et donc 0.01, 0.001. 0.0001, … étaient tous affichés comme 0.1).
L'appel système create_dir
retourne EEXIST
si un fichier ou un dossier existe déjà à l'endroit demandé, et ce, même si le système de fichier est en lecture seule. Auparavant, l'appel système retournait EROFS
, ce qui perturbe certaines applications.
Amélioration du traitement des "doubles fautes" (lorsque le traitement d'une exception matérielle déclenche une autre exception matérielle) sur x86. Le registre GS était corrompu, ce qui empêchait l'utilisation du debugger dans ce cas, et plusieurs autres problèmes conduisaient vraissemblablement à une "triple faute" (une exception dans le traitement de l'exception dans le traitement de… bon vous voyez le principe), et à un redémarrage de la machine car à ce stade il est peu probable qu'aucune autre opération ne remette le système dans un état cohérent.
Bootloader
Amélioration du bootloader PXE pour afficher clairement "Network" dans la méthode de démarrage, ainsi que l'adresse IP du serveur de disque fournissant le rootfs.
Remise en route du développement sur la console graphique utilisée pour simuler un mode texte pour le menu de démarrage, lorsque la machine ne fournit pas un mode texte matériel ou au niveau de son BIOS (c'est le cas par exemple sur certains Chromebooks avec SeaBIOS). Pour l'instant, cela nécessite une version du bootloader compilée spécifiquement pour ce cas de figure, car on ne sait pas encore détecter de façon fiable si le mode texte du BIOS est disponible.
Par Anarchos, augiedoggie, korli, phcoder, waddleslplash
Scripts de compilation
Poursuite du travail pour corriger tous les warnings détectés par le compilateur, ainsi que quelques problèmes détectés par les sanitizers de gcc (libasan et libubsan) qui sont maintenant compatibles avec Haiku.
Correction de problèmes empêchant de cross-compiler Haiku depuis FreeBSD ou un système Linux utilisant la libc musl. Correction également de problèmes pour le build depuis macOS.
Suppression de fichiers inutiles dans la version de unzip intégrée dans le build de Haiku.
Généralisation des options permettant d'activer la "stack protection" à plus de parties du système.
Remplacement de la commande which
par command -v
. Cette dernière est un builtin de la plupart des shells, elle est donc plus rapide à exécuter et ne nécessite pas une dépendance supplémentaire.
Migration de Python 2 à Python 3 pour le script générant les fichiers "libroot stubs" (utilisé uniquement lors du bootstrapping de Haiku pour une nouvelle architecture).
Mise à jour de la version de m4
utilisée pour le bootstrap de Haiku (compilation de tous les paquets à partir des sources, utile en particulier pour le portage sur une nouvelle architecture).
Ajout des modules PCI manquants dans l'image de bootstrap.
Par korli, PulkoMandy, waddlesplash
Documentation
Ce trimestre, il y a principalement du travail sur la documentation interne. Il s'agit d'un document destiné aux développeurs de Haiku, par opposition aux développeurs d'applications pour Haiku, qui se tourneront plutôt vers le Haiku book pour les informations sur les interfaces publiques du système.
Mise à jour de la documentation sur la procédure à suivre pour synchroniser du code avec d'autres systèmes. Haiku réutilise du code de FreeBSD, NetBSD, OpenBSD, musl et quelques autres, et maintient également deux copies de gcc et des binutils. Il est important d'avoir une procédure bien définie pour tracer ce qui a été importé, depuis quelle version, et quels changements ont été effectués. Plusieurs documentations existaient avec différentes fçons de faire, dont certaines étaient obsolètes.
Dans la documentation du device manager, ajout d'une image montrant un exemple de device tree, pour mieux visualiser ce qui est expliqué dans la page.
Déplacement d'articles sur l'implémentation des appels systèmes du site web principal vers la documentation interne (dans le cadre d'un très long projet pour réorganiser la documentation et libérer le site principal de nombreux articles techniques pour en faire une vitrine plus orientée vers les utilisateurs).
Ajout dans la documentation interne d'un article sur le profilage et l'analyse de performance des applications.
Correction de liens internes morts dans la documentation interne sur la gestion des paquets, suite à des erreurs de formatage.
Mise à jour de la documentation interne sur le processus de bootstrap.
Par kuku929, oco, PulkoMandy, waddlesplash
Commentaires : voir le flux Atom ouvrir dans le navigateur