ARISO 2 Escola Tècnica Superior d’Enginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya) Esta obra está bajo una licencia Reconocimiento-No comercial-Compartir bajo la misma licencia 2.5 España de Creative Commons. Para ver una copia de esta licencia, visite: http://creativecommons.org/licenses/by-nc-sa/2.5/es/ o envíe una carta a: Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. Eres libre de: copiar, distribuir y comunicar públicamente la obra hacer obras derivadas Bajo las condiciones siguientes: Atribución. Debes reconocer la autoría de la obra en los términos especificados por el propio autor o licenciante. No comercial. No puedes utilizar esta obra para fines comerciales. Licenciamiento Recíproco. Si alteras, transformas o creas una obra a partir de esta obra, solo podrás distribuir la obra resultante bajo una licencia igual a ésta. Al reutilizar o distribuir la obra, tienes que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor Advertencia: Los derechos derivados de usos legítimos u otras limitaciones reconocidas por ley no se ven afectados por lo anterior. Esto es un resumen legible por humanos del texto legal (la licencia completa) Introducción Hardware ◦ Dispositivo ◦ Controlador Software Dispositivo Controlador Dispositivo ◦ Driver (parte del SO) Métodos espera ◦ Busy waiting ◦ Interrupts ◦ DMA (Direct Memory Acces) Bus Organización virtual de la información almacenada / bin etc tmp lib dev usr profes alumnes ariso2 rubenb docs F1.txt practicas F2.txt proyectos Tira de bytes identificados por un nombre Tipos: ◦ Regular Files Ficheros con datos de usuario ◦ Directories ◦ Character Special Files Dispositivos E/S en serie (terminales, impresoras) Información organizada en bloques: ◦ Sector: Sector unidad de transferencia Definida por el HW #sector disco, cara, pista, … ◦ Bloque: Bloque unidad de asignación Definido por el SO Que tamaño definimos? Estructura Árbol Secuencia de bytes Secuencia de bloques Acceso a ficheros ◦ Secuencial Para leer el elemento n hay que leer los n-1 anteriores ◦ “Aleatorio” (Random Acces Files) Puedes escoger que elemento leer en cada momento Atributos de un fichero ◦ Metadatos ◦ Información del SO Ejemplos de atributos ◦ ◦ ◦ ◦ ◦ ◦ Creador Dueño Flags (Read-only, oculto, sistema) Fechas (creación, modificación, último acceso) Tamaño Protección Operaciones ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ Crear Eliminar Abrir Cerrar Leer Escribir Posicionar Obtener atributos Establecer atributos Llamadas a sistema UNIX/Linux Crea las estructuras de datos en SO para usar un fichero int open (char *path, int flags, [int rights]) ◦ path: ruta del fichero que se va a abrir ◦ flags: modo de apertura ◦ rights: permisos RWX (en caso de creación) ◦ Devuelve: el id de la TC que se ha asignado -1 en caso de error Flags : ◦ Modo apertura (obligatorio) O_RDONLY O_WRONLY O_RDWR ◦ Modo de creación (opcional) O_CREAT : P, lo crea ∃, lo abre O_EXCL+O_CREAT : P, lo crea ∃, error O_APPEND: posiciona el puntero en EOF O_TRUNC: borra el contenido del fichero previamente Ejemplos ◦ fd=open(“hola1.txt”, O_WRONLY|O_CREAT, 660); ◦ fd=open(“hola2.txt”, O_CREAT|O_WRONLY|O_TRUNC); ◦ fd=open(“hola3.txt”, O_RDONLY); Que hace el SO; ◦ Buscar posición en la tabla de canales (TDVA) ◦ Nueva entrada en la TFA ◦ TC[n] TFA Libera las estructuras de datos del SO de un fichero int close (int file_descriptor) ◦ file_descriptor : posición de la TC ◦ Devuelve: 0 OK -1 en caso de error Ejemplos ◦ fd=open(“hola.txt”, O_WRONLY|O_CREAT, 660); ◦ close(fd); ◦ close(1); Que hace el SO; ◦ Libera la posición en la tabla de canales (TDVA) ◦ Decrementa o libera TFA ◦ Si el proceso finaliza, se liberan todos las entradas de la TC Duplica una entrada de la tabla de canales int dup (int file_descriptor) ◦ file_descriptor : posición de la TC ◦ Devuelve: el id de la TC que se ha asignado -1 en caso de error Ejemplos ◦ fd=dup(1); Que hace el SO; ◦ Busca la primera posición libre de la TC ◦ La nueva posición de la TC apunta al mismo punto de la TFA que la pasada por parámetro ◦ Incrementa en #referencias en la TFA Igual que dup, pero especificando el FD destino int dup2 (int fd_origen, int fd_destino) ◦ fd_origen: posición de la TC a duplicar ◦ fd_destino: posición de la TC donde duplicar ◦ Devuelve: el id de la TC que se ha asignado -1 en caso de error Leer datos de un dispositivo virtual int read (int fd, void *buffer, int nbytes) ◦ fd: posición de la TC ◦ buffer: donde se guardaran los datos leídos ◦ nbytes: numero de bytes que queremos leer ◦ Devuelve: -1: en caso de error 0: Fin de fichero (no hay mas datos) >0: #bytes leídos Ejemplos ◦ n = read(fd, &c, sizeof(char)); ◦ n = read(fd, &vect, 16); Que hace el SO: ◦ Lee los bytes correspondientes ◦ Avanza el puntero (*r/w) de la TFA Escribe datos en un dispositivo virtual int write(int fd, void *buffer, int nbytes) ◦ fd: posición de la TC ◦ buffer: datos a escribir ◦ nbytes: numero de bytes que queremos escribir ◦ Devuelve: -1: en caso de error >0: #bytes escritos Ejemplos ◦ n = write(fd, &c, sizeof(char)); Modifica *r/w (puntero de lectura/escritura) int lseek(int fd, long offset, int whence) ◦ fd: posición de la TC ◦ offset: desplazamiento en bytes de *r/w ◦ whence: punto inicial del *r/w SEEK_SET: inicio fichero SEEK_CUR: posición actual SEEK_END: final fichero ◦ Devuelve: -1: en caso de error ≥0: nueva posición de *r/w (desde el inicio) Ejercicios solucionados int main(void) { char c; while (read(0,&c,sizeof(char)) > 0 ) { write(1,&c,sizeof(char)); } } int main(void) { char buffer[64]; int size; size=read(0,buffer,sizeof(buffer)); while (size > 0 ) { write(1,buffer,size); size=read(0,buffer,sizeof(buffer)); } } int main(int argc, char **argv) { int fo,fd,size; char buffer[128]; fo=open(argv[1],O_RDONLY); fd=open(argv[2],O_WRONLY|O_CREAT|O_EXCL,0600); size=read(fo,buffer,sizeof(buffer)); while (size > 0 ) { write(fd,buffer,size); size=read(fo,buffer,sizeof(buffer)); } close(fo); close(fd); } int main(int argc, char **argv) { int fo,fd,size; char buffer[128]; fo=open(argv[1],O_RDONLY); fd=open(argv[2],O_WRONLY|O_CREAT,0600); lseek(fd,0,SEEK_END); size=read(fo,buffer,sizeof(buffer)); while (size > 0 ) { write(fd,buffer,size); size=read(fo,buffer,sizeof(buffer)); } close(fo); close(fd); } int main(int argc, char** argv) {char c; int fo,i,j=0,fin,size,x,actual; fo=open(argv[1],O_RDONLY); fin=lseek(fo,0,SEEK_END); lseek(fo,0,SEEK_SET); size=strlen(argv[2]); for(i=0;i<fin;i++) { read(fo,&c,sizeof(char)); if(c==argv[2][0]) {x=1; j=0; actual=lseek(fo,0,SEEK_CUR); while(c==argv[2][j] && j<size && x>0) { x=read(fo,&c,sizeof(char)); j++;} if(j==size) printf("%d\n",actual-1); lseek(fo,actual,SEEK_SET); } } } typedef struct {char id[20]; int cantidad; } registro; int main() { int fic; registro r1,r2,r3; r1.cantidad=10; sprintf(r1.id,"Panrico"); r2.cantidad=20; sprintf(r2.id,"Bimbo"); fic=open("stock.db",O_RDWR|O_CREAT,0600); write(fic,&r1,sizeof(registro)); write(fic,&r2,sizeof(registro)); lseek(fic,0,SEEK_SET); read(fic,&r3,sizeof(registro)); printf("%s, %d\n",r3.id,r3.cantidad); close(fic); } Ejemplos de File System Asignación de ficheros “contigua contigua” contigua ◦ Todos los bloques del archivo están contiguos ◦ Se necesita una única entrada por archivo: Bloque inicial Longitud del archivo ◦ Ventajas: Acceso eficiente al disco Localización del bloque n sencilla ◦ Desventajas: Asignación previa, no flexible Archivo Directory entry 1 1 8 Location of file 8 File Size 7 1 2 Date and Time 4 1 4-15 CD # L File Name Sys Flags Extended attribute record lenght Interleave Directory entry length BaseName.Ext;Ver Location of file: file #sector inicio fichero Root Directory Directory entry Directory entry Directory entry Directory entry Asignación de ficheros “encadenada encadenada” encadenada Cada bloque de datos reserva espacio para un puntero que indica cual es el siguiente bloque del archivo Se necesita una única entrada por archivo: Bloque inicial ◦ Ventajas: Asignación previa o dinámica ◦ Desventajas: Para acceder al bloque n, hay que acceder a todos los anteriores Archivo Asignación “encadenada encadenada” encadenada en tabla Los punteros a bloques se guardan juntos en una tabla, no en los propios bloques Se necesita una única entrada por archivo: Bloque inicial ◦ Ventajas sobre la anterior: Para acceder al bloque n, hay que acceder a la tabla Se puede replicar la tabla Archivo Directory entry 8 3 1 10 File name Ext. Atr Reserved 2 2 2 4 Time Date 1st Bl Size FAT-12, FAT-16, FAT-32 ◦ 12, 16 y 32: #bits @disco Block Size FATFAT-12 FATFAT-16 FAT -32 0,5 KB 2 Mb 1 KB 4 Mb 2 KB 8 Mb 128 Mb 4 KB 16 Mb 256 Mb 1 Tb 8 KB 521 Mb 2 Tb 16 KB 1 Gb 2 Tb 32 KB 2 Gb 2 Tb Asignación “indexada indexada” indexada Existe un bloque índice por fichero El bloque índice contiene: Punteros a bloques que forman el fichero Acaba con un puntero a NULL ◦ Ventajas: Buen acceso secuencial y directo ◦ Desventajas: Perdida de espacio (bloques de índices grandes) Muchos accesos en ficheros grandes (bloques de índices pequeños) Archivo i Asignación “indexada indexada” indexada multinivel ◦ Existe un bloque índice por fichero El bloque índice contiene: Punteros a bloques que forman el fichero Punteros a bloques con más índices Acaba con un puntero a NULL Se crea una estructura jerárquica de índices ◦ Ventajas: Muy pocos accesos incluso en ficheros grandes Poca perdida de espacio en ficheros pequeños Bloque Datos i-node Bloque Datos Bloque 1 indirección Bloque Datos Bloque Datos Bloque 2 indirección Bloque Datos Bloque Datos Bloque Datos Bloque Datos Bloque 168 Bloque 174 Bloque 185 Bloque 448 Bloque 251 Bloque 3 indirección Directory entry 2 14 # i-node File name i-Nodo 64 bytes Campo Bytes Descripcion Mode 2 File Type, protection bits Nlinks 2 # directory entries que apuntan a este i-nodo Uid 2 Id del usuario al que pertenece el fichero Gid 2 Id del grupo al que pertenece el fichero Size 4 Tamaño en bytes del fichero Addr 39 Gen 1 Numero de generación (incrementa con la reutilización) Atime 4 Fecha de ultimo acceso Mtime 4 Fecha de ultima modificación Ctime 4 Fecha del último cambio del i-nodo Direcciones de 13 bloques (10 datos, 3 de indirecciones) Accesos para buscar /usr/rubenb/fich.txt Root directory inode Filename 1 . 1 .. 4 bin 7 i-nodo 6 de /usr Modo Tamaño Times Usuario Grupo Bloque 132 datos de/usr inode Filename 6 . 1 .. 19 rubenb dev 30 14 lib 9 etc 6 usr 8 tmp 132 Bloque 406 datos de /usr/rubenb i-nodo 19 de /usr/rubenb Modo Tamaño Times Usuario Grupo inode Filename 19 . 6 .. 91 ariso2 victorr 96 fich.txt 51 xavim 99 notas 26 tonis 406 Virtual File System Llamadas a sistema (open, read, …) Virutal File System (VFS) EXT2 EXT3 NTFS FAT32 I/O Buffer Cache Device Driver Device Driver Device Driver Los sistemas operativos soportan diferentes sistemas de ficheros Linux: Ext2, Ext3, FAT, ISO9660, XFS, RaiserFS, NTFS… Estructura en dos niveles: ◦ Estructuras independientes del SF (VFS) ◦ Estructuras dependientes del SF (Ext2, Ext3…) VFS ◦ Contiene descripciones de los sistemas soportados file_operations, inode_operations, superblock_operations ◦ virtual i-nodes y virtual files ◦ Las llamadas de sistema interaccionan con estas estructuras independientes vfs_create, vfs_unlink, ... Estructuras dependientes del SF ◦ accedidas a través de las operaciones descritas en el VFS ◦ i-nodes, FAT, ... Tabla de canales struct files_struct Tabla de ficheros abiertos Tabla de i-nodos virtuales struct file f_count f_pos, f_mode, struct dentry d_count d_iname struct inode d_count 1 1 2 1 Tabla de canales struct files_struct 2 Acceso compartido Acceso concurrente d_iname