Qu'est-ce qu'un défaut de segmentation ?
Défaut de segmentation ou violation d'accès ( erreur de segmentation en bref) est une condition de défaillance ou un défaut provoqué par le matériel avec protection de la mémoire, alertant un système d'exploitation que le logiciel a tenté d'accéder à une zone de mémoire restreinte (une violation d'accès à la mémoire).
Il s'agit d'un formulaire de défaut de protection général sur les systèmes x86 standard. En réponse, le noyau du système d'exploitation mettra généralement en œuvre quelques opérations correctives, transmettant généralement cette erreur au processus incriminé en lui transférant un signal.
Dans certains cas, les processus peuvent installer un gestionnaire de signal, leur permettant de récupérer par eux-mêmes, mais sinon, le gestionnaire de signal par défaut du système d'exploitation est utilisé, conduisant généralement à l'arrêt anormal du processus, et parfois à un core dump.
- Les erreurs de segmentation sont une classe d'erreur de base dans les programmes spécifiés dans de nombreux langages tels que C langage qui offre un accès à la mémoire de bas niveau et certains contrôles de sécurité.
- Principalement, ils surviennent en raison de nombreuses erreurs dans les pointeurs utilisés pour l’adressage de la mémoire virtuelle, en particulier les accès illégaux.
- D'autres types de défauts d'accès à la mémoire sont un erreur de bus , qui comprend également plusieurs causes.
- Ceux-ci apparaissent principalement en raison d’un adressage de la mémoire physique inexact ou d’un accès à la mémoire mal aligné.
- Il s'agit de références mémoire que le matériel ne peut pas traiter au lieu de références que le processus n'est pas autorisé à traiter.
- Plusieurs langages de programmation peuvent appliquer des mécanismes créés pour éviter les erreurs de segmentation et développer la sécurité de la mémoire. Par exemple, le Rouiller Le langage de programmation applique un modèle basé sur la propriété pour garantir la sécurité de la mémoire. Une autre langue comme Java et Zézayer applique le garbage collection, qui ignore de nombreuses classes d'erreurs de mémoire susceptibles de provoquer des erreurs de segmentation.
Présentation de l'erreur de segmentation
- Une erreur de segmentation apparaît lorsqu'un programme tente d'accéder à un emplacement mémoire auquel il n'est pas autorisé à accéder ou tente d'accéder à un emplacement mémoire d'une manière qui n'est pas autorisée (par exemple, en tentant d'écrire dans un emplacement en lecture seule ou d'écraser le partie du système d’exploitation).
- En informatique, le mot 'segmentation' a plusieurs utilisations. A la manière de défaut de segmentation, mot utilisé depuis 1950, il définit l'espace d'adressage du programme, seul l'espace d'adressage du programme est lisible avec protection mémoire, et de celui-ci, juste la pile et la partie lecture-écriture du segment de données. du programme est accessible en écriture. Par conséquent, tenter de lire en dehors de l’espace d’adressage du programme ou d’écrire dans la partie en lecture seule de l’espace d’adressage entraîne une erreur de segmentation.
- Une erreur de segmentation apparaît si le matériel détecte une tentative de référence à un segment inexistant, un emplacement extérieur aux limites du segment ou un emplacement dans un style non autorisé par les autorisations accordées pour le segment sur les systèmes utilisant la segmentation mémoire de le matériel pour fournir de la mémoire virtuelle.
- Généralement, une erreur de page non valide provoque une erreur de segmentation sur les systèmes utilisant uniquement la pagination. Les défauts de page et les défauts de segmentation sont tous deux des défauts résultant du système de gestion de la mémoire virtuelle. En outre, une erreur de segmentation peut survenir indépendamment des erreurs de page ; l'accès illégitime à n'importe quelle page valide est la faute de segmentation. La faute de segmentation peut apparaître au milieu d'une page. À l'intérieur d'un débordement de tampon qui réside dans une page mais écrase illégalement la mémoire par exemple.
- Dans un premier temps, la faute vient de UMM ( unité de gestion de mémoire ) sur un accès illégal, en tant que segment de son aspect de protection de la mémoire, ou sur une erreur de page invalide au niveau matériel. Si le problème n'est pas une adresse logique invalide mais plutôt une adresse physique invalide, l'erreur de bus survient plutôt. Donc, ceux-ci ne sont pas toujours distingués.
- Cette erreur est détectée et un signal est envoyé au processus incriminé, activant le gestionnaire du processus pour ce signal au niveau du système d'exploitation. Différents types de systèmes d'exploitation ont des noms de signaux distincts pour indiquer qu'une erreur de segmentation est apparue.
- Un signal appelé SIGSEGV (court pour violation de segmentation ) est transféré au processus incriminé sur les systèmes d'exploitation de type Unix. Le processus incriminé obtient une exception, c'est-à-dire STATUS_ACCESS_VIOLATION sur Microsoft Windows.
Causes du défaut de segmentation
Les circonstances dans lesquelles une erreur de segmentation apparaît et comment elle se manifeste sont spécifiques au système d'exploitation et au matériel. Différents matériels génèrent différentes pannes dans plusieurs circonstances et différents systèmes d'exploitation les transforment en différents signaux envoyés aux processus.
La cause à venir peut être une violation de l'accès à la mémoire, bien que la cause sous-jacente soit un bogue logiciel de plusieurs sortes. Déboguer un bug ou déterminer la cause première peut être facile dans quelques cas, dans lesquels le programme entraînera systématiquement une erreur de segmentation. Cependant, le sac peut être difficile à reproduire et dépendre de l'allocation de mémoire à chaque exécution dans d'autres cas.
Voici quelques causes typiques de l’erreur de segmentation :
- Tentative d'accès à une adresse mémoire inexistante (externe à l'espace d'adressage du processus)
- Tentative d'accès à la mémoire sur laquelle un programme n'a pas de droits (comme structures du noyau dans le contexte du processus)
- Tentative d'écriture de mémoire en lecture seule (comme segment de code )
- À leur tour, ces problèmes sont souvent dus à de nombreuses erreurs de programmation qui entraînent un accès mémoire non valide :
- Tentative d'exécution d'un programme qui ne se compile pas correctement. (Quelques compilateurs génèreront un fichier exécutable quelle que soit l'existence d'erreurs de compilation.)
- Un débordement de pile
- Un débordement de tampon
- Affectation ou déréférencement à un pointeur libéré (un pointeur pendant , qui indique la mémoire qui a été supprimée/libérée/libérée)
- Affectation ou déréférencement à un pointeur non initialisé (un pointeur sauvage , qui indique une adresse mémoire aléatoire)
- Déréférencement à un pointeur nul indique généralement une adresse qui ne fait pas partie de l'espace d'adressage du processus
Des défauts de segmentation apparaissent souvent dus à des erreurs dans l'utilisation d'un pointeur, notamment dans Allocation de mémoire dynamique C en code C. Déréférencement à un pointeur nul , qui aboutit à un comportement indéfini, conduira à une erreur de segmentation. Cela est dû à un pointeur nul qui ne peut pas être une adresse mémoire valide. Le pointeurs pendants et pointeurs sauvages indique une mémoire qui peut ou non exister et qui peut ou non être inscriptible ou lisible et peut donc entraîner des bogues transitoires.
Résoudre l'erreur de segmentation dans Ubuntu
Cette erreur peut frapper notre système Ubuntu à tout moment. L'erreur de segmentation se produit lorsque notre système tente d'accéder à une page de mémoire qui n'existe pas. Carottage sous-évalué définit le moment où une partie de code tente d'effectuer une opération d'écriture et de lecture sur un emplacement libre ou en lecture seule. En général, erreurs de segmentation sont associés à un fichier nommé core et surviennent au moment de la mise à niveau.
Lors de l'exécution de quelques commandes au moment de la situation de core dump, nous pourrions rencontrer le 'Impossible d'ouvrir le fichier de verrouillage' erreur. Cela est dû au fait que le système tente de prendre un morceau de bloc qui n'existe pas. C'est à cause du crash des binaires de quelques programmes spécifiques.
Nous sommes peut-être en train de déboguer ou de revenir en arrière pour le résoudre, mais la solution consiste à réparer les packages cassés en mettant en œuvre certaines étapes mentionnées comme suit :
1. Supprimez les fichiers de verrouillage disponibles à des emplacements distincts.
$ sudo rm -rvf /var/lib/apt/lists/lock /var/cache/apt/archives/lock /var/lib/dpkg/lock and restart our system
2. Suppression du cache du référentiel.
$ sudo apt-get clean all
3. Mettez à niveau et mettez à jour notre cache de référentiel.
$ sudo apt-get update
$ sudo apt-get upgrade
4. Mettez maintenant à niveau notre distribution, cela mettra à jour nos packages.
$ sudo apt-get dist-upgrade
5. Recherchez les paquets cassés et supprimez-les avec force.
$ sudo dpkg -1 | grep ^..r | apt-get purge
Une excellente méthode qui fonctionnera toujours est la suivante, en dehors de la ligne de commande :
fonctionnalités de Java 8
- En mode démarrage, exécutez Ubuntu en cliquant sur le bouton Échap clé après le redémarrage.
- Choisir ' Options avancées pour Ubuntu
- En mode de récupération, exécutez Ubuntu et plusieurs options nous seront mentionnées.
- Tout d'abord, choisissez le 'Réparer les colis cassés'
- Ensuite, choisissez le 'Reprendre le démarrage normal'
Nous disposons désormais de deux manières de résoudre les erreurs de segmentation dans l'interface graphique et la CLI. Parfois, il peut également arriver que la commande, c'est-à-dire apt, ne fonctionne pas à cause du erreur de segmentation , donc la méthode CLI ne sera pas implémentée. Dans cette situation, ne vous inquiétez pas car la méthode GUI fonctionnera toujours pour nous.
Gestion des erreurs de segmentation
La tâche par défaut pour une erreur de bus ou une erreur de segmentation est la fin anormale d'un processus qui l'a rencontrée. Un fichier principal peut être produit pour faciliter le débogage, et d'autres tâches dépendant de la plate-forme peuvent également être implémentées. Par exemple, de nombreux systèmes Linux appliquant le correctif de sécurité pourrait se connecter Signaux SIGSEGV pour surveiller d'éventuelles tentatives d'intrusion avec débordements de tampon.
Sur quelques systèmes, comme Windows et Linux, il est possible qu'un programme gère lui-même une erreur de segmentation. Le programme en cours d'exécution peut non seulement gérer l'événement, mais peut également extraire quelques détails sur son état, tels que les valeurs du registre du processeur, l'obtention d'une trace de pile, la ligne d'un code source lorsqu'il a été rencontré, l'adresse mémoire à laquelle l'accès n'a pas été valide, et si la tâche était une écriture ou une lecture en fonction du système d'exploitation et de l'architecture.
Cependant, une erreur de segmentation définit qu'un programme a une erreur qui doit être corrigée. Il est également possible de provoquer une telle erreur intentionnellement à des fins de test, de débogage et également pour imiter des plates-formes dans lesquelles un accès direct à la mémoire est requis. Le système doit être capable de permettre au programme de s'exécuter même après que l'erreur se soit produite dans ce dernier cas.
Dans cette situation, lorsque le système le permet, il est possible de gérer l'événement et d'améliorer le compteur du programme du processeur pour 'saut' sur l'instruction défaillante de procéder à l'exécution.
Exemples de faute de segmentation
Écriture dans la mémoire morte
Il en résulte un défaut de segmentation. Il apparaît lorsque le programme écrit dans une partie de son segment de code ou dans la partie en lecture seule du segment de données aux niveaux d'erreur de code, car ceux-ci sont chargés via le système d'exploitation dans la mémoire morte.
Déréférencement de pointeur nul
En C et dans d'autres langages de type C, les pointeurs nuls sont utilisés pour la signification 'pointeur vers aucun objet' et en tant qu'indicateur d'erreur et le déréférencement dans le pointeur nul (une écriture ou une lecture à partir d'un pointeur nul) est une erreur de programme très basique.
La norme ne dit pas que le pointeur nul est similaire au pointeur vers une adresse mémoire 0, bien que cela puisse être le cas. Presque tous les systèmes d'exploitation mappent l'adresse du pointeur nul de telle sorte que son utilisation entraîne une erreur de segmentation.
Ce comportement n’est garanti par aucun standard C. En C, le déréférencement du pointeur nul est le comportement indéfini , et une implémentation conforme est autorisée à supposer qu'un pointeur déréférencé n'est pas nul.