Publicado el 6 de Julio del 2017
691 visualizaciones desde el 6 de Julio del 2017
12,8 MB
43 paginas
Creado hace 15a (24/05/2009)
Sistemas operativos II
Sistema de ficheros en UNIX
Estructura del sistema de ficheros de unix
El buffer cache
Representación interna de ficheros
Diferencias entre el sistema de ficheros unix System V y unix
BSD
Otras consideraciones
Sistema de ficheros en UNIX
Estructura del sistema de ficheros de unix
El buffer cache
Representación interna de ficheros
Diferencias entre el sistema de ficheros unix System V y unix
BSD
Otras consideraciones
Sistema de ficheros en UNIX
Estructura del sistema de ficheros de unix
El buffer cache
Representación interna de ficheros
Diferencias entre el sistema de ficheros unix System V y unix
BSD
Otras consideraciones
Punto de vista del usuario
I estructura jerárquica
I posibilidad de crear y borrar ficheros
I crecimiento dinámico de los ficheros
I protección de los datos de los ficheros
I tratamiento de los dispositivos periféricos como ficheros
I cada fichero tiene un nombre completo que es una secuencia
de nombres separados por el caracter /; cada uno de los
nombres designa un nombre único en el nombre previo
I un fichero es una sucesión de bytes
I un directorio es un fichero normal
I permisos de acceso controlados (lectura, escritura, ejecución)
rwxrwxrwx
I árbol con un nodo raiz (/):
I cada nodo que no es una hoja es un directorio
I cada hoja: fichero, directorio o dispositivo
I en realidad se trata de un grafo y no de un árbol: enlaces
reales y simbólicos
Punto de vista del kernel
I un fichero es una sucesión de bytes
I un fichero está representado por una estructura pequeña, con
la informacion que el kernel necesita conocer de dicho fichero,
denominada inodo
I propietario y grupo del fichero (uid y gid)
I modo del fichero: entero codificado bit a bit con los permisos
y el tipo de fichero
I fechas (último acceso, última modificación, último cambio en
el inodo)
I tamaño
I número de enlaces reales
I direcciones de disco que ocupa
inodos en openBSD
struct
ufs1_dinode {
u_int16_t
int16_t
union {
di_mode;
di_nlink;
u_int16_t oldids[2];
u_int32_t inumber;
/*
/*
/*
/*
0: IFMT, permissions; see below. */
2: File link count. */
4: Ffs: old user and group ids. */
4: Lfs: inode number. */
} di_u;
u_int64_t
int32_t
int32_t
int32_t
int32_t
int32_t
int32_t
ufs1_daddr_t
ufs1_daddr_t
u_int32_t
int32_t
int32_t
u_int32_t
u_int32_t
int32_t
};
di_size;
di_atime;
di_atimensec;
di_mtime;
di_mtimensec;
di_ctime;
di_ctimensec;
di_db[NDADDR];
di_ib[NIADDR];
di_flags;
di_blocks;
di_gen;
di_uid;
di_gid;
di_spare[2];
8: File byte count. */
/*
/* 16: Last access time. */
/*
20: Last access time. */
/* 24: Last modified time. */
/*
28: Last modified time. */
/* 32: Last inode change time. */
/*
36: Last inode change time. */
40: Direct disk blocks. */
/*
/*
88: Indirect disk blocks. */
/* 100: Status flags (chflags). */
/* 104: Blocks actually held. */
/* 108: Generation number. */
/* 112: File owner. */
/* 116: File group. */
/* 120: Reserved; currently unused */
inodos en openBSD
struct ufs2_dinode {
u_int16_t
int16_t
u_int32_t
u_int32_t
u_int32_t
u_int64_t
u_int64_t
ufs_time_t
ufs_time_t
ufs_time_t
ufs_time_t
int32_t
int32_t
int32_t
int32_t
int32_t
u_int32_t
u_int32_t
int32_t
ufs2_daddr_t
ufs2_daddr_t
ufs2_daddr_t
int64_t
};
0: IFMT, permissions; see below. */
2: File link count. */
4: File owner. */
8: File group. */
di_mode;
/*
di_nlink;
/*
di_uid;
/*
di_gid;
/*
di_blksize;
/*
12: Inode blocksize. */
di_size;
/* 16: File byte count. */
di_blocks;
/*
di_atime;
/*
di_mtime;
/*
di_ctime;
/*
di_birthtime;
/*
di_mtimensec;
/*
di_atimensec;
/*
di_ctimensec;
/*
di_birthnsec;
/*
di_gen;
/* 80: Generation number. */
di_kernflags;
/*
di_flags;
/*
di_extsize;
/*
di_extb[NXADDR];/*
di_db[NDADDR];
di_ib[NIADDR];
di_spare[3];
24: Bytes actually held. */
32: Last access time. */
40: Last modified time. */
48: Last inode change time. */
56: Inode creation time. */
64: Last modified time. */
68: Last access time. */
72: Last inode change time. */
76: Inode creation time. */
84: Kernel flags. */
88: Status flags (chflags). */
92: External attributes block. */
96: External attributes block. */
/* 112: Direct disk blocks. */
/* 208: Indirect disk blocks. */
/* 232: Reserved; currently unused */
inodo en ext2
struct ext2fs_dinode {
u_int16_t
u_int16_t
u_int32_t
u_int32_t
u_int32_t
u_int32_t
u_int32_t
u_int16_t
u_int16_t
u_int32_t
u_int32_t
u_int32_t
u_int32_t
u_int32_t
u_int32_t
u_int32_t
u_int32_t
u_int8_t
u_int8_t
u_int16_t
u_int16_t
u_int16_t
u_int32_t
};
0: IFMT, permissions; see below. */
2: Owner UID, lowest bits */
4: Size (in bytes) */
8: Access time */
12: Create time */
16: Modification time */
20: Deletion time */
24: Owner GID, lowest bits */
26: File link count */
28: Blocks count */
32: Status flags (chflags) */
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
e2di_mode;
e2di_uid_low;
e2di_size;
e2di_atime;
e2di_ctime;
e2di_mtime;
e2di_dtime;
e2di_gid_low;
e2di_nlink;
e2di_nblock;
e2di_flags;
e2di_linux_reserved1; /* 36 */
e2di_blocks[NDADDR+NIADDR]; /* 40: disk blocks */
e2di_gen;
e2di_facl;
e2di_dacl;
e2di_faddr;
e2di_nfrag;
e2di_fsize;
e2di_linux_reserved2; /* 118 */
e2di_uid_high;
e2di_gid_high;
e2di_linux_reserved3; /* 124 */
/* 100: generation number */
/* 104: file ACL (not implemented) */
/* 108: dir ACL (not implemented) */
/* 112: fragment address */
/* 116: fragment number */
/* 117: fragment size */
/* 120: 16 highest bits of uid */
/* 122: 16 highest bits of gid */
Punto de vista del kernel
I un directorio es un fichero normal. Sus contenidos son las
entradas de directorio, cada una de ellas contiene información
de uno de los ficheros en dicho directorio. (basicamente el
nombre y el número de inodo)
I cada fichero un único inodo pero varios nombres (enlaces)
I enlace real a un fichero: entrada de directorio que se refiere al
mismo inodo
I enlace simbólico a un fichero: fichero especial que contiene el
path al cual es el enlace
I varios tipos de fichero
I fichero normal
I directorio
I dispositivo (bloque o carácter)
I enlace simbólico
I fifo
I socket
constantes en ufs/ufs/dinode.h
#define NDADDR
#define NIADDR
12
3
/* Direct addresses in inode. */
/* Indirect addresses in inode. */
#define MAXSYMLINKLEN_UFS1
#define MAXSYMLINKLEN_UFS2
((NDADDR + NIADDR) * sizeof(ufs1_daddr_t))
((NDADDR + NIADDR) * sizeof(ufs2_daddr_t))
/* File permissions. */
#define IEXEC
#define IWRITE
#define IREAD
#define ISVTX
#define ISGID
#define ISUID
0000100
0000200
0000400
0001000
0002000
0004000
/* File types. */
#define IFMT
#define IFIFO
#define IFCHR
#define IFDIR
#define IFBLK
#define IFREG
#define IFLNK
#define IFSOCK
#define IFWHT
0170000
0010000
0020000
0040000
0060000
0100000
0120000
0140000
0160000
#endif /* _UFS_DINODE_H_ */
/* Executable. */
/* Writeable. */
/* Readable. */
/* Sticky bit. */
/* Set-gid. */
/* Set-uid. */
/* Mask of file type. */
/* Named pipe (fifo). */
/* Character device. */
/* Directory file. */
/* Block device. */
/* Regular file. */
/* Symbolic link. */
/* UNIX domain socket. */
/* Whiteout. */
I una instalación puede tener una o varias unidades físicas
I cada unidad física puede tener uno o varios sistemas de
ficheros (o unidades lógicas)
I cada sistema de ficheros: sucesión de bloques (grupos de
sectores) de 512, 1024, 2048 ...bytes. En Unix System V R2
tiene la siguiente estructuta física
BOOT SUPER BLOQUE LISTA INODOS AREA DE DATOS
I los distintos sistemas de ficheros se montan (llamada al
sistema mount) sobre directorios dando lugar a un único árbol
(grafo) de directorios en el sistema.
I el kernel trata sólo con dispositivos lógicos.
I Cada fichero en el sistema queda perfectamente definido por
un número de dispositivo lógico (sistema de ficheros) y número
de inodo dentro de ese sistema de ficheros
I cada bloque queda perfectamente definido por un número de
dispositivo lógico (sistema de ficheros) y número de bloque
dentro de ese sistema de ficheros
I las estrategias de asignación y contabilidad se hacen en base a
bloques lógicos
I la traducción de direcciones lógicas a direcciones físicas la
hace el manejador de dispositivo (device driver)
I El uso de ficheros en el sistema está gobernado por tres tablas
I tabla de inodos en memoria(inode table) Contiene los
inodos en memoria de los ficheros que están en uso, junto con,
entre otras cosas, un contador de referencias. Global del
sistema, en el espacio de datos del kernel
I tabla ficheros abiertos(file table) Una entrada por cada
apertura de un fichero (varias aperturas del mismo fichero dan
lugar a varias entradas). Contiene el modo de apertura
(O RDONLY, O WRONLY . . . ), offset en el fichero, contador
de referencias y puntero al inodo en la tabla de inodos en
memoria. Global del sistema, en el espacio de datos del kernel
I tabla de descriptores de fichero de usuario (user file
descriptor table) Cada apertura, o cada llamada dup() crean
una entrada en esta tabla (asi como la llamada fork()).
Contiene un referencia a la entrada correspondiente de la tabla
ficheros abiertos. Una para cada proceso, en su u area
ejemplo de tablas de ficheros
Si tenemos dos procesos
I P1
...
df1=open("F1",O_RDONLY);
df2=open("F1",O_RDONLY);
df3=open("F2",O_RDWR);
..
I P2
...
df1=open("F2",O_WRONLY);
df2=dup(df1);
df3=open("F2",O_RDWR|O_APPEND);
..
ejemplo de tablas de ficheros
Sistema de ficheros en UNIX
Estructura del sistema de ficheros de unix
El buffer cache
Representación interna de ficheros
Diferencias entre el sistema de ficheros unix System V y unix
BSD
Otras consideraciones
buffer cache
estructura del buffer cache
I Estructura software para minimizar accesos a disco
I Sistema de buffers de datos con los bloques de disco mas
recientemente
I el kernel necesita leer datos: leer del buffer cache
I el kernel necesita escribir datos: escribe en el buffer cache
I un bloque de disco solo puede estar en un solo buffer
I formado por una serie de buffers organizados en dos
estructuras
I lista de buffers libres (FREELIST). En cada instante contiene
los buffers que n
Comentarios de: Sistemas operativos II (0)
No hay comentarios