Historia y Sistemas UNIX Dra. Karina Figueroa
Contenido Historia Evolución de los S.O. Ambiente del sistema UNIX Ambiente grafico Ambiente de texto Compilando y debug en UNIX/LINUX
Evolución de los S.O. Antes de los S.O. Solo Hardware y aplicaciones Sistemas Batch Operación off-line Buffering Simultaneous Peripheral Operation On-line: Spooling Sistemas de multiprogramación Máquinas o procesadores virtuales Sistemas de tiempo compartido Computadoras personales Redes de computadoras personales Sistemas distribuídos o redes de estación de trabajo Sistemas multiprocesadores El presente
Ambiente de LINUX Estructura del núcleo Archivos Interfaz del usuario Terminales de texto Aplicaciones instaladas por defecto
Núcleo Linux
Tipos de archivos Archivos para el filesystem Archivo regular Directorio Link simbólico Hard link (directorio) Soft link (archivos) Dispositivos de entrada y salida o drivers Archivos de dispositivos Block-oriented Transfiere datos en bloques (DD) Archivos de dispositivos Character-oriented Transferencia byte por byte (modem) Para la intercomunicación de procesos Pipe Socket
Directorios / raíz /bin /usr/bin /sbin /lib /usr/lib /tmp /home /etc utilidades de sistema de bajo nivel /usr/bin utilidades de sistema de alto nivel /sbin uitlidades como super usuario /lib Librerías de programas /usr/lib Librerías de programas de alto nivel /tmp Temporal /home Directorios personales /etc Archivos de configuración /dev Dispositivos de hardware /proc Un pseudo-filesystem usado como una interfaz con el kernel
Descriptores de archivos Unix hace una clara distinción entre el contenido de un archivo y la información acerca de un archivo. Los archivos no tiene ninguna información de control (longuitud, fin de archivo, delimitador). Cada archivo consiste de una secuencia de bytes. Con la excepción de dispositivo de un archivo y los archivos especiales del filesystem Toda la información necesaria por el filesystem se mantiene en un archivo llamado inodo. Cada archivo tiene su propio inodo con el que el filesystem lo identifica.
archivos Al menos deben tener Tipo de archivo Núm de hard links asociados al archivo Longitud en bytes del archivo ID dispositivo (i.e., un identificador del dispositivo que contienen al archivo) Núm de inodo que identifica al archivo UID del propietario del archivo ID del grupo del archivo Timestamps que especifican el estatus del inodo en el tiempo Fecha de modificación Permisos de acceso al archivo
Sistema de archivos El sistema de archivos Unix se sitúa dentro del núcleo del S.O. Se encarga de darle estructura en archivos a una partición del disco Implementa el sistema jerárquico de nombres y directorios
Superbloque Almacena Tamaño de los bloques Número de inodos Número de bloques Etc Por ejemplo ver: en Linux (/usr/include/linux/ext2_fs.h) Definición de superbloque ext2_sb Definición de inodo, ext2_inode
Inodo Es la estructura de datos que representa un archivo. Existe un inodo por cada archivo Almacena: El largo del archivo Permisos (12 bits) Número de usuario Número de grupo Fecha y hora de creación, modificación y consulta Núm de enlaces duros El tipo: archivo normal, directorio, link simbólico, dispositivo 12 punteros a bloques en disco que contienen los datos del archivo Un puntero de indirección simple Un puntero de indirección doble Un puntero de indirección triple
inodo
Inodos Los inodos se enumeran como 0,1,2,… El inodo 0 es el directorio raíz de la petición Cómo se busca un nombre? Por ejem /usr/bin/X11/xfig Ubicar partición /, /usr, /home y /tmp Buscamos el archivo bin Buscamos X11 en el inodo donde se encuentra bin Buscar xfig en el inodo donde se encuentra X11
i-nodo
Acceso a archivos El usuario propietario del archivo Los usuarios que pertenecen al grupo El resto de los usarios Chmod comando
Comandos de Linux Abrir una terminal Comandos “clásicos” mkdir <directorio> cd <directorio> mv <origen> <destino> Comandos Linux man top ls –l echo cat <archivo> more <archivo> cp <origen> <destino> history last w ps talk write wall
Comandos sobre archivos chmod ugo+rwx <archivo> chown <user>:<group> <archivo> grep “<expreg>” <archivo> awk “codigo” <archivo> diff <archivo1> <archivo2> wc <archivo> head <archivo> tail <archivo> sed “<expreg>” <archivo> Redireccionamiento < entrada > salida | pipe
Compilando y debug Compilar en C Debug en C
Llamada de sistema Qué son? Como se usan? Ejemplos Son llamados a procedimientos del kernel Necesitan un cambio de privilegios Básicamente Se realiza almacenando el num de llamada al sistema en el registo EAX Almacena los argumentos de la llamada Ejecuta una excepción (código en ensamblador) Se usa el num de llamada al sistema como índice para una tabla de apuntadores de código Obtener la dirección de comienzo del código Se ejecuta con privilegios de kernel Como se usan? Se enumeran en /usr/src/linux-2.x/include/asm-i386/unistd.h Ejemplos Close, corresponde a close() Hay una lista de descriptores entry.S
Modos y llamada de sistema usuario Programa 2 del usuario Programa 1 del usuario 1 4 Tabla de despacho Procedimiento de servicio Modo Kernel 3 2
Llamada de Sistema En su mayoría regresan dos tipos de valores: menor a cero: hubo un error en la ejecución cero o mayor a cero: todo salió bien Si hubo error es posible ver la naturaleza del error a través de la página del manual de la llamada y de la variable errno del archivo de encabezado errno.h
Código escritura en archivo if ( read(fd,fd,sizeof(frase)) < 0 ) { perror("Error en read"); exit(2); } printf("Se leyo: %s \n",frase); close(fd); printf("Fin del ejemplo \n"); #include <strings.h> #include <fcntl.h> #include <stdio.h> #include <errno.h> main() { int fd; char frase[80]; printf(“Leyendo de un archivo \n"); if ( (fd = open(”archivo", O_RDONLY)) < 0) printf("Error no. %d en open \n",errno); exit(1); }
Compilando y ejecutando karina@~> gcc prueba.c karina@~>a.out Escribiendo en un archivo Error no. 2 en open karina@~>grep 2 /usr/include/sys/errno.h #define ENOENT 2 /* No such file or directory */ #define E2BIG 7 /* Arg list too long */ #define ENOMEM 12 /* Not enough core */ #define ENOTDIR 20 /* Not a directory */ :
Una opción más completa if ( (fd = open(”archivo", O_RDONLY)) < 0) { printf("Error %d en open\n",errno); perror("Mensaje"); exit(1); } if ( read(fd, fd ,sizeof(frase)) < 0 ) printf("Error %d en read\n",errno); exit(2);
Tarea Investigar el sistema de archivos FAT Comparar la estructura con la de Linux Ventajas y desventajas Investigar el sistema de archivos vFAT
Compilar un kernel /usr/src/linux make xconfig make dep make bzImage Añada una entra en lilo y grub Lilo.conf Image=/boot/bzImage.myKernel Label=myKernel root=/dev/hda5 read-only