
He pasado por algunas clases básicas de sistemas operativos, series de videos, etc., y tengo esta pregunta sobre los controladores del sistema operativo y los controladores del BIOS. ¿Cómo sabe un sistema operativo básico la dirección de memoria de cada pieza de hardware? ¿Cómo funciona un sistema operativo listo para usar en cualquier computadora? ¿Existe un diseño de memoria de dispositivo estándar que todo el mundo conoce? ¿O el sistema operativo redirigiría su IVT para que apunte a los controladores de dispositivo BIOS? Indíqueme algún material de lectura para este tema.
Respuesta1
¿Cómo sabe un sistema operativo básico la dirección de memoria de cada pieza de hardware? ¿Cómo funciona un sistema operativo listo para usar en cualquier computadora?
La CPU sólo conoce la primera dirección para ejecutar. BIOS/Firmware debe "responder" a esta dirección para que la CPU arranque.
Y para la memoria y E/S (espero que sepas que hay 2 espacios en x86: Memoria y E/S, ¿verdad?) había muchos estándares.
Primera era de las PC
Había un área semioficial en la memoria llamada BIOS DATA AREA. Tenía información sobre la cantidad de puertos COM y LPT, controladores de unidades de disquete, sus direcciones de E/S base, etc. El sistema operativo también usó llamadas al BIOS (documentadointerrupciones) para acceder al hardware. Proveedor de placa basecodificadoque se dirige al BIOS. Algunos dispositivos tenían direcciones de E/S documentadas oficialmente.
Las tarjetas de extensión como ISA no tenían ninguna herramienta para ser detectadas excepto el BIOS de la tarjeta de extensión: el BIOS del sistema escaneaba la memoria en busca de patrones especiales para encontrar el BIOS de la tarjeta de extensión y ejecutarlo. El BIOS de la tarjeta puede instalarse como vector de interrupción para "sombrear" las funciones del BIOS para permitir el arranque de red, etc.
En muchos casos, era responsabilidad del usuario configurar la tarjeta con puentes y proporcionar información al software (como BLASTER
la variable env para los parámetros de Sound Blaster, etc.).
Era PnP
PnP es un paquete de especificaciones sobre detección de hardware. Había ISA PNP, COM PORT PNP, LPT PNP, etc. Las especificaciones describen qué debe hacer el software para verificar qué dispositivo está conectado y cómo debe actuar el dispositivo. Algunos buses como PCI tienen capacidad PNP incorporada. El software puede enumerar todas las tarjetas PCI y preguntarles sobre los recursos que necesitan, su proveedor y clase (para encontrar el controlador), etc., y luego configurarlas. La enumeración también es posible para USB.
El "software" en este caso puede ser PNPBIOS o un sistema operativo habilitado para PNP. Entonces, BIOS usó esas especificaciones para encontrar el dispositivo de arranque y el puente PCI Host ("raíz" del bus PCI) y almacenó esta información en tablas especiales en la memoria (de acuerdo con las especificaciones PNPBIOS) y el sistema operativo las leyó y usó capacidades PCI y USB para enumerar y habilitar dispositivos (los protocolos PCI y USB están documentados).
Era ACPI
Las tablas ACPI las completa el proveedor de la placa base y se almacenan en el firmware (el firmware moderno esno"BIOS, pero puede emularlo).
Una tabla especial llamada DSDT describe cualquier dispositivo del sistema, incluidos los botones especiales de la computadora portátil, la batería de la computadora portátil, los ventiladores, el complejo raíz PCI-Express, etc.
Los dispositivos se describen en un lenguaje llamado AML y el sistema operativo debe tener su intérprete. DSDT puede describir memoria, IO y "métodos" (también escritos en AML) para hacer algunas cosas como "cambiar brillo".
ACPI es una gran especificación. El sistema operativo utiliza DSDT para llenar su "árbol de dispositivos" interno y, una vez que obtiene acceso al "complejo raíz PCI-Express" o al USB raíz, utiliza los protocolos PCI-Express y USB para realizar más enumeraciones y configuraciones: la tarjeta puede informar que admite memoria rango A y B, y OS lo configura para usar "B".
Respuesta2
La mayoría de los sistemas operativos se componen de varios componentes, como el administrador de memoria, la entrada y salida, el administrador del sistema de archivos, etc. Hace años, con los sistemas operativos monolíticos, todo se construía en conjunto. La mayoría de los sistemas operativos modernos tienen alguna forma de cambiar dinámicamente los distintos componentes dentro y fuera. Algunos sistemas operativos, los microkernels, tienen solo una funcionalidad de administración básica para el sistema operativo y la mayoría de los componentes adicionales, como el sistema de archivos, se agregan como partes.
Los sistemas operativos modernos también están construidos en una serie de capas algo así como el modelo OSI para pilas de red (verhttps://en.wikipedia.org/wiki/OSI_model) para proporcionar la mayor independencia posible del hardware real en el que se ejecutan.
Entonces, el sistema operativo es básicamente una máquina abstracta a la que se conectan módulos concretos y específicos de hardware. Hay especificaciones de interfaz, que tienden a ser una descripción de máquina algo así como abstracta, que describen el control, los datos y los servicios que los módulos específicos de hardware deben proporcionar al sistema operativo.
Por lo tanto, un instalador de una pila de controladores de dispositivo en particular conoce sus necesidades de hardware específicas y concretas y sus interfaces para un dispositivo, pero el sistema operativo no conoce estas necesidades de hardware concretas y específicas. El sistema operativo delega todas las cosas específicas del dispositivo a la pila de controladores del dispositivo.
Utilizo la palabra "pila" porque la funcionalidad que realiza la comunicación real del dispositivo normalmente se compone de una serie de capas. Puede ver esto con el Administrador de dispositivos de Windows en la mayoría de los dispositivos, que muestran un conjunto de archivos de controladores que se utilizan para un dispositivo en particular.
Por lo tanto, existen varios componentes de software que en realidad pueden provenir de diferentes proveedores.
Entonces, si el sistema operativo quiere conocer detalles sobre el hardware, le solicita esos detalles al controlador del dispositivo.
Un sistema operativo funciona de inmediato en una variedad de plataformas de hardware porque los proveedores del hardware específico que conforma la plataforma proporcionan la pila de controladores que el sistema operativo necesita para funcionar en el hardware concreto y específico.
Los diferentes sistemas operativos tendrán diferentes especificaciones de interfaz para los controladores de dispositivo para los que está diseñado el sistema operativo. Entonces, para Linux, debe tener controladores compatibles con el sistema operativo Linux que proporcionen la interfaz del controlador Linux. Para Windows es necesario tener controladores de interfaz de Windows.
Dado que existe una pila de controladores, es posible que algunos de los componentes de software de la pila sean los mismos entre diferentes sistemas operativos, siempre que se utilice el mismo hardware. Las partes de la capa que se comunican directamente con el dispositivo de hardware pueden ser las mismas, pero los niveles superiores de la pila, los que deben interactuar con el sistema operativo real, serán diferentes ya que diferentes sistemas operativos tienen diferentes interfaces de controlador de dispositivo.
Hay toneladas de libros disponibles sobre sistemas operativos y toneladas de proyectos de código abierto para varios sistemas operativos.
Échale un vistazo a esta discusión.https://www.quora.com/Cuál-es-el-mejor-libro-sobre-sistemas-operativos
Hay varios libros gratuitos en línea, comohttp://pages.cs.wisc.edu/~remzi/OSTEP/
Y eche un vistazo a esta página de github sobre sistemas operativos de código abierto.https://github.com/showcases/open-source-operating-systems
Respuesta3
En una PC moderna, cada pieza de hardware proporciona información básica sobre sí misma cuando se le pregunta. Por ejemplo, muchos periféricos están conectados albus PCI. Cuando el sistema operativo quiere saber qué periféricos están conectados al bus PCI, envía una instrucción al bus pidiendo a cada periférico que envíe una descripción. Se llamaenumerando(los dispositivos en) el autobús. Esta descripción utiliza un código numérico para identificar cada modelo de dispositivo llamadoID PCI. Cuando el sistema operativo ve que está presente un dispositivo con una determinada ID de PCI, intenta cargar un controlador para esa ID de PCI; Si el sistema operativo no tiene un controlador, puede intentar descargar uno o informar al usuario que hay un dispositivo desconocido presente.
Por ejemplo, en Linux, puede ejecutar el comando lspci
para enumerar los dispositivos PCI. Tiene varias opciones para mostrar diferentes tipos de información, prueba un poco si tienes curiosidad. Describo el mecanismo que utiliza Linux para cargar un controlador para un dispositivo PCI enesta respuesta. Ese es sólo un ejemplo; Otros sistemas operativos de PC tienen un mecanismo para hacer lo mismo, pero ese mecanismo puede ser completamente diferente.
¿Cómo sabe el sistema operativo que hay un bus PCI y cómo acceder al bus? Creo que está codificado si lo construyes para una arquitectura de PC. Tenga en cuenta que la "arquitectura de PC" es más específica que la "CPU x86": podría colocar un conjunto diferente de buses alrededor de una CPU x86, pero entonces no se llamaría una PC (moderna).
Las diferentes arquitecturas de máquinas pueden tener o no formas de enumerar los controladores que están presentes. Por ejemplo, hasta mediados de la década de 1990, la PC no tenía tales métodos. Antes del bus PCI, existía elautobús ISA. En un bus ISA, si desea saber si un dispositivo está presente en una dirección determinada, le envía un comando. Si obtienes una respuesta que entiendes, bien. Si el comando bloquea la computadora o causa un efecto no deseado porque hay un periférico completamente diferente, difícil. En una PC de 1908, el sistema operativo preguntaba al BIOS sobre los dispositivos que estaban configurados (pero el BIOS no enumeraba todos los dispositivos, solo los tipos de dispositivos que el BIOS conocía), y el usuario que instaló una tarjeta de extensión necesitaba proporcionar su detalles de configuración ya sea en el BIOS o en la configuración del sistema operativo. El BIOS incluía algunos controladores básicos para el teclado y la pantalla, y los sistemas operativos como DOS los llamaban controladores; otros sistemas operativos (o aplicaciones) podrían acceder al hardware directamente (especialmente para la pantalla, ya que los controladores del BIOS eran lentos y limitados).
Incluso hoy en día, la mayoría de los sistemas integrados no tienen una forma de enumerar los periféricos integrados. Muchos dispositivos (especialmente los basados en ARM, pero no solo aquellos) describen sus periféricos en una estructura de datos llamadaárbol de dispositivos. Esta estructura de datos se almacena en ROM o memoria flash y lagestor de arranque(el equivalente del BIOS) comunica los datos al sistema operativo. De esta manera, el sistema operativo no tiene que estar diseñado para un conjunto específico de dispositivos, lee esta información cuando se inicia.