Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /homepages/14/d213344623/htdocs/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 2137

Logo Ubuntu

Voilà un titre qui est un peu long. C’est non sans une certaine excitation que j’essaie d’apporter ma pierre à l’édifice de la gestion de l’ACPI par la disitribution Ubuntu Linux. Je traine sur mon portable un problème depuis bien longtemps. Lorsque l’on met la machine en hibernation et que l’on redémarre, le fait de demander par la suite un redémarrage ou un arrêt de la machine aboutit à un blocage pur et simple. Cela concerne toutes les version depuis Dapper au bas mot (Edgy, Fesity et Gutsy sont touchées aussi). J’investigue, mais pour l’instant, je fais chou blanc ! C’est pour moi l’occasion de vous donner quelques explications sur le pourquoi et le comment…


Les symptômes

Afin de trouver la solution au bug dont il est question (détaillé juste après), j’ai suivi plusieurs discussions sur le launchpad Ubuntu, et sur le bugzilla du kernel Linux, sans aucun succès. Voici les références :

En fait, le problème se résume relativement bien. Evidemment, sous Windows, il ne se produit pas. L’hibernation fonctionne bien dans le sens ou le portable s’éteint correctement. On peut ensuite le rallumer et se retrouver sous sa session, ce qui est normal. Par contre, ensuite, si l’on souhaite arrêter ou redémarrer l’ordinateur, la barre de déchargement diminue et la machine se bloque complètement quasiment en fin de processus. Le seul moyen de reprendre la main est alors d’éteindre « sauvagement » l’ordinateur et de le redémarrer.

Un peu de théorie

Qu’est-ce que l’ACPI ? Je ne vais pas me casser la tête et vous redonner la définition de Wikipedia :

Le terme anglais Advanced Configuration and Power Interface (ACPI) (qui signifie interface avancée de configuration et de gestion de l’énergie) désigne une norme qui a été co-développée par Hewlett Packard, Intel, Microsoft, Phoenix Technologies et Toshiba qui est très largement répandue dans les ordinateurs personnels modernes.

Le but de cette norme est de réduire la consommation d’énergie d’un ordinateur en mettant hors tension certains éléments (tels que les lecteurs CD-ROM, les disques durs, l’écran…)

Pour cela, une interface a été spécifiée qui permet au système d’exploitation d’envoyer des signaux à ces différents périphériques matériels (il faut que ces périphériques supportent également l’ACPI). Cette interface permet aussi au matériel d’envoyer des signaux au système d’exploitation, par exemple lorsque l’utilisateur appuie sur le bouton de mise en route sur le clavier ou que le modem reçoit un appel.

Cette norme est utilisée aussi bien sur les ordinateurs portables que sur les ordinateurs de bureau récents. La toute dernière spécification qui date du 10 octobre 2006 porte la version 3.0b.

Vous y voyez un peu plus clair ? Tant mieux. Ce qu’il faut savoir c’est que l’ACPI est un agrégat de plusieurs tables qui permettent au système d’exploitation de récupérer les informations dont il a besoin. L’une d’elle est la DSDT pour Differentiated System Description Table. Cette table dispose de toutes les indications pour que le système sache exactement à quel endroit aller relever la valeur de la temprérature du processeur ou la vitesse de rotation du ventilateur par exemple.

L’investigation

Alors en mettant les choses à plat, je me suis dit que ça venait forcément de la gestion de l’ACPI, mais alors d’où ? J’ai tout d’abord consulter les variables correspondant à la gestion de l’énergie sur le système :

  1.  

Jusque là…rien d’anormal…j’ai donc décidé d’aller voir du côté des tables DSDT justement…Cela va me permettre de vous introduire quelques astuces concernant le debugging de tables DSDT sous Linux.

Il faut installer acpidump/acpixtract et iasl :

  1.  

