Que signifie le message "erreur de bus", et en quoi diffère-t-il d'un message d'erreur de bus ? défaut de segmentation ?
Ils ne sont pas rares ; j'en suis à l'exercice 9 de How to Learn C the Hard Way et j'en ai déjà rencontré un...
Que signifie le message "erreur de bus", et en quoi diffère-t-il d'un message d'erreur de bus ? défaut de segmentation ?
Les erreurs de bus sont rares de nos jours sur x86 et se produisent lorsque votre processeur ne peut même pas tenter l'accès mémoire demandé, typiquement :
Les défauts de segmentation se produisent lors de l'accès à la mémoire qui n'appartient pas à votre processus. Elles sont très courantes et sont généralement le résultat de :
PS : Pour être plus précis, ce n'est pas la manipulation du pointeur lui-même qui posera problème. C'est l'accès à la mémoire vers laquelle il pointe (déréférencement).
Ils ne sont pas rares ; j'en suis à l'exercice 9 de How to Learn C the Hard Way et j'en ai déjà rencontré un...
Une autre cause d'erreurs de bus (sous Linux en tout cas) est lorsque le système d'exploitation ne peut pas sauvegarder une page virtuelle avec de la mémoire physique (par exemple, en cas de manque de mémoire ou de pages énormes lorsqu'on utilise une mémoire de page énorme). En général, mmap (et malloc) ne font que réserver l'espace d'adressage virtuel, et le noyau assigne la mémoire physique à la demande (ce que l'on appelle les défauts de page souples).
Pour moi la partition contenant /var/cache
était tout simplement plein askubuntu.com/a/915520/493379
Un défaut de segmentation consiste à accéder à une mémoire à laquelle on n'a pas le droit d'accéder. Elle est en lecture seule, vous n'avez pas la permission, etc...
Une erreur de bus consiste à essayer d'accéder à une mémoire qui ne peut pas être là. Vous avez utilisé une adresse qui n'a pas de sens pour le système, ou le mauvais type d'adresse pour cette opération.
Je crois que le noyau lève le SIGBUS. lorsqu'une application exhibe des données un mauvais alignement des données sur le bus de données. Je pense que que puisque la plupart [ ?] des compilateurs modernes pour la plupart des processeurs pad / alignent les données pour les programmeurs, les problèmes d'alignement d'antan (au moins) atténués, et donc on ne voit pas de SIGBUS trop souvent de nos jours (AFAIK).
De : Aquí
Cela dépend des mauvais tours que vous faites avec votre code. Vous pouvez déclencher une erreur BUS/un piège d'alignement si vous faites quelque chose de stupide comme faire des calculs de pointeur et ensuite faire un typcast pour accéder à un mode problématique (c'est-à-dire que vous configurez un tableau uint8_t, ajoutez un, deux ou trois au pointeur du tableau et ensuite faites un typcast vers un short, un int ou un long et essayez d'accéder au résultat en question). Les systèmes X86 vous permettent de le faire, mais avec une réelle pénalité de performance. QUELQUES-UNES Les systèmes ARMv7 vous permettront de le faire, mais la plupart des systèmes ARM, MIPS, Power, etc. vous en tiendront rigueur.
Un exemple classique d'erreur de bus se trouve sur certaines architectures, telles que le SPARC (au moins sur certains SPARC, cela a peut-être été modifié), c'est lorsque vous faites un accès mal aligné. Par exemple :
unsigned char data[6];
(unsigned int *) (data + 2) = 0xdeadf00d;
Cet extrait tente d'écrire la valeur entière de 32 bits 0xdeadf00d
à une adresse qui n'est (très probablement) pas correctement alignée, et générera une erreur de bus sur les architectures qui sont "pointilleuses" à cet égard. Le x86 d'Intel l'est, d'ailleurs, pas une telle architecture. Elle permettrait l'accès (bien que l'exécution soit plus lente).
Dans le cas présent, j'avais data[8] ; C'est maintenant un multiple de 4 dans une architecture 32 bits. Il est donc aligné. Est-ce que je vais encore avoir l'erreur maintenant ? Veuillez également m'expliquer si la conversion du type de données pour les pointeurs est une mauvaise idée. Cela va-t-il provoquer des erreurs d'alignement sur une architecture fragile ? Veuillez élaborer, cela m'aidera.
Heh. Il ne s'agit pas tant de conversion de type que de conversion de type sur un pointeur sur lequel on a fait des calculs de pointeur. Regardez soigneusement au code ci-dessus. Le compilateur a soigneusement aligné les mots-clés de votre pointeur pour les données - et puis vous avez tout fait foirer sur le compilateur en décalant la référence par TWO et en faisant un typcasting pour un accès très nécessaire aligné sur les mots-clés sur ce qui va être une frontière non-mot.
"Fragile" n'est pas le mot que j'utiliserais pour tout cela. Les machines et le code X86 ont amené les gens à faire des choses plutôt stupides depuis un certain temps maintenant, ceci étant l'un d'entre eux. Repensez votre code si vous avez ce genre de problème - il n'est pas très performant sur X86 pour commencer.
Cela signifie normalement un accès non aligné.
Une tentative d'accès à une mémoire qui n'est pas physiquement présente donnerait également une erreur de bus, mais vous ne verrez pas cela si vous utilisez un processeur avec une MMU et un OS qui n'est pas bogué, parce que vous n'aurez pas de mémoire inexistante mappée dans l'espace d'adressage de votre processus.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
13 votes
J'aimerais ajouter une explication simple pour les deux : Une erreur de segmentation signifie que vous essayez d'accéder à une mémoire à laquelle vous n'êtes pas autorisé (c'est-à-dire qu'elle ne fait pas partie de votre programme). Par contre, une erreur de bus signifie généralement que vous essayez d'accéder à une mémoire qui n'existe pas (par exemple, vous essayez d'accéder à une adresse à 12G mais vous n'avez que 8G de mémoire) ou si vous dépassez la limite de la mémoire utilisable.
0 votes
Sur quelle plateforme avez-vous vu cela ? SUR PC ? Mac ? x86 ? 32/64 ?