Informática Electrónica Unidad 6 Interfaces y Manejadores de Dispositivos
Modalidad y Materiales Dos clases expositivas a cargo del docente responsable (jlsimon@fceia.unr.edu.ar) Una práctica cargo de los alumnos (Práctica 5) que deberá entregarse antes del fin de cursado. Tres documentos de bibliografía en la página de material de la cátedra Documentos complementarios desarrollados en clase
API Application Program Interface (interface para programas aplicativos) es el mecanismo mediante el cual un programa aplicativo accede a servicios de otros componentes de software Un API puede tomar distintas formas: Librerías Procedimientos Protocolos Objetos
Componentes de un API Convenciones de utilización Estructuras de datos Protocolos de invocación Mecanismos de sincronización
API: Conceptos Conceptualmente, un API expone a los programas del usuario un conjunto de funcionalidades accesibles un forma controlada Un API puede permitir el acceso a dispositivos físicos (device drivers), a servicios de plataforma tales como E/S y comunicaciones o a funcionalidades específicas de una pieza de software
API: Arquitectura Aplicación Aplicación Aplicación API Hardware u otras capas de software
API: Arquitectura Llamada Aplicación Respuesta API
Código: Ejemplos Funcional: int nbytes = send(tx_buf, len); /* C */ Objetos: sc = new Socket(port); salida = new DataOutputStream(sc.getOutputStream()); salida.write(i); // Java
API: Tipos Dependiente del lenguaje: disponible para ser utilizada desde un lenguaje de programación específico. Ejemplo: API de sockets de UNIX (C) Independiente del lenguaje: diseñada de forma tal que puede utilizarse por programas escritos en distintos lenguajes de programación. Ejemplo: web services
API: Ejemplos POSIX: Interface a los servicios de los sistemas operativos UNIX/POSIX WIN32: Interface a los servicios de Windows Linux Standard Base: ídem anteriores para Linux Nvidia CUDA: (Compute Unified Device Architecture) compilador y conjunto de herramientas de desarrollo que permiten a los programadores usar una variación del lenguaje C para codificar algoritmos en GPUs de nvidia.
Componentes de un API Uno o mas archivos de encabezado (*.h) Una o mas librerías (*.o, *.lib, *.dll, etc.) Un paquete de clases (Java: *.jar) Usualmente encapsuladas en un SDK (software Development Kit) Una especificación de protocolo y mensajes
Modelos Un API puede utilizar uno o mas mecanismos para comunicarse con los programas aplicativos, por ejemplo: Llamada a funciones Invocación de métodos Paso de mensajes
API Basada en Funciones Un API basada en funciones se presenta como una librería que se carga dinámica o estáticamente, y un conjunto de funciones o procedimientos que pueden invocarse desde un programa aplicativo. Para utilizarla se debe compilar el aplicativo junto con los encabezados (*.h) y vincular con uno o mas archivos *.lib Si la librería es dinámica se carga sólo en el momento de ejecución, y toma la forma de DLLs (Windows) o SO (Unix/Linux)
API Basada en Funciones Es un modelo muy utilizado Ejemplos: Placas adquisidoras de datos y conversores A/D Placas de comunicaciones Placas de captura de video
API Basada en Mensajes Establecen protocolos de diálogo en una arquitectura similar al modelo OSI Incluyen al menos una capa física, una de enlace y una de aplicación Como el intercambio está basado en mensajes, permiten independizar el lenguaje del aplicativo Ejemplo: NMEA Garmin ELCOM
APIs Basada en Objetos Utilizable cuando el lenguaje de programación soporta el modelo de objetos: Java, C++,.NET Se presenta como un paquete de clases que brindan las funcionalidades requeridas mediante la instanciación de objetos y la posterior invocación de métodos sobre estos objetos Ejemplos: Java ME para dispositivos móviles Componentes de comunicaciones
Caso de Estudio: Windows IP Helper API Diseñada por Microsoft para el acceso de los programas aplicativos a la configuración y el estado de la red IP Está especificada mediante funciones utilizables desde C o C++ Permite la lectura y modificación de la configuración de red en el equipo Es parte integral de los sistemas operativos Windows (XP, 7, 2003, 2008, etc.)
Windows IP Helper API: Componentes Un archivo de encabezado: iphlpapi.h que debe incluirse (con #include) en los programas aplicativos que utilicen el API Un archivo de vinculación estática iphlpapi.lib que debe incluirse en la lista de librerías estáticas a vincular Un archivo de librería dinámica iphlpapi.dll que se carga en el momento de ejecutar los aplicativos que usen el API
Servicios IP Helper API GetNetworkParams(): devuelve parámetros de red GetAdaptersInfo(): devuelve información de las interfaces de red GetIPStatistics() devuelve estadísticas de tráfico IP del equipo...
IP Helper API: Modelo Arquitectural Aplicaciones IP Helper API Sistema Operativo Enlace Capa Física Red
Windows IP Helper API http://msdn.microsoft.com/en-us/library/windows/desktop/aa366073%28v=vs.85%29.aspx
Device Drivers
Bibliografía Arquitectura de diseño de Device Drivers para Windows (en inglés) Linux Device Drivers (en inglés) Comparación de arquitecturas de Device Drivers en Linux y Windows (en inglés) Todos los buenos libros sobre Sistemas Operativos, por ejemplo Sistemas Operativos Modernos de Tannenbaum tienen capítulos dedicados al tema.
Manejadores de Dispositivos En inglés Device Drivers, son piezas de software que se adicionan a los sistemas operativos para permitirles operar dispositivos. Los viejos kernels monolíticos manejaban un conjunto limitado de dispositivos En la actualidad un S.O. debe operar gran multiplicidad de dispositivos, algunos inexistentes cuando el S.O. fue diseñado
Arquitectura open(), read(), write() Espacio De Usuario Aplicación Aplicación Aplicación Aplicación API del S.O. Espacio Del Kernel Device Driver Device Driver Device Driver Kernel Capa de abstracción del hardware Hardware
Qué es un Device Driver? Una pieza de software que nos permite acceder a servicios de uno o mas dispositivos Puede ser provisto por el fabricante del S.O., por el fabricante del dispositivo o por terceros, o incluso, fabricado por el usuario Es fuertemente dependiente de la plataforma y del dispositivo, y generalmente no es portable
Clases de DD Kernel Space: el DD es integrado al código del Kernel del SO, y corre en la región de memoria y con el nivel de privilegio de Kernel. Las fallas del DD pueden comprometer la estabilidad de todo el sistema. User Space: el DD corre como una aplicación de usuario, sin privilegios especiales y en su espacio de memoria propio.
Política y Mecanismo Los DD deben transferir datos desde o hacia la periferia -un disco rígido, un enlace de comunicaciones o un sensor- a la memoria del computador en forma eficiente y previsible Existen distintas técnicas para ejecutar esta tranferencia, entre las mas usadas están DMA (Direct Memory Access) Programmed I/O (interrupciones)
Ciclo de Vida de un DD Un DD puede estar integrado en forma rígida con el SO o puede ser cargado y descargado bajo demanda. Ejemplo del primer caso son los DD de discos internos de una computadora Ejemplo del segundo caso es el de los dispositivos plug-and-play
Marcos de Desarrollo Por la complejidad inherente al desarrollo de DD, los sistemas operativos modernos brindan entornos de programación que proveen funcionalidades de base y permiten al diseñador de DD centrarse en el manejo del dispositivo Consisten en especificaciones, librerías y herramientas a disposición del diseñador
Marcos de Desarrollo Windows: Microsoft proporciona el Windows Driver Foundation, que especifica el modelo arquitectural que deben seguir los DD para los sistemas operativos Windows, y el Windows Driver Kit, con las herramientas necesarias para el diseño, la construcción, prueba y certificación de DD
Marcos de Desarrollo Linux: el proyecto Linux Driver Project aspira crear una plataforma común para el desarrollo, prueba y certificación de DD de este sistema operativo. http://www.linuxdriverproject.org/
Arquitectura Los distintos sistemas operativos imponen en mayo o menor medida una arquitectura para los DD que soportan En algunos casos la arquitectura es obligatoria (Windows) y en otros hay mas elasticidad (Linux)
Arquitectura WDM (Windows kernel mode dd) Application I/O request Win32 API Kernel-Mode Driver User Mode Kernel Mode Windows Kernel I/O Manager KMDF
Arquitectura WDM (Windows user mode dd) Application I/O request Driver Manager Host Process User-mode Driver UMDF Win32 API Runtime Environment Windows Kernel I/O Manager Reflector User Mode Kernel Mode
Arquitectura DD Unix/Linux Espacio De Usuario Aplicación Aplicación Aplicación Aplicación System Calls API Espacio Del Kernel Módulo Módulo Módulo open(), read(), write() Kernel Hardware
Utilización de un DD Según la plataforma, existen servicios del S.O. que permiten acceder en forma controlada a los dispositivos. El modelo de acceso sigue la lógica de archivos. El dispositivo es mostrado por el S.O. como un archivo especial, sobre el cual pueden ejecutarse lecturas, escrituras y funciones de control. En todo caso el programa que quiere acceder al DD debe obtener un manejador (handler).
Device Handlers En Windows se obtiene mediante la llamada CreateFile(), tomando como argumento el device path : \\device\devicex En Unix/Linux, la llamada open() devuelve un file descriptor asociado al archivo de dispositivo en el directorio /dev. El acceso a los servicios del DD se hace vía el API del sistema operativo
Acceso al DD vía API del S.O. Windows: Linux/Unix: CreateFile() open() WriteFile() read() ReadFile() write() DeviceIoControl() ioctl()
Caso de Estudio: RTC Linux Todas las computadoras tienen un Reloj de Tiempo Real, encargado de mantener la referencia temporal externa en forma permanente, aún cuando la PC esté apagada Es frecuentemente utilizado el chip Motorola MC146818 En Linux este dispositivo es representado mediante el archivo especial /dev/rtc
Lectura del RTC en Linux* /* Leer los segundos de RTC */ unsigned char segundos; int fd; fd = open ( /dev/rtc, O_RDONLY); ioctl (fd, 0, &segundos); close (fd); /* Leer fecha y hora del RTC */ char fecha_hora[256]; int fd; fd = open ( /dev/rtc, O_RDONLY); read (fd, fecha_hora, 255); close (fd); * Ubuntu
Práctica 5 Para hacerla se debe conocer al menos: Uso de gcc y make o gmake en Linux Uso de Visual C++ (o Visual Studio) en Windows Elementos necesarios para hacer el TP: Una PC con Windows XP, 7, 2003 o 2008, con al menos una placa de red y el IDE Visual Studio 2010 o 2008 instalado (primera parte) Una PC con Linux instalado (cualquier distribución) y los paquetes gcc y make o gmake instalados El paquete InfElecTP5.rar bajado de la página de la asignatura