2011-07-11 24 views
7

Recientemente he comenzado a entrar en la materia bajo nivel y que mira en gestores de arranque y sistemas operativos, etc ...Confundido sobre la asignación de memoria

lo que tengo entendido, para procesadores ARM, por lo menos, los periféricos son inicializados por el gestor de arranque y luego están mapeados en el espacio de la memoria física. Desde aquí, el código puede acceder a los periféricos simplemente escribiendo valores en el espacio de memoria asignado a los registros de periféricos. Más tarde, si el chip tiene una MMU, se puede utilizar para reasignar aún más en espacios de memoria virtual. ¿Estoy en lo cierto?

Lo que no entiendo son (asumiendo que lo que he dicho anteriormente es correcta):

  • ¿Cómo funciona el gestor de arranque inicializar los periféricos si no han sido asignadas a un espacio de direcciones todavía?
  • Con la asignación de memoria virtual, hay tablas que le dicen a la MMU dónde asignar qué. Pero, ¿qué determina dónde se mapean los periféricos en la memoria física?

Respuesta

5

Cuando se inicia un dispositivo, la MMU se apaga y normalmente se ejecuta en modo supervisor. Esto significa que cualquier dirección que proporcione son direcciones físicas.

Cada ARM SOC (sistema en Chip) tendrá un mapa de memoria. La correspondencia de las direcciones a los dispositivos se determina por qué datos físicos y línea de dirección se conectan a qué partes del procesador. Toda esta información se puede encontrar en un manual de referencia técnica. Para los chips OMAP4, se puede encontrar here.

Existen varias formas de conectar un dispositivo fuera de chip. Uno está usando GPMC. Aquí tendrá que sepcificar la dirección en la GPMC que desea usar en el chip.

Cuando se enciende la MMU, estas direcciones pueden cambiar dependiendo de cómo esté programada la MMU. Normalmente, el acceso directo al hardware también estará disponible solo en modo kernel.

+0

Gracias, eso ayudó a aclarar las cosas. Una última pregunta: ¿es posible 'desasignar' algo en el espacio de la memoria física? – tangrs

+1

Puede reprogramar la GPMC y eliminar efectivamente la memoria del mapa aunque dudo que haya un buen caso de uso para esto. – doron

0

No se pueden reasignar periféricos en el procesador ARM, todos los dispositivos periféricos corresponden a posiciones fijas en el mapa de la memoria. Incluso los registros se asignan a la memoria RAM interna que tiene posiciones fijas permanentes. Lo único que puede reasignar son los dispositivos de memoria como SRAM, FLASH, etc. a través de FSMC o una función similar. Sin embargo, puede reasignar un periférico personalizado de complemento mapeado en memoria que no es parte del núcleo en sí, digamos un controlador de disco duro por ejemplo, pero lo que está dentro del núcleo de ARM está arreglado.

Un buen comienzo es echar un vistazo a las hojas de datos del procesador en los sitios de la compañía, como Philips y ST, o la arquitectura ARM misma en www.arm.com.

1

Aunque esta es una vieja pregunta, pensé en responder a esto, ya que podría ayudar a otros como yo a tratar de obtener suficientes respuestas de stackoverflow.

que la explicación es casi correcta, pero quiere dar poca explicación en este caso: periféricos son inicializados por el gestor de arranque y luego son mapeados en el espacio de memoria física

periféricos OnChip ya tiene un espacio de direcciones físicas predefinido. Para otros periféricos externos IO asignados (como PCIe), necesitamos configurar un espacio físico adicional, pero su rango de espacio de direcciones físicas aún está predefinido. No se pueden configurar en el espacio de direcciones al azar.

Ahora a sus preguntas, estas son mis respuestas. ¿Cómo inicializa el gestor de arranque los periféricos si aún no se han mapeado en un espacio de direcciones?

Como mencioné anteriormente, todos los periféricos (en el chip) tienen un espacio de dirección física predefinido (generalmente se enumerará en el capítulo del mapa de memoria del procesador RM). Por lo tanto, los cargadores de arranque (suponiendo que MMU está apagado) pueden acceder directamente a ellos.

Con asignación de memoria virtual, hay tablas que le dicen a la MMU dónde asignar qué. Pero, ¿qué determina dónde se mapean los periféricos en la memoria física?

Con VMM, hay tablas de páginas (creadas y almacenadas en DRAM física por kernel) que le indican a MMU que asigne el directorio virtual al directorio físico. En Linux kernel con 1G kernel virt space (digamos kernel virtual addrs de 0xc0000000-0xffffffff), los periféricos en chip necesitarán tener un espacio de máquina virtual dentro del kernel VM space (para que kernel & solo kernel pueda acceder a él); y las tablas de páginas se configurarán para mapear ese addr marginal periférico a su addr físico real (los definidos en RM)