2011-07-01 16 views
12

Estoy buscando algunos indicadores para entender cómo el kernel de Linux implementa la configuración de varios relojes de hardware. Esto básicamente se relaciona con el trabajo de configuración de los diversos relojes que usarán las funciones de hardware como la LCD, UART, etc. Por ejemplo, cuando Linux arranca, ¿cómo maneja la configuración de los relojes para UART o USB? Tal vez algo así como un gerente de reloj o algo así.Implementación de señales de reloj de hardware en Linux Kernel

Básicamente estoy tratando de implementar algo similar para un sistema operativo diferente en un nuevo hardware en el que estoy trabajando. Cualquier ayuda sería realmente apreciada.

[Editar]
Gracias por las respuestas y los enlaces. Así que aquí está lo que he implementado hasta ahora. Esto debería darte una idea de hacia dónde me dirijo.

Busqué el Manual de referencia de hardware para el sistema particular al que estoy apuntando y escribí un código para supervisar/modificar las señales/pines de los periféricos que me interesan, es decir, activarlos/desactivarlos desde la línea de comandos. una colección de estos relojes/señales en conjunto controlan un periférico. El HRM diría que si desea encender el UART o algo así, encienda tal y tales señales/pines. Y @BjoernD sí, estoy usando algo así como una función mmap() para hablar con los periféricos.

Lo esencial de mi pregunta es que quiero entender el diseño y la implementación de un Administrador de reloj/periférico que utiliza la utilidad que ya he escrito. Este Clock/Peripheral Manager me daría el control de habilitar/deshabilitar los periféricos que quiero. Básicamente, este Manager me permitiría hacer cambios en el código de inicio que se está ejecutando en este momento. Además, durante el tiempo de ejecución, los procesos pueden llamar a este administrador para encender/apagar los dispositivos de modo que se optimice el consumo de energía. Puede que no tenga mucho sentido, pero yo mismo estoy tratando de entender esto.

Ahora estoy seguro de que algo como esto se habría implementado en Linux o para cualquier sistema operativo por cuestiones de rendimiento (nadie querría perder energía encendiendo todos los periféricos en el arranque). Quiero entender la arquitectura de software de la misma. La referencia de cualquier sistema operativo sería a partir de ahora para al menos obtener una ventaja. Además, no estoy escribiendo mi propio sistema operativo, hay un sistema operativo en su lugar, pero estoy buscando más en un software de nivel tablero aka BSP para trabajar. Pero de todos modos, gracias por el enlace al sistema operativo, son realmente buenos. Lo aprecio.

Gracias!

Respuesta

6

Lo que quiere lograr es muy específico para a) la plataforma que está utilizando yb) el dispositivo que desea utilizar. Por ejemplo, en x86 hay 3 formas de comunicarse con un dispositivo:

  1. Las interrupciones permiten que el dispositivo indique la CPU. El sistema operativo generalmente proporciona mecanismos para registrar manejadores de interrupciones, funciones a las que se recurre cuando ocurre una interrupción. En Linux, vea request_irq() y amigos en linux/include/interrupt.h
  2. La E/S mapeada en memoria es la memoria física del dispositivo que el BIOS de la plataforma pone a disposición de la misma manera que también accede a la memoria física simple, simplemente escribiendo a una dirección de memoria. Lo que está exactamente detrás de dicha memoria (por ejemplo, registros de configuración de la interfaz de red o un buffer de cuadros LCD) depende del dispositivo y generalmente se especifica en la hoja de datos del dispositivo.
  3. Se accede a los puertos de E/S a través de un espacio de direcciones especial e instrucciones especiales (INB/OUTB & co.). Aparte de eso, funcionan de forma similar a la memoria de E/S.

Hay una multitud de formas de averiguar qué recursos proporciona un dispositivo y dónde el BIOS los asignó.Algunas plataformas usan tablas ACPI (google usted mismo para la especificación de página de 1.000k), PCI proporciona información en dispositivos de forma estandarizada a través del espacio de configuración PCI, USB tiene formas similares de descubrir dispositivos conectados al bus y algunos dispositivos, por ejemplo, UARTS , simplemente se especifica que están disponibles en un rango de E/S preconfigurado que se fija para su plataforma.

Como inicio para entender Linux, recomendaría "Understanding the Linux kernel". Para obtener detalles sobre cómo maneja Linux los dispositivos y qué hay para escribirlos, eche un vistazo a Linux Device Drivers. Además, deberá echar un vistazo a las peculiaridades de su plataforma y del dispositivo que desea conducir.

Si desea iniciar un sistema operativo propio, una UART es ciertamente algo que será muy útil para imprimir resultados de depuración, por lo que es posible que desee hacerlo primero.

Ahora que anoté todo esto, parece que su pregunta real es: Cómo comenzar con el diseño del sistema operativo. Esta pregunta debería ser muy valiosa para usted: What are some resources for getting started in operating system development?

+0

Así que lo que básicamente estoy tratando de hacer es tener algún tipo del sistema en el lugar para que pueda encender apropiadamente las señales/relojes requeridos para el h/w respectivo. –

+0

Contd (la clave de retorno supuestamente pega el comentario) Así, por ejemplo, durante el arranque quizás solo se encienda UART, pero el resto quizás se apague para ahorrar energía. Más tarde, cuando el LCD necesite iniciarse puede enviar una solicitud a un administrador en ciertas señales (esto se conocería a partir de las especificaciones h/w). Por lo tanto, la utilidad tomará las medidas apropiadas al configurar los bits necesarios en el registro de control para LCD "HIGH". –

+0

Estoy seguro de que esto se ha tratado de una manera organizada en el kernel de Linux, es solo que no sé dónde buscar. –

0

Los dos grandes usuarios de la mayoría de las computadoras son la CPU y los discos. Ambos tienen capacidades para ahorrar energía en Linux. El reloj de la CPU puede ralentizarse cuando el sistema no está ocupado y los motores de disco se pueden detener cuando no hay E/S. Para un UART, incluso si guarda toda la potencia que utiliza apagando su reloj, todavía es muy pequeño en comparación con los demás porque un UART no tiene mucha lógica.

mejores maneras de ahorrar energía son 1) de energía más eficiente de suministro 2) reemplazar el disco giratorio con SSD 3) Reduzca la velocidad del bus de la CPU y la memoria

+0

¿Y cómo se relaciona su respuesta con la pregunta? – BjoernD

+0

Steve: te agradezco que menciones las formas de ahorrar energía, pero estoy buscando una manera más de administrar mis periféricos de manera eficiente para ahorrar energía, como he detallado en mi pregunta. Sé que la escala de frecuencia de CPU dinámica es una buena opción, pero no estoy trabajando en ello a partir de ahora. Y no solo estoy hablando de UART, sino más bien de un administrador para el manejo de todos los periféricos, incluidos LCD, USB, etc. que supongo que estarían de acuerdo en consumir mucha energía. –

Cuestiones relacionadas