2011-07-22 15 views
7

Al enviar un comando y leer los datos de un chip determinado, digamos el RTC, diferentes documentos dicen que debemos esperar un tiempo antes de leer desde el dispositivo para asegurarnos de que los datos estén disponibles. Muchos fragmentos de código hacen una lectura ficticia desde el puerto 0x80. Quería saber a qué dispositivo está conectada esta dirección, si corresponde. Estoy hablando con respecto a la arquitectura de PC IA-32.¿A qué se conecta la dirección del puerto 0x80?

+0

Uso en Linux kernel 4.2: https://github.com/torvalds/linux/blob/v4.2/arch/x86/boot/boot.h#L78 –

+0

Lo que cada puerto se asigna a: http: // stackoverflow .com/questions/14194798/is-there-a-specification-of-x86-io-port-assignment –

Respuesta

12

puerto E/S 0x80 se utiliza tradicionalmente para Códigos POST. (POST = autoprueba de encendido)

Mientras el sistema arranca, el BIOS generará una serie de códigos de depuración en el puerto de E/S 0x80. Estos están indended para la depuración de un sistema sin arranque.

En la mayoría de las PC de escritorio, puede instalar una tarjeta de depuración de código POST, que es básicamente una pequeña tarjeta de ranura PCI (o ISA) que decodifica E/S escribe en el puerto de E/S 0x80 y muestra el valor en 7 segmentos LEDs.

PCI Post Code board

Normalmente, códigos POST flash muy rápidamente. Sin embargo, si su sistema se cuelga durante el arranque, puede ver cuál fue el último código POST y utilizar esta información para solucionar el problema del sistema.

This site contiene una lista de los códigos POST estándar para la mayoría de las BIOS. Sin embargo, un fabricante de computadora/placa base puede insertar sus propios códigos POST, por lo que la lista no es 100% exhaustiva.

Después de que un sistema ha comenzado a arrancar el sistema operativo, los códigos POST no son muy relevantes. Sin embargo, algunos proveedores de sistemas operativos pueden usar tarjetas de códigos POST como una herramienta de depuración, particularmente para lugares en el código donde un printf() puede no ser práctico (por ejemplo, Rutinas de servicio de interrupción).

Algunos sistemas operativos utilizarán lecturas y escrituras en el puerto de E/S 0x80 como mecanismo de retardo. Si necesita esperar algunos microsegundos para completar algo, puede ser poco práctico utilizar temporizadores de reposo() o retardo() completos, por lo que realizar una lectura/escritura "ficticia" a una dirección de E/S "segura" es una solución liviana Las lecturas y escrituras a 0x80 están garantizadas básicamente para no afectar negativamente el funcionamiento del sistema, por lo que es una buena opción para dichas operaciones ficticias.

Encontrará que con muchos dispositivos periféricos más antiguos/más lentos (como su chip RTC), a veces es necesario esperar unos pocos usos para que una operación de escritura de E/S "surta efecto". Un acceso ficticio a 0x80 es una forma conveniente de hacerlo.

También puede encontrar el código que hace las escrituras ficticias a 0x80 para "vaciar" el bus de cualquier "eco" eléctrico. En ciertas plataformas, es posible escribir un valor en una dirección de E/S no utilizada/no válida, leer desde esa dirección y ver el valor que acaba de escribir, , aunque en realidad no hay hardware en esa dirección. Sin embargo, si escribe un dummy en otra dirección intermedia (por ejemplo, puerto de E/S 0x80), puede evitar esto.

+0

Agregando a la respuesta: http://www.intel.com/support/motherboards/desktop/sb/CS- 025434.htm – phoxis

+0

@phoxis Tenga en cuenta que los códigos enumerados son exclusivos de las placas base Intel basadas en su firmware EFI. Esa lista puede no aplicarse a otras placas base. –

+0

Sí lo son, mi punto era que podemos usar el puerto para hacer lecturas y escrituras ficticias para introducir un pequeño retraso. – phoxis

2

debe ser un retraso; p.ej. leo

> The inb_p(), outb_p(), inw_p(), and outw_p() macros work otherwise 
> identically to the ones above, but they do an additional short (about 
> one microsecond) delay after the port access; you can make the delay 
> about four microseconds with #define REALLY_SLOW_IO before you 
> #include <asm/io.h>. These macros normally (unless you #define 
> SLOW_IO_BY_JUMPING, which is probably less accurate) use a port output 
> to port 0x80 for their delay, so you need to give access to port 0x80 
> with ioperm() first (outputs to port 0x80 should not affect any part 
> of the system). For more versatile methods of delaying, read on. 

de here

2

enter image description here

Se puede escribir (y leer) a (de) Puerto 0x80 utilizando este código en un controlador del núcleo:

(Tenga en cuenta que algunos equipos como el mío tienen una palabra en este lugar por lo que uno puede escribirle 16 bits.)

Ejemplo del controlador de Windows:
__outword (0x80, 0x00A0);

Esto también se puede utilizar para la depuración del kernel en los casos en que no tenga un sistema de depuración de dos máquinas y no pueda usar rastros de depuración por ningún motivo (como el sistema se congela). El puerto 80 puede mantener su último código de depuración para usted.

Cuestiones relacionadas