Espacios de direcciones en PCIe

19

Hay cuatro espacios de direcciones en PCI express:

  • Memoria mapeada
  • E / S mapeada
  • Espacio de configuración
  • Mensaje

¿Alguien puede explicar la importancia de cada espacio de direcciones y su propósito en breve?

Según tengo entendido, todos estos espacios se asignan a la RAM (es decir, la memoria del procesador). El espacio de configuración es el espacio asignado para un conjunto común de registros (presente en todos los dispositivos PCIe). ¿Es este espacio común entre todos los dispositivos PCIe? ¿Y cómo es útil para la operación funcional PCIe?

Este espacio contiene BAR (registro de dirección base). ¿Se utiliza este registro para especificar la dirección disponible en el punto final PCIe?

Soy nuevo en PCIe e intento aprenderlo. Me refiero a la especificación Base, pero creo que está escrita para los lectores que tienen algún conocimiento previo de PCI y PCIe.

También consulte algunas referencias en línea gratuitas útiles para acelerar la comprensión de las especificaciones básicas. Entiendo que siempre que cualquier dispositivo PCIe conectado con el complejo raíz, se asignará con alguna región de memoria.

ronex dicapriyo
fuente

Respuestas:

31

Ha pasado un tiempo desde que se hizo esto, pero odio las preguntas huérfanas :)

Primero, simplifiquemos en exceso una plataforma moderna x86 y pretendamos que tiene 32 bits de espacio de direcciones de 0x00000000 a 0xFFFFFFFF. Ignoraremos todas las áreas especiales / reservadas, agujeros TOLUD (parte superior de la DRAM utilizable inferior, lenguaje Intel), etc. Llamaremos a este mapa de memoria del sistema .

En segundo lugar, PCI Express extiende PCI. Desde el punto de vista del software, son muy, muy similares.

Saltaré a tu 3ra - espacio de configuración - primero. Cualquier dirección que apunte al espacio de configuración se asigna desde el mapa de memoria del sistema . Un dispositivo PCI tenía un espacio de configuración de 256 bytes, esto se extiende a 4KB para PCI express. Este espacio de 4KB consume direcciones de memoria del mapa de memoria del sistema, pero los valores / bits / contenidos reales generalmente se implementan en registros en el dispositivo periférico. Por ejemplo, cuando lee la ID del proveedor o la ID del dispositivo, el dispositivo periférico de destino devolverá los datos aunque la dirección de memoria utilizada sea del mapa de memoria del sistema.

Usted dijo que estos están "asignados a la RAM"; no es cierto, los bits / elementos con estado reales están en el dispositivo periférico. Sin embargo, se asignan al mapa de memoria del sistema. A continuación, preguntó si era un conjunto común de registros en todos los dispositivos PCIe, sí y no. En la forma en que funciona el espacio de configuración PCI, hay un puntero al final de cada sección que indica si hay más "cosas" para leer. Hay un mínimo que todos los dispositivos PCIe tienen que implementar, y luego los dispositivos más avanzados pueden implementar más. En cuanto a lo útil que es para la operación funcional, bueno, es obligatorio y muy utilizado. :)

Ahora, su pregunta sobre BAR (registros de direcciones base) es un buen espacio para segmentar en el espacio de memoria y el espacio de E / S. Al estar algo centrado en x86, la especificación permite la especificación de un tamaño BAR, además del tipo. Esto permite que un dispositivo solicite una BAR mapeada en memoria regular, o una barra espaciadora IO, que consume parte del 4K de espacio de E / S que tiene una máquina x86. Notarás que en las máquinas PowerPC, las barras espaciales de E / S no valen nada.

Una BAR es básicamente la forma en que el dispositivo le dice al host cuánta memoria necesita y de qué tipo (discutido anteriormente). Si solicito por ejemplo 1 MB de espacio asignado en memoria, el BIOS puede asignarme la dirección 0x10000000 a 0x10100000. Esto no consume RAM física, solo espacio de direcciones (¿ves ahora por qué los sistemas de 32 bits tienen problemas con las tarjetas de expansión como las GPU de gama alta que tienen GB de RAM?). Ahora se enviará una memoria de escritura / lectura para decir 0x10000004 al dispositivo PCI Express, y ese puede ser un registro de todo el byte que se conecta a los LED. Entonces, si escribo 0xFF en la dirección de memoria física 0x10000004, se encenderán 8 LED. Esta es la premisa básica de la E / S mapeada en memoria .

El espacio de E / S se comporta de manera similar, excepto que opera en un espacio de memoria separado, el espacio de E / S x86. La dirección 0x3F8 (COM1) existe tanto en el espacio de E / S como en el espacio de memoria y son dos cosas diferentes.

Su última pregunta, los mensajes se refieren a un nuevo tipo de mecanismo de interrupción, interrupciones señaladas por mensaje o MSI para abreviar. Los dispositivos PCI heredados tenían cuatro pines de interrupción, INTA, INTB, INTC, INTD. Estos generalmente se mezclaron entre las ranuras de manera que INTA fue a INTA en la ranura 0, luego INTB en la ranura 1, luego INTC en la ranura 2, INTD en la ranura 3, y luego nuevamente a INTA en la ranura 4. La razón de esto es que la mayoría de PCI los dispositivos implementaron solo INTA y al mezclarlo, teniendo tres dispositivos, cada uno terminaría con su propia señal de interrupción al controlador de interrupción. MSI es simplemente una forma de señalizar las interrupciones utilizando la capa de protocolo PCI Express, y el complejo raíz PCIe (el host) se encarga de interrumpir la CPU.

Esta respuesta puede ser demasiado tarde para ayudarlo, pero tal vez ayude a algún futuro Googler / Binger.

Finalmente, recomiendo leer este libro de Intel para obtener una buena introducción detallada a PCIe antes de continuar. Otra referencia sería Linux Device Drivers, un libro electrónico en línea de LWN .

Krunal Desai
fuente
El Post fue muy útil. Soy muy nuevo en PCIe. Para que ocurra el proceso de enumeración (asignación de espacio de configuración y mapeo), ¿necesitamos soporte de controladores o puede iniciarlo Os?
kamlendra
Gracias, me alegro de que haya sido útil. En general, en las plataformas x86, el software del BIOS realiza cierta asignación de memoria en función de la información del espacio de configuración que analiza de los dispositivos PCI. Los sistemas operativos modernos generalmente aceptan este mapa de memoria tal cual, AFAIK, aunque también revisarán y enumerarán los dispositivos para cargar los controladores apropiados. Recuerdo haber visto algunas cosas interesantes de bajo nivel en Linux que podrían permitirle cambiar potencialmente lo que el BIOS había asignado.
Krunal Desai
Tenga en cuenta que solo la memoria marcada como precargable puede transferir más de un DWORD por transacción; todos los demás espacios pueden transferir solo un DWORD por transacción. El tamaño de una ráfaga está limitado a MAX_PAYLOAD_SIZE (descubierto durante la enumeración).
Peter Smith
Hola. Soy nuevo en PCI y me gustaría un poco de aclaración sobre su respuesta. Declaró que los 256b / 4k bytes de espacio de configuración se asignan a la memoria del sistema. Desde mi auto tutoría, pensé que el acceso al espacio de configuración se maneja a través de un controlador PCI que está estáticamente mapeado en la memoria del sistema. Este controlador proporciona algunos registros (para identificación de dispositivo / función, desplazamiento en el espacio de direcciones, dirección de resultados) que sirven como una pequeña interfaz en el espacio de configuración. En efecto, solo unos 5 - 10 bytes están estáticamente reservados para el controlador PCI. Es esto correcto ???
Cerezo
Entonces, cuando el host (CPU) escribe en un registro en la dirección 0x10000004 un valor 0xFF, el complejo raíz PCI buscará estos datos (tal vez siempre estaba buscando datos en cualquier dirección de 0x10000000 a 0x10100000) y los escribirá en la dirección 0x04 en el punto final (dispositivo PCIe)? ¿Es correcto este entendimiento?
AlphaGoku