Le probleme du signal 11
Rogier Wolff (
[email protected]
<mailto:
[email protected]>)
(traduit par Nat Makarevitch
[email protected]
<mailto:
[email protected]>)
Version 19970716fr
Cette FAQ dresse liste des causes possibles d'un probleme que connais-
sent ces derniers temps certains utilisateurs de Linux : la compila-
tion d'un important ensemble logiciel (-- (par exemple le noyau)--)
echoue a cause d'un _s_i_g_n_a_l _1_1. Ce probleme peut etre cause par un
dysfonctionnement d'ordre materiel (cas le plus frequemment observe)
ou logiciel.
11.. AA pprrooppooss ddee ccee ddooccuummeenntt
La version originale <
http://www.bitwizard.nl/sig11/> de ce document
est a present integree a la collection des "Mini-Howto" de Linux.
La version publiee sur le Web etait consultee 300 fois par semaine en
juin 1996 (augmentation : facteur 3 en 3 mois).
La plus recente version de ce texte, librement utilisable s'il n'est
pas modifie, sur trouve sur son site de reference
<URL:
http://www.linux-france.com/> <
http://www.linux-france.com/>
Tout commentaire et compte-rendu d'experience interesse l'auteur
(Rogier Wolff <
[email protected]>
<mailto:
[email protected]>) mais les suggestions d'ajouts
techniquement sans valeur seront rejetees.
Expedier a
[email protected] <mailto:
[email protected]> les
commentaires concernant cette adaptation francaise.
Note : le probleme detaille ici concerne aussi les autres systemes un
tant soit peu exigeants : Windows 3.1, FreeBSD, Windows NT,
NextStep...
Cette adaptation francaise doit beaucoup a J. Chion.
22.. QQuueessttiioonn ccllee
Voici la question-cle traitee par ce document :
Lorsque je compile un noyau Linux la procedure avorte avec un message:
gcc: Internal compiler error: program cc1 got fatal signal 11
Que se passe-t-il ?
22..11.. RReeppoonnssee ssuucccciinnccttee
Le probleme est vraisemblablement cause par un dysfonctionnement du
materiel. De nombreux composants de l'ordinateur peuvent etre
impliques et diverses manieres de resoudre le probleme existent.
33.. CCoommmmeenntt ss''aassssuurreerr qquuee llee mmaatteerriieell eesstt eenn ccaauussee ??
Sitot apres l'echec du make, invoquez-le a nouveau.
Si la machine parvient a compiler quelques autres fichiers, nous
pouvons penser que le materiel est defaillant.
Si, par contre, la compilation cesse tout de suite (message "nothing
to be done for xxxx" avant nouvel echec au meme endroit), il faudra
determiner si le contenu de la memoire vive est toujours bien
preserve. Pour cela :
dd if=/dev/DISQUE_DUR of=/dev/null bs=1024k count=MEGAS
_D_I_S_Q_U_E___D_U_R remplace ici le nom du fichier special associe au disque
dur stockant les sources. Pour connaitre son nom, rester dans le
repertoire abritant les sources et introduire df . ("df" suivi d'un
espace puis un point).
_M_E_G_A_S remplace ici le nombre de Mo de memoire vive dont la machine
dispose (indique par free).
Cette commande va obliger Linux a lire les informations placees au
debut du disque de facon a "gaver" le contenu du cache disque
("buffer-cache"). Il devra donc, par la suite, relire les fichiers
source a compiler ainsi que les binaires de gcc.
Invoquer make.
Si la compilation echoue toujours au meme "endroit", le probleme est
probablement d'ordre logiciel. Etudier en ce cas la section consacree
aux ``autres causes possibles''.
Si la compilation echoue a un autre stade, nous pouvons conclure que
les transferts de donnees entre le disque et la memoire vive ne sont
pas assures correctement.
44.. QQuuee ssiiggnniiffiiee ccee ""ssiiggnnaall 1111"" ??
Linux avorte grace au "signal 11" tout programme tentant d'acceder a
une adresse memoire ne lui appartenant pas. Parmi les nombreuses
causes possibles, nous ne pouvons retenir dans l'absolu que deux
possibilites, dans le cas ou cela concerne une version stable de gcc
utilisee sur une machine tres commune : probleme materiel ou bien
inadequation de certaines composantes des utilitaires logiciels du
systeme.
Lorsque ce probleme survient sur une machine sans defaut materiel, il
ne peut etre cause que par une erreur de programmation ou de
compilation (en l'occurrence du binaire de gcc). Mais lorsque le
materiel est defaillant, et que des valeurs stockees en memoire vive
changent plus ou moins aleatoirement, un programme exigeant tel que
gcc ne parviendra pas a mener a bien sa mission car il tentera tot ou
tard de dereferencer un pointeur au contenu ainsi modifie.
Un pointeur, sur une machine a processeur Intel, s'etend sur 32 bits
et permet donc d'acceder a 4 Go. Peu de machines Intel disposent
d'autant de memoire vive dont la majeure partie serait allouee a gcc !
Une adresse de 32 bits aleatoire est donc tres probablement illegale
et Linux tuera le programme qui tente avec elle, selon lui, de
manipuler des donnees ne lui appartenant pas.
55.. QQuueell ccoommppoossaanntt iinnccrriimmiinneerr ??
Voici une liste des diverses causes de dysfonctionnement du materiel :
+o Composants trop lents. De mauvaises surprises sont a craindre si
l'une des "barrettes" de memoire vive ne fonctionne pas
convenablement. Meme une carte mere capable de controler par test
de parite ne detectera pas les erreurs survenant lors des cycles
d'ecriture.
Inventaire des causes et solutions :
+o Latence des composants trop importante ("memoire trop lente")
Le controleur de bus ne parvient pas toujours en ce cas a obtenir a
temps la donnee requise par le processeur car la memoire "reagit"
trop lentement. Solution :augmenter le nombre de cycles d'attente
("wait states") grace au SETUP de la machine. Probleme frequent sur
les machines 486 cadence a plus de 80 MHz equipees d'un BIOS de
marque AMI. (Pat V.)
Il est parfois necessaire de remplacer les composants pour diminuer
la latence. Les systemes ayant un bus cadence a 33 MHz (P100,
P133...) ne doivent pas employer de RAM avec plus de 60ns de
latence, surtout si la carte mere est de marque ASUS. L'ensemble
peut sembler fonctionner avec des composants a 70ns mais une petite
erreur est alors toujours possible (Andrew Eskilsson).
+o Composant defecteux
Demonter une barrette (ou changer temporairement la seule barrette
employee) puis relancer le systeme et tester. Recommencer autant de
fois que necessaire afin d'isoler le (ou les !) composants
defectueux. Prendre garde, le cas echeant, lors de la manipulation
des memoires statiques, car une decharge _d_'_e_l_e_c_t_r_i_c_i_t_e _s_t_a_t_i_q_u_e
peut les _c_o_n_d_a_m_n_e_r.
Temoignage (
[email protected]) : nous avons eprouve de
grandes difficultes avec une machine dont il s'avera que les quatre
barrettes etaient defectueuses et modifiaient a peu pres un bit par
heure de fonctionnement. La machine "plantait" environ une fois par
jour et les compilations de noyau echouaient environ une fois par
heure. Cette machine a pu executer le test memoire durant 2300
cycles complets sans erreur, puis detecta environ 10 erreurs et
continua ensuite sans probleme durant plusieurs centaines de
cycles. La compilation de noyau s'avera le test le plus efficace
car meme le cas le plus favorable ne permettait pas de compiler
plus de 14 noyaux a la suite. Nous avons donc echange ces
barrettes.
+o Convertisseurs defectueux
De nombreux supports de memoire, permettant de monter des
composants 32 bits sur des supports 72 points, ne sont pas concus
de facon correcte, en particulier les plus anciens.
Temoignages : nous avons tres longtemps utilise sans probleme un
jeu de composants sans support de ce type. Mais ils ne furent pas
utilisables avec un convertisseur (Naresh Sharma
(
[email protected])).
Paul Gortmaker (
[email protected]) indique que les
convertisseurs doivent tous comporter au moins quatre condensateurs
de regulation du courant.
+o Mode de rafraichissement de la memoire vive inadequat
Les composants "perdent" alors peu a peu les donnees stockees.
Causes (Hank Barta (
[email protected]), Ron Tapia
(
[email protected])) : certaines cartes mere donnent la possiblite de
rarefier les cycles de rafraichissement en vue d'augmenter la bande
passante utile du bus (option "hidden refresh" du SETUP). Un
programme, souvent appele dram, offre le moyen de configurer le jeu
de composants ("chipset") au plus bas niveau afin d'obtenir des
effets semblables.
+o Trop faible nombre de cycles d'attente
Certains composants de la carte mere peuvent ne pas fonctionner
toujours correctement si le nombre de cycles d'attente ("wait
states") n'est pas approprie. L'augmenter grace au SETUP.
+o Defaillance de la memoire cache
Le contenu de la memoire cache n'est generalement pas certifie par
un test de parite et une defaillance ne sera donc pas diagnostiquee
par la carte mere. Test : utiliser le SETUP pour invalider le cache
externe ("L2") puis faire fonctionner le systeme. Si les problemes
disparaissent le cache est defectueux. Solutions :
+o Vitesse ou latence de la memoire cache inadequate.
Augmenter, grace au SETUP, le nombre de cycles d'attente.
+o Composant de memoire defecteux
Il faut alors changer de composant cache. _A_T_T_E_N_T_I_O_N : il s'agit
tres souvent de memoire statique, donc _t_r_e_s fragile (Joseph Barone
(
[email protected])).
+o Mode d'exploitation du cache inadequat
Le mode "ecriture differee" ("write back"), par exemple, cause
parfois des problemes lorsque le jeu de composants de la carte mere
n'est pas correctement concu (cas observe sur une carte "MV020
486VL3H" (20 Mo RAM) par Scott Brumbaugh).
+o Configuration incorrecte de la carte mere
Un cavalier ("jumper") determine parfois le cache qui sera employe
(le modele monte sur une micro carte d'extension ou bien les
composants de memoire classiques). Exemple : cavalier JP16 sur les
ASUS P/I-P55TP4XE version 2.4.
+o Transferts de donnees entre disque et memoire
Un bloc de donnees lu sur le disque peut se trouver stocke en
memoire avec un bit errone.
Determiner si c'est la cause du probleme en recopiant des fichiers
puis en comparant la copie a l'original. Repeter ce test : apres un
dd (consulter a ce propos la section consacree a l'``expiration du
buffer cache'') la compilation avortera tres vraisemblablement a un
autre stade.
+o Interruptions masquees durant des transferts IDE
Certains disques IDE ne tolerent pas le demasquage des
interruptions lors des transferts, en particulier en periode de
forte charge systeme ("hdparm -u0").
+o Disque de marque Kalok
La qualite des disques Kalok de la serie 31xx laisse beaucoup a
desirer, mieux vaut eviter de les employer. Ils ne sont de toutes
facons pas compatibles avec Linux. Les reformer ou laisser aux
utilisateurs de systemes d'exploitation sans cache disque.
+o Disques SCSI
Verifier terminateurs et cables. Un cable court peut sembler
fonctionner avec une terminaison inadequate mais les donnees
transferees peuvent en patir. Essayer de valider les options de
test de parite.
+o Augmentation abusive de la cadence d'horloge ("overclocking")
Le resultat est le plus souvent aleatoire. Essayer d'exploiter la
machine a la cadence d'horloge normale.
Dans un cas au moins (Samuel Ramac (
[email protected])) un
processeur P120 ne tolerait pas 120 MHz mais fonctionnait a 100
MHz. La carte mere n'etait pas en cause car le bus est en fait plus
rapide lorsque l'horloge bat a 100 MHz (-- CPU a 120 : bus a 60 (x
2), CPU a 100 : bus a 66 (x 1,33)--) . Un autre processeur P120,
monte en lieu et place, fonctionne d'ailleurs normalement.
Tous les "fondeurs" (constructeurs de processeurs) produisent ainsi
de rares "rates", ce n'est en rien specifique a Intel.
+o Refroidissement du processeur
L'elevation de la temperature du processeur provoquee par une
augmentation de la cadence d'horloge ou par une panne du dispositif
de refroidissement peut generer des dysfonctionnements. Bon
revelateur : interdire au noyau d'utiliser l'instruction HALT grace
au parametre LILO adequat (lire le "BootPrompt HOWTO"). La
temperature du circuit augmentera alors beaucoup plus vite, meme
sous faible charge systeme, et la frequence d'apparition des
problemes augmentera. Le Pentium a l'instruction "FDIV" boguee est
particulierement concerne car son ventilateur n'etait pas concu au
mieux. Notons aussi que la colle employee pour assujetir le
radiateur au processeur doit presenter des caracteristiques de
conduction thermique correcte (Arno Griffioen (
[email protected]), W.
Paul Mills (
[email protected]), Alan Wind (
[email protected]))
Intel indique que la temperature de la surface du processeur doit
etre comprise entre :
+o 0 et +85 C: Intel486 SX, Intel486 DX, IntelDX2, IntelDX4
+o 0 et +95 C: IntelDX2, IntelDX4 OverDrive
+o 0 et +80 C: 60 MHz Pentium
+o 0 et +70 C: 66 to 166 MHz Pentium
Consulter a ce propos les sections Q6, Q7 et Q13 de ce document
Intel <
http://pentium.intel.com/procs/support/faqs/iarcfaq.htm>
+o Voltage de l'alimentation du processeur
Certains processeurs 5 Volts fonctionnent sous 3,3 Volts, mais pas
toujours de facon parfaite. Pis : les documentations de certains
systemes sont incorrectes et recommandent une configuration
inadequate (Karl Heyes (
[email protected]))
+o Voltage de l'alimentation de la memoire
Les plus recentes cartes ne tolerent que la memoire 3,3 Volts. Ne
jamais utiliser les composants sous un voltage inadequat (risque de
destruction).
+o Surexploitation du bus local
Le nombre de cartes connectables a un bus local decroit avec sa
frequence d'exploitation : 3 cartes a 25 MHz, 2 a 33 MHz, une seule
a 40 MHz et aucune a 50 MHz (frequence maximale). Certains systemes
tolerent mal la surcharge et les donnees echangees peuvent alors en
patir. Essayer d'augmenter les etats d'attente inseres entre les
cycles du bus local (Richard Postgate (
[email protected])).
+o Fonctions d'economie d'energie ("power management", "APM")
Certains portables, en particulier, offrent une fonction de reprise
immediate (mode "resume") et des programmes pilotes ne tolerent pas
toujours cela. Debrayer ces fonctions ou bien compiler l'"APM
support" dans le noyau (Elizabeth Ayer (
[email protected])).
+o Processeur defectueux
Certains exemplaires des processeurs courants recelent des bogues
aux effets pervers. Aucune solution n'existe, il faut remplacer le
composant. Des cas d'incompatibilite entre processeur et carte
mere auraient ete observes. Depuis fevrier 1997 la premiere vague
de problemes, qui concernait les processeurs Intel, decroit
nettement tandis que l'exploitation de processeurs Cyrix/IBM 6x86
sur certaines cartes mere s'avere difficile. Le manuel d'une carte
mere precise qu'elle est incompatible avec les premieres versions
du 6x86. C'est regrettable car les performances de ces processeurs
sont fort bonnes.
66.. MMaaiiss ttoouutt ffoonnccttiioonnnnaaiitt ccoorrrreecctteemmeenntt ddeeppuuiiss lloonnggtteemmppss !!
Le fait que la configuration deficiente fonctionnait sans probleme
depuis un moment n'implique malheureusement pas que le materiel est
hors de cause.
L'exemple classique concerne les composants de memoire. Leurs
fabricants ne disposent pas d'une ligne de production distincte pour
chaque type de memoire. Les circuits proviennent tous des memes
machines et matieres premieres, seul le test final determine si un
composant donne sera par exemple vendu en tant que 60 ns ou bien 70
ns. Vos composants fonctionnaient peut-etre a merveille depuis
longtemps a la limite de leurs capacites mais un facteur quelconque
(la temperature, par exemple, ralentit les memoires) peut les rendre
assez vite inadequats.
Un climat estival ou bien une lourde charge de travail processeur
place donc parfois le systeme dans des conditions ou son
fonctionnement correct n'est plus certain, voire plus possible
(Philippe Troin (
[email protected])).
77.. MMoonn pprrooggrraammmmee ddee tteesstt mmeemmooiirree nnee rreevveellee aauuccuunn pprroobblleemmee
Le test memoire effectue par le BIOS lors du demarrage de la machine
n'en est le plus souvent pas un. Des conditions d'exploitation
extremes peuvent seules permettre de lever le doute. Tester grace a
memtest86.
88.. LLee pprroobblleemmee eesstt--iill lliimmiittee aa llaa ccoommppiillaattiioonn dduu nnooyyaauu ??
Non, mais la compilation du noyau exige beaucoup de ressources et
constitue donc un excellent test ou revelateur.
Autres cas observes :
+o Certaines machines se bloquent parfois lorsqu'elles executent le
script d'installation de la distribution Slackware
(
[email protected]).
+o Le noyau stoppe parfois une tache a cause d'une "general protection
error" (message confie a syslog) (
[email protected]).
99.. mmaacchhiinnee !! DD''aauuttrreess ssyysstteemmeess dd''eexxppllooiittaattiioonn ffoonnccttiioonnnneenntt ppoouurrttaanntt
bbiieenn ssuurr cceettttee
Linux exploite mieux le materiel que la plupart des autres systemes,
comme ses performances le laissent imaginer.
Certains autres systemes, par exemple edites par Microsoft, se
"plantent parfois" de facon incomprehensible. Peu d'utilisateurs s'en
plaignent, semble-t-il, et cette societe leur repond
<
http://www.cantrip.org/nobugs.html> en ce cas d'une maniere quelque
peu etrange.
Le mode de conception et d'utilisation de ces systemes d'exploitation
produit un ensemble le plus souvent plus "predictible" que Linux dans
la mesure ou une application donnee sera le plus souvent chargee dans
la meme section de la memoire vive. Les aleas dus a un composant
defectueux sont donc parfois portes au compte d'un programme donne et
non du materiel.
Une chose demeure cependant certaine : un systeme Linux bien installe
sur une machine saine doit pouvoir compiler cent fois de suite un
noyau sans aucun probleme.
Temoignage : Linux et gcc testent a merveille la machine. Hors de
Linux le test "Winstone" produit le meme genre d'effets (Jonathan
Bright (
[email protected]))
1100.. ssiiggnnaall 1111"" eesstt--iill llee sseeuull eeffffeett ??
Ce n'est malheureusement pas le cas. Les signaux 6 et 4 peuvent aussi
relever de ce genre de probleme (lorsque la memoire n'accomplit pas
correctement son office n'importe quel type d'erreur peut survenir)
mais le 11 est le plus commun.
Autres problemes constates :
+o free_one_pmd: bad directory entry 00000008
+o EXT2-fs warning (device X:Y): ext_2_free_blocks bit already cleared
for block Z
+o Internal error: bad swap device
+o Trying to free nonexistent swap-page
+o kfree of non-kmalloced memory ...
+o scsi0: REQ before WAIT DISCONNECT IID
+o Unable to handle kernel NULL pointer dereference at virtual address
c0000004
+o put_page: page already exists 00000046 invalid operand: 0000
+o Whee.. inode changed from under us. Tell Linus
+o crc error System halted (lors du demarrage)
+o Segmentation fault
+o "unable to resolve symbol"
+o make 1: *** ... Error 139 make: *** ... Error 1
+o X Window avorte brusquement avec un mesage
Les premiers exemples relevent d'arrets provoques par le noyau qui
"suspecte" une erreur de programmation l'affectant. Les autres
concernent les applications.
(S.G.de Marinis (
[email protected]), Dirk Nachtmann
(
[email protected]))
1111.. QQuuee ffaaiirree ??
+o Demonter des barrettes, les remplacer
+o Debrayer (SETUP) le cache de second niveau du processeur
+o Diminuer la cadence du processeur et du bus
+o Restaurer la cadence de rafraichissement de la memoire preconisee
+o Demarrer avec un noyau sous option "mem=4M" pour lui interdire
d'exploiter la memoire au-dessus des 4 premiers Mo
+o Tester :
tcsh
cd /usr/src/linux
make zImage
foreach i (0 1 2 3 4 5 6 7 8 9)
foreach j (0 1 2 3 4 5 6 7 8 9)
make clean;make zImage > log."$i"$j
end
end
Tous les contenus des fichiers de trace resultants doivent etre iden-
tiques. Cela exige environ 24 heures sur un P100 / 16 Mo RAM et envi-
ron 3 mois sur un 386 / 4 Mo :-)
Le moyen le plus efficace reste de remplacer tous les composants de
memoire. Ce n'est cependant pas toujours facile.
1122.. EEtt llee tteesstt pphhyyssiiqquuee ??
Meme certains equipements electroniques de test des memoires ne
mettent pas toujours en evidence les problemes dont nous traitons ici
car ils peuvent par exemple dependre du mode d'exploitation des
composants par la carte mere.
1133.. QQuueelllleess ssoonntt lleess aauuttrreess ccaauusseess ppoossssiibblleess ??
+o pgcc
Utilisation de la version de gcc "pgcc", dont le generateur de code
est optimise pour le Pentium. La compilation, avec ses options par
defaut, de certains modules du noyau (par exemple floppy.c) produit
un signal 11. Les causes se trouvent a la fois dans le noyau, la
libc et pgcc. On constate vite qu'il ne s'agit pas d'un probleme
materiel car il se produit toujours au meme stade de la
compilation.
Solution : utiliser un gcc standard ou bien des options interdisant
certaines optimisations (par exemple "-fno-unroll-loops") (Evan
Cheng (
[email protected])).
+o Composants de gcc heteroclites
Lorsque les fichiers appartenant a gcc proviennent de sources
differentes des problemes peuvent appraitre. Il faut alors tout
remplacer par une version complete et correcte (Richard H. Derr III
(
[email protected])).
+o Edition de liens avec bibliotheque pour SCO
Sous iBCS les applications dont le LDFLAGS contient -Llib/ sont
exposees.
+o a.out et ELF
Compilation d'un noyau a.out au sein d'un environnement ELF (ou le
contraire).. Le premier appel a "ld" causera toujours un "signal
11"(REW).
+o Carte Ethernet ISA sur bus PCI mal configure
Cela peut causer de graves problemes logiciels (sigsegv, arret du
noyau...). Il faut alors utiliser le SETUP pour configurer
l'"aperture" (zone de memoire commune a la carte et a l'espace
d'adressage du systeme).
+o Contenu de la partition de memoire virtuelle ("swap") endommage
Tony Nugent (
[email protected]) precise qu'il a pu resoudre le
probleme en re-preparant la partition grace a "mkswap".
Louis J. LaBash Jr. (
[email protected]) nous rappelle qu'il faut
invoquer "sync" apres un "mkswap".
+o Cartes Ethernet bas de gamme de type NE2000
La qualite de certaines cartes est si mediocre qu'elles mettent en
peril la stabilite du systeme. Les noyaux Linux posterieurs a
1.3.48 les tolerent semble-t-il mieux (REW).
+o Alimentation electrique
Cas peu probable, meme une machine tres bien equipee n'approche
guere les limites des alimentations 200 W. Seul un systeme
utilisant de nombreux anciens disques (gros consommateurs de
courant) peut poser un probleme (Greg Nicholson
(
[email protected])).
Thorsten Kuehnemann (
[email protected]) indique qu'une alimentation
defectueuse peut provoquer des signaux 11.
+o Compilation du code ext2
Dans certains cas la compilation du code de gestion du systeme de
fichiers ext2 provoque un signal 11 (Morten Welinder
(
[email protected])).
+o Memoire disponible insuffisante
gcc produit alors d'etranges erreurs (Paul Brannan
(
[email protected])).
1144.. CCeettttee lliissttee mmee llaaiissssee sscceeppttiiqquuee !!
Nous ne traitons ici que de cas rreeeellss !!
(N.d.T : la version originale <
http://www.bitwizard.nl/sig11/> de ce
document propose une liste des auteurs de temoignages).