ariso 2 - Universitat Politècnica de Catalunya

Anuncio
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
Descargar