Une fois ceci installé, il est possible de dumper les tables DSDT de la machine et de les désassembler pour vérifier que tout est correct. En effet, un article sur le web m’a mis la puce à l’oreille : il existe en gros 2 compilateurs de tables ACPI, l’un de Microsoft et l’autre d’Intel. Il se trouve que le compilateur de Microsoft est bien plus permissif que celui d’Intel. Du coup, les constructeurs laissent souvent passer des erreurs et des inexactitudes dans leurs tables DSDT. Cela fonctionne donc bien sous Windows, mais du coup, les développements du kernel Linux basés sur les standards ne sont plus compatibles, ce qui provoque des problèmes.

Pour vérifier avec quel compilateur ont été générées les tables de votre ordinateur, il suffit de taper la commande suivante :

  1.  

Si quelque chose est retourné, cela signifie que c’est le compilateur de Microsoft qui a été utilisé. On va donc dumper les tables DSDT sur le disque dur, les désassembler et essayer de les recompiler avec le compilateur Intel pour voir si des erreurs sont présentes.

  1.  

Vous obtiendrez alors deux fichiers : un dsdt.hex et un dsdt.dsl. Le fichier dsdt.dsl est alors un fichier source compilable. Vous pouvez aller jeter un oeil dedans pour voir de quoi il est fait. Pour ma part, j’ai appris plusieurs choses intéressantes dans mes tables :

  1. La température du processeur est codée en dur à 75° C, ce qui explique la valeur du fichier temperature vérifié plus haut. Bizarre comme façon de faire. J’aimerai bien avoir les ingénieurs de chez Fujitsu-Siemens sous la main pour avoir la raison de ce choix. En fait, le processeur est toujours vu à 75° C, sauf quand un problème survient, la température passe brusquement à 85° C.
  2. Des paramètres différents sont chargés en fonction du système détecté. En effet, dans les tables DSDT, une variable _OS est positionnée à « Microsoft WindowsME: Millenium Edition », « Microsoft Windows NT », « Microsoft Windows » ou « Windows 2001 » en fonction du système Windows détecté. « Windows 2001 » est la valeur renvoyée par Windows XP, Windows 2003 ou Windows Vista.

Essayons alors de recompiler le fichier obtenu avec le compilateur Intel pour voir si tout va bien :

  1.  

Aucune erreur, un avertissement tout au plus…le problème ne vient donc pas d’une table mal formée ! Flûte !

Le constat est donc simple : est-ce que, dans ces conditions, la possibilité de faire passer Linux pour Windows ne règlerait pas le problème ?

Les essais

Je ne vais pas faire durer le suspens : pour l’instant, je n’ai pas la solution, malheureusement…

J’ai procédé à quelques tests, pour voir si cela pouvait être lié au système d’exploitation détecté par l’ACPI. Pour cela, j’ai ajouté un paramètre à la fin de la ligne de chargement du noyau dans le fichier /boot/grub/menu.lst. Une fois la ligne qui charge le noyau identifiée, il faut rajouter le paramètre acpi_os_name= »Microsoft Windows NT » acpi_osi= »Windows 2001″ pour forcer l’ACPI a se croire sous Windows XP.

Le résultat

Et bien, comme je le déclare un peu plus haut, ça n’est pas probant. Rien ne change quant au problème de redémarrage après une mise en veille et une restauration de l’état du portable.

En plus de celà, un autre bug subsiste sur cette machine au niveau de l’ACPI : sous Windows, au bout de 10 minutes d’inactivité, le ventilateur s’éteint complètement. Sous Ubuntu, ce n’est encore pas le cas, et je dois bien avouer que je ne sais pas sur quel critère se fait cette extinction sous Windows…alors j’ai bien du mal à identifier sur quel paramètre jouer sous Ubuntu. Je cherche, je cherche…

Si vous avez des infos, n’hésitez pas à me faire part de ces dernières !

Références

Rendons à César ce qui est à Césear : un article m’a été vraiment très utile dans toutes ces recherches, c’est l’article traitant des problèmes ACPI du wiki Gentoo.