Tema I. Introducción a la programación de sistemas. + Definicion. La programación de sistemas es el estudio de la construcción de modulos de software utilizando servicios de un sistema de computo que administra recursos de hardware y/o software. Un ejemplo de sistema de computo que administra recursos es el sistema operativo. + Arquitectura de un sistema operativo desde el punto de vista de programacion de sistemas. En la teoria de sistemas operativos se definieron como administradores de recursos para manejar con eficiencia los diferentes componentes del hardware. Sin embargo existe otra perspectiva, que es la que concibe una persona orientada a sistemas y que interactua con el sistema operativo por medio de lenguajes de programacion. Un sistema operativo internamente es un cojunto de funciones (o algoritmos) que manipulan estructuras de datos que representan informacion sobre los distintos recursos de hardware. Es decir, un sistema operativo es un modulo de software que es cargado desde que la computadora es iniciada y queda a cargo de la administracion de todos los recursos de hardware y software. Cuando un programa quiere interactuar con el hardware, no va directamente al mismo; por que existe el modulo intermedio que es el sistema operativo. El sistema operativo recibe peticiones tanto de hardware y software. El nucleo o kernel del sistema es el modulo de software que se encarga de procesar dichas peticiones y siempre da la imagen de estar activo. Un kernel es escrito en un lenguaje de programacion. En el inicio de los sistema de computo eran rutinas o funciones en ensamblador. Al ser inventado lenguaje C, se revoluciono la codificacion de los sistemas operativos dado que C reemplazo en su mayoria el papel de un lenguaje ensamblador (dado su facil implantacion como compilador, su semajanza a muchas instrucciones de ensamblador y su facil traduccion a lenguaje ensamblador) quedando como un lenguaje ensamblador universal y de un nivel superior dada su orienteacion a funciones. Solo rutinas muy especificas del sistema operativo (interaccion con cuestiones especificas de la arquitectura de computadora como manejo del CPU y sus registros, manipuladores de memoria, interrupciones de hardware) son escritas en ensamblador y pueden ser reescritas a otras plataformas. Un ejemplo de esta filosofia fue el sistema operativo UNIX. + Conceptos basicos de sistemas operativos. El kernel es el centro de todo el sistema operativo. Es cargado a RAM cuando el sistema se inica y contiene procedimientos critocs para que el sistema opere. Programas como el shell y los denominados servicios o demonios son tareas auxiliares. En el curso al hablar del sistema operativo se hara viendo mas al kernel. El sistema operativo tiene dos funciones: + Interactuar con los componentes de hardware por medio de rutinas de bajo nivel dependientes de la arquitectura de computadoras + Proveer un ambiente de ejecucion para las aplicaciones (software) que se ejecuta en la computadora. Un sistema operativo es un multiusuario (donde tipicamente existen varios usuarios y grupos) y donde la seguridad es un servicio mas del sistema operativo. Es multitarea o multiproceso y donde un proceso es una instancia de un programa en ejecucion o el contexto de ejecucion. En un sistema uniprocesador, el sistema operativo planifica a cada proceso para que tengan un uso justo de CPU. Cada proceso tiene la ilusion de ser el unico en la computadora y con acceso unico a los servicios del sistema operativo por medio de llamadas al sistema operativo. Este enfoque se conoce como el modelo proceso/kernel, en el cual un proceso al ejecutar instrucciones maquina que no necesitan recursos de computo esta en modo usuario y cuando invoca a un servicio del sistema operativo entonces se pone en un estado de ejecucion del kernel. Un kernel se compone de multiples capas de servicios desde la administracion de procesos, tareas de Entrada/Salida, Tareas servidores y tareas de usuario (tipicamente ya fuera del kernel). Actualmente la arquitectura de un kernel esta pensada para construirlo en modulos y poder extenderlo. + Kernel de UNIX UNIX tiene una filosofia de proceso/kernel, donde los procesos lo invocan por medio de llamadas al sistema operativo. Internamente el kernel tiene cargadas una serie de rutinas que se activan por: + Un proceso que invoca una llamada al sistema operativo + El CPU puede generar una expecion que se presenta ante condiciones anormales de un programa y via una interrupcion, el kernel toma dicha expecion (un apuntador nulo por ejemplo) + Un dispositivo periferico genera una señal de interrupcion al CPU. Cada interrupcion es manejada por el kernel via un manejador de interrupciones y pueden ser invocados en un tiempo no predectible y de manera asincrona. + Un flujo (hilo) del kernel es ejecutado (por ejemplo una rutina de sincronizacion de disco/memoria) Por cada proceso, se guarda la imagen del programa que esta ejecutando, principalmente los registros del CPU al momento de ejecucion. UNIX es un sistema operativo reentrante en el cual se pueden ir turnando en ejecucion procesos en modo usuario, la atencion a excepciones o llamadas al sistema y la atencion a interrupciones. UNIX maneja un espacio de direcciones privado por cada proceso, dando la imagene que tiene toda la memoria virtual para el solo. El esquema de UNIX es por medio de paginas de memoria virtual, donde utiliza memoria RAM y area de disco para construir lo que se conoce como memoria virtual UNIX tiene un sistema de archivos que permite accesar de manera uniforme archivos de bytes, directorios, tuberias, sockets, dispositivos de bloques y caracteres siendo esto ultimo el punto de contacto con los manejadores de dispositivos. Los manejadores de dispositivos son modulos del kernel que se incorporan dinamicamente dependiendo del hardware del sistema Ademas UNIX utiliza sincronizacion entre procesos para manejar concurrencia y evitar condiciones de carrera, tipicamente lo hace por medio de señales,semaforos, colas de mensajes y memoria compartida. + Llamadas al sistema operativo. Una llamada al sistema operativo es una rutina en codigo maquina que permite pedir servicios al sistema operativo, utilizando un lenguaje de programacion. Las llamadas al sistema operativo son atendidas por el kernel via una interrupcion http://www.kernel.org/pub/ - Codigo fuente del kernel http://www.ibiblio.org/linux-source/ - Navegador de Codigo fuente Linux en linea http://lxr.linux.no/ - Referencia cruzada de codigo fuente Linux en linea http://www.kernelnewbies.org/ - Guia para principiantes http://www.kernelnewbies.org/documents/kdoc/ - Documentos sobre Kernel http://www.tldp.org/LDP/tlk/tlk.html - The Linux Kernel http://www.linuxdoc.org - Documentacion Linux