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

    Source: geocities.com/gusdelact/progsis

               ( geocities.com/gusdelact)