2010-12-02 12 views
7

veces veo declaraciones que en algunas plataformas el siguiente código C o C++:¿Qué plataformas reales asignan los puertos de hardware a las direcciones de memoria?

int* ptr; 
*ptr = 0; 

puede dar lugar a la escritura en un puerto de entrada-salida de hardware si ptr sucede para almacenar la dirección a la que se asigna ese puerto. Por lo general, se los llama "plataformas integradas".

¿Cuáles son los ejemplos reales de tales plataformas?

+0

memoria asignada E/S? – Chubsdad

+2

Solo para agregar a todas las respuestas, su plataforma x86 también hace esto (E/S de memoria asignada). Simplemente está acostumbrado a trabajar en un entorno protegido [1] creado por su sistema operativo, por lo que no tiene que (o por accidente puede) tocar todos los aspectos sucios del hardware real. Escriba un controlador, o mejor aún, un sistema operativo y tendrá que lidiar con la E/S de Memory Mapped mucho, entre una gran cantidad de otras cosas divertidas. :) [1] http://en.wikipedia.org/wiki/Protected_mode –

+0

Ver http://stackoverflow.com/questions/15371953/memory-mapped-io-vs-port-mapped-io – Pacerier

Respuesta

9

La mayoría de los sistemas en mi experiencia usan E/S mapeadas en memoria. La plataforma x86 tiene un espacio de direcciones de E/S no mapeadas en memoria (que usa la familia de códigos de operación del procesador in/out), pero la arquitectura de PC también utiliza ampliamente el espacio de direcciones de memoria estándar para E/S del dispositivo. que tiene un espacio de direcciones más grande, un acceso más rápido (generalmente) y una programación más sencilla (generalmente).

Creo que el espacio de direcciones de E/S por separado se usó inicialmente porque el espacio de direcciones de memoria de los procesadores a veces era bastante limitado y tenía poco sentido usar una parte para el acceso del dispositivo. Una vez que el espacio de direcciones de memoria se abrió a megabytes o más, esa razón para separar las direcciones de E/S de las direcciones de memoria se volvió menos importante.

No estoy seguro de cuántos procesadores proporcionan un espacio de direcciones de E/S por separado como lo hace el x86. Como una indicación de cómo el espacio de direcciones de E/S por separado ha caído en desgracia, cuando la arquitectura x86 se movió al reino de 32 bits, no se hizo nada para aumentar el espacio de direcciones de E/S de 64 KB (aunque agregaron la capacidad para mover fragmentos de datos de 32 bits en una instrucción). Cuando x86 se movió al 64-reino, el espacio de direcciones de E/S permaneció en 64 KB y ni siquiera agregaron la capacidad de mover datos en unidades de 64 bits ...

Tenga en cuenta también que las plataformas modernas de escritorio y servidor (u otros sistemas que usan memoria virtual) generalmente no permiten que una aplicación acceda a puertos de E/S, ya sea que estén mapeados en memoria o no. Ese acceso está restringido a los controladores de dispositivo, e incluso los controladores de dispositivo tendrán alguna interfaz de sistema operativo para tratar las asignaciones de memoria virtual de la dirección física y/o para configurar el acceso DMA.

En sistemas más pequeños, como sistemas integrados, la aplicación suele acceder directamente a las direcciones de E/S.Para los sistemas que usan direcciones mapeadas en memoria, esto generalmente se hará simplemente configurando un puntero con la dirección física del puerto de E/S del dispositivo y usando ese puntero como cualquier otro. Sin embargo, para garantizar que el acceso se produce y se produce en el orden correcto, el puntero debe declararse como apuntando a un objeto volatile.

Para acceder a un dispositivo que utiliza algo distinto de un puerto de E/S mapeado en memoria (como el espacio de direcciones de E/S del x86), un compilador generalmente proporcionará una extensión que le permite leer o escribir en ese espacio de direcciones . En ausencia de dicha extensión, necesitaría llamar a una función de lenguaje ensamblador para realizar la E/S.

+0

He estado haciendo investigación sobre este tema últimamente, y su respuesta demostró ser extremadamente útil. Tengo un par de preguntas: ¿qué dispositivos usan el espacio de direcciones de E/S? Y, dado que la memoria será común para dispositivos mapeados en memoria y todos los programas (en E/S mapeadas en memoria), ¿qué pasaría cuando se use el espacio mapeado en memoria? ¿Ese espacio no está disponible para ese momento? – Cygnus

+0

Algunos ejemplos de dispositivos que usan el espacio de direcciones de E/S en las PC son cosas como el teclado PS/2, puertos COM heredados. Estoy seguro de que hay otras cosas. No soy un diseñador de hardware, así que no sé si el nuevo dispositivo diseñado usaría el espacio de E/S o preferiría el espacio mapeado en memoria, incluso si el número de puertos implicados era pequeño (me parece que casi todo excepto los adaptadores de video se conectan a USB, o SATA hoy en día). –

+0

En cuanto al acceso a la aplicación de E/S mapeadas en memoria, en los sistemas que admiten direcciones virtuales esa memoria normalmente no se mapeará en el espacio de proceso excepto tal vez por alguna solicitud específica que permita que el sistema arbitre aún entre aplicaciones. –

1

PlayStation. Así fue como obtuvimos acceso directo y optimizado a los gráficos de bajo nivel (y otras) características del sistema.

2

Esto se denomina E/S con memoria asignada, y un buen lugar para comenzar es el Wikipedia article.

Los sistemas operativos modernos generalmente lo protegen de esto a menos que esté escribiendo controladores, pero esta técnica es relevante incluso en arquitecturas de PC. ¿Recuerdas el límite de DOS 640 Kb? Esto se debe a que las direcciones de memoria de 640K a 1Mb se asignaron para E/S.

1

An NDIS controlador en Windows es un ejemplo. Esto se llama E/S asignada por memoria y el beneficio de esto es el rendimiento.

0

Motorola 68k series y PowerPC son los más grandes.

1

Consulte Embedded-Systems para ver ejemplos de dispositivos que utilizan E/S asignadas a memoria, p. routers, adsl-modems, microcontrolador, etc.

1

Se usa principalmente para escribir controladores, ya que la mayoría de los dispositivos periféricos se comunican con la CPU principal a través de registros mapeados en memoria.

-1

Puede hacerlo en Windows moderno (y estoy seguro de que Linux también lo ofrece). Se llama archivos asignados de memoria. Puede cargar un archivo en la memoria en Windows y luego escribirlo/modificarlo simplemente manipulando punteros.

+0

No creo que esto sea de lo que habla el OP. La E/S asignada a la memoria es diferente de los archivos asignados a la memoria . –

Cuestiones relacionadas