{"id":78,"date":"2011-06-07T18:33:11","date_gmt":"2011-06-07T21:33:11","guid":{"rendered":"http:\/\/www.maurom.com\/wp\/?p=78"},"modified":"2012-08-14T20:20:40","modified_gmt":"2012-08-14T23:20:40","slug":"reiniciando-rebooting","status":"publish","type":"post","link":"https:\/\/maurom.com\/blog\/2011\/06\/07\/reiniciando-rebooting\/","title":{"rendered":"Reiniciando [rebooting]"},"content":{"rendered":"<p>Matthew Garrett es un bi\u00f3logo (<a href=\"http:\/\/geekfeminism.wikia.com\/wiki\/Matthew_Garrett\">ah\u00e1<\/a>) y reconocido hacker de Linux que lidia normalmente con complejas cuestiones de bajo nivel, pegadas al hardware, tales como ACPI, EFI, power management, y otras, que normalmente publica sus desventuras en el campo digital en un <a href=\"http:\/\/mjg59.livejournal.com\/\">blog<\/a> en livejournal. Muchos de sus art\u00edculos me han resultado realmente sorprendentes en cuanto a los intrincados detalles que pueblan los componentes de hardware desarrollados por diversos fabricantes.<\/p>\n<p>Esta \u00faltima semana public\u00f3 un art\u00edculo sobre el <span style=\"font-style: italic;\">sencillo<\/span> problema de<span style=\"font-weight: bold;\"> c\u00f3mo reiniciar correctamente una computadora<\/span>. Me he tomado la libertad de <span style=\"text-decoration: line-through;\">traducir<\/span> mejor dicho, <span style=\"font-style: italic;\">interpretar ilegalmente<\/span>, el post en cuesti\u00f3n. Para aquellos que se sientan c\u00f3modos con el ingl\u00e9s, les recomiendo el <a href=\"http:\/\/mjg59.dreamwidth.org\/3561.html\">art\u00edculo original<\/a>.<\/p>\n<hr \/>\n<blockquote><p><span style=\"font-weight: bold;\">Reiniciando<\/span><\/p>\n<p>Se podr\u00eda pensar que es f\u00e1cil reiniciar una PC, \u00bfno? Pero tambi\u00e9n podr\u00eda pensarse que es f\u00e1cil convencer a la gente de que al menos hacer un esfuerzo para ser amable con los dem\u00e1s es una propuesta de beneficio mutuo, y miren lo bien que nos ha funcionado.<\/p>\n<p>Linux tiene un mont\u00f3n de maneras diferentes de reiniciar un sistema x86. Algunas de ellas son exclusivas para 32 bits y por eso las voy a ignorar porque, honestamente, que est\u00e1s haciendo de tu vida [si est\u00e1s trabajando en 32 bits]. Adem\u00e1s, son horribles. Entonces, esto nos deja con cinco de ellas:<\/p>\n<ul>\n<li><span style=\"font-weight: bold;\">kbd<\/span> &#8211; reiniciar a trav\u00e9s del controlador de teclado. La IBM PC original ten\u00eda la l\u00ednea [el cable] de reinicio de la CPU asociada a la controladora del teclado. Escribiendo la apropiada cantidad m\u00e1gica de pulsos en la l\u00ednea y la m\u00e1quina se reinicia. Todo esto es muy sencillo, salvo por el hecho de que las m\u00e1quinas modernas no tienen controladores de teclado (en realidad son parte del controlador embebido) e incluso las m\u00e1quinas m\u00e1s modernas ni siquiera pretenden tener un controlador de teclado. Ahora, los controladores embebidos ejecutan software. Y, como todos sabemos, el software es terrible. Pero, a\u00fan peor, el software del controlador embebido est\u00e1 escrito por autores de BIOS. As\u00ed que claramente cualquier pretensi\u00f3n de que esto funcione es una especie de ficci\u00f3n complicada. Algunas m\u00e1quinas son muy exigentes con el hardware, exigiendo que est\u00e9 en el estado exacto que Windows lo programar\u00eda. Algunas m\u00e1quinas funcionan 9 de cada 10 veces y luego se bloquean debido a alg\u00fan raro problema de temporizaci\u00f3n. Y otras simplemente no funcionan en absoluto. \u00a1Hurra!<\/li>\n<li><span style=\"font-weight: bold;\">triple<\/span> &#8211; intentar generar una falla triple. Esto se realiza cargando una tabla vac\u00eda como vector de interrupciones, y luego llamando a int(3). Falla la interrupci\u00f3n (no hay IDT), falla el manejador de fallos (no hay IDT) y la CPU entra en un estado que deber\u00eda, en teor\u00eda, desencadenar un reinicio. Salvo que no parece haber un requerimiento de que esto suceda, y esto simplemente no funciona en un mont\u00f3n de m\u00e1quinas.<\/li>\n<li><span style=\"font-weight: bold;\">pci<\/span> &#8211; en realidad no pci. Tradicionalmente, el acceso al espacio de configuraci\u00f3n PCI se logra escribiendo un valor de 32 bits al puerto io 0xcf8 para identificar el bus, el dispositivo, la funci\u00f3n y el registro de configuraci\u00f3n. El puerto 0xcfc luego contiene el [valor del] registro en cuesti\u00f3n. Pero si se escribe el par apropiado de valores m\u00e1gicos en 0xcf9, la m\u00e1quina se reiniciar\u00e1. Espectacular! Y no estandarizado de ninguna manera (ciertamente no es parte de la especificaci\u00f3n PCI), por lo que chipsets diferentes pueden tener diferentes requisitos. Booo.<\/li>\n<li><span style=\"font-weight: bold;\">efi<\/span> &#8211; Los servicios EFI en tiempo de ejecuci\u00f3n proporcionan un punto de entrada para reiniciar la m\u00e1quina. Incluso a veces funciona! Siempre y cuando los servicios de tiempo de ejecuci\u00f3n EFI est\u00e9n funcionando, lo que puede ser una exageraci\u00f3n.<\/li>\n<li><span style=\"font-weight: bold;\">acpi<\/span> &#8211; Las versiones recientes de la especificaci\u00f3n ACPI permiten especificar una direcci\u00f3n (por lo general en espacio de memoria o E\/S de sistema) y un valor a escribir ah\u00ed. La idea es que escribir el valor a la direcci\u00f3n reinicia el sistema. Resulta que eso, a menudo, falla. Tambi\u00e9n es imposible representar el m\u00e9todo de reinicio PCI a trav\u00e9s de ACPI, porque el m\u00e9todo de reinicio PCI requiere un par de valores y ACPI s\u00f3lo da uno.<\/li>\n<\/ul>\n<p>Ahora, debo admitir que esto suena bastante deprimente. Pero la gente claramente vende computadoras con la expectativa de que van a reiniciarse correctamente, entonces \u00bfqu\u00e9 es lo que pasa?<\/p>\n<p>Hace un tiempo hice algunas pruebas con Windows corriendo sobre qemu. Esta es una buena manera de evaluar el comportamiento del sistema operativo, porque uno tiene el control completo de lo que se entrega al sistema operativo y lo que el sistema operativo trata de hacer con el hardware. Y lo que descubr\u00ed fue un poco sorprendente. En ausencia de un vector de reinicio ACPI, Windows utiliza el controlador del teclado, espera un momento, lo intenta de nuevo y luego abandona. Si existe un vector de reinicio ACPI, Windows lo utiliza, luego prueba con el controlador del teclado, luego vuelve a utilizar el vector ACPI y prueba el controlador del teclado una vez m\u00e1s.<\/p>\n<p>Esto resulta ser importante. Lo primero que significa es que genera dos escrituras en el vector ACPI de reinicio el sistema. El segundo es que deja un espacio entre ellas mientras toquetea el controlador de teclado. Y, sorprendentemente, resulta que en la mayor\u00eda de los sistemas el vector de reinicio ACPI apunta a 0xcf9 en el espacio de E\/S del sistema. Incluso cuando la mayor\u00eda de las implementaciones nominalmente requieren escribir dos valores distintos, parece que este no es un requisito estricto y el m\u00e9todo ACPI funciona.<\/p>\n<p>[La versi\u00f3n del kernel Linux] 3.0 incluir\u00e1 este comportamiento por defecto. Hace que varias m\u00e1quinas funcionen (algunas Apple, por ejemplo), mejora las cosas en otras (algunas Thinkpad parecen quedarse tiesas durante largos per\u00edodos de tiempo, de otra manera) y con un poco de suerte evitar\u00e1 la necesidad de a\u00f1adir m\u00e1s peculiaridades espec\u00edficos al c\u00f3digo de reinicio. Todav\u00eda hay algunas divergencias entre nosotros y Windows (mayormente en cu\u00e1n seguido escribimos en el controlador de teclado), que se puede limpiar si resulta que hace alguna diferencia en cualquier lugar.<\/p>\n<p>Ahora. De vuelta a los bugs de EFI.<\/p>\n<p style=\"text-align: right;\">&#8211; mjg59<\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Matthew Garrett es un bi\u00f3logo (ah\u00e1) y reconocido hacker de Linux que lidia normalmente con complejas cuestiones de bajo nivel, pegadas al hardware, tales como ACPI, EFI, power management, y otras, que normalmente publica sus desventuras en el campo digital en un blog en livejournal. Muchos de sus art\u00edculos me han resultado realmente sorprendentes en [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[5,17,3,14],"_links":{"self":[{"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/posts\/78"}],"collection":[{"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/comments?post=78"}],"version-history":[{"count":0,"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/posts\/78\/revisions"}],"wp:attachment":[{"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/media?parent=78"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/categories?post=78"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/tags?post=78"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}