Examen de Sistemas Operativos II EJERCICIO 2 Tiempo estimado: 75 min. Septiembre de 2006 Puntuación: 5 puntos En una máquina tipo MINIX se utiliza un disco de arranque con las siguientes características: Tamaño: 360K. formateado para soportar 100 i-nodos el tamaño de todos los directorios es menor de 1024 bytes contenido de PARTE del sistema de ficheros: directorio /: número de i-nodo: 1; primer bloque de datos: 8; propietario root; bits de protección rwxr-xr-x. directorio /user: número de i-nodo: 3; primer bloque de datos: 10; propietario root; bits de protección rwxr-xr-x. directorio /user/jj: número de i-nodo: 4; primer bloque de datos: 15; propietario jj; bits de protección rwx------. directorio /user/ll: número de i-nodo: 5; primer bloque de datos: 22; propietario ll; bits de protección rwx------. fichero /user/jj/f1: número de i-nodo: 33; primer bloque de datos: 100; propietario jj; bits de protección rwxr--r--. fichero /user/jj/p1: número de i-nodo: 18; primer bloque de datos: 204; propietario jj; bits de protección rwx------; bits SETUID y SETGID activos. fichero /user/jj/p1.c: número de i-nodo: 70; primer bloque de datos: 128; propietario jj; bits de protección rwx------. En esta máquina tienen permiso de acceso (entre otros) los usuarios: login:jj; uid:33; gid:33; Nombre: José Juan; directorio de trabajo: /user/jj login:ll; uid:44; gid:44; Nombre: Luca Leonardo; directorio de trabajo: /user/ll. El usuario “jj” entra en la máquina y ejecuta desde la shell el programa “/user/jj/p1” que ha sido generado a partir del fichero p1.c. int s, df; /* llamada al sistema chmod comentada*/ // s = chmod(“/user/jj”, 0044); df = open(“/user/jj/f1”, O_RDONLY); // apertura sólo para lectura ……. close(df); SE PIDE: a) Indicar los accesos que el Gestor de Ficheros realiza a la tabla de i-nodos y a la cache de bloques cuando se ejecuta la llamada al sistema open del programa “/user/jj/p1”. En este caso considerar que la llamada chmod está comentada y no se ha ejecutado. 3.25 puntos. b) Igual que en el apartado a), suponiendo que se ha ejecutado la llamada al sistema chmod que aparece comentada. Los accesos producidos por chmod no hay que indicarlos. 1 punto c) Si un proceso perteneciente al usuario “ll” (de forma real y efectiva) ejecutase la llamada al sistema execv(“/user/jj/p1”,..), ¿fallaría la llamada al sistema o se ejecutaría sin problemas? Explicar brevemente la respuesta. 0.75 puntos. Utilizar las hojas de respuestas que se adjuntan. NOTAS: Suponer que las llamadas al sistema no fallan por razones no expuestas en el enunciado. Los únicos procesos de usuario que existen son los indicados en el enunciado. Respecto a la tabla de i-nodos del Gestor de Ficheros: Los ÚNICOS campos a tener en cuenta para solucionar el ejercicio son: i-zone[9] (números de zona para punteros directos, indirecto simple e indirecto doble), i_size (tamaño del fichero), i_nlinks (número de enlaces), i_mount (indica sistema de ficheros montado) e i_mode (bits de protección, tipo de fichero y bits SETUID y SETGID). En cada entrada de la hoja de soluciones se pueden indicar hasta tres campos que se modifiquen/consulten de un determinado i-nodo, anotando el número de i-nodo al que se accede, el nombre del campo(s) y una breve descripción de la razón del acceso (por cada campo). Respecto a la cache de bloques del Gestor de Ficheros: Rellenar una entrada de la hoja de soluciones por cada bloque que se cargue en la cache para ser consultado/modificado o por cada bloque que encontrándose ya en la cache se consulte/modifique. En la columna “Descripción” indicar el tipo de bloque al que se está accediendo (superbloque (S), bloque de mapa de bits de i-nodos (MBI-N), bloque de mapa de bits de zonas (MBZ), bloque de i-nodos (I-N), bloque de directorio (DIR), bloque indirecto (Ind) o bloque de datos (DAT)), así como la razón del acceso. Para resolver los dos primeros apartados, suponer que en el momento previo a la ejecución de la llamada al sistema open en la tabla de i-nodos sólo se encuentran cargados los i-nodos del directorio raíz y del directorio de trabajo del proceso que está ejecutando el programa “/user/jj/p1”. Examen de Sistemas Operativos II Septiembre de 2006 Apellidos: ............................................................................................................................................. Nombre: ............................................................................................ Nº matrícula: ............................ a) Llamada al sistema df = open(“/user/jj/f1”, O_RDONLY) sin chmod. Tabla de i-nodos: Nº de i-nodo Nombre del Campo(s) 1 i_mount, i_mode, i_zone[0] 3 i_mount, i_mode, i_zone[0] 4 i_mount, i_mode, i_zone[0] 33 i_mode Descripción: razón del acceso Comprueba que no hay un sistema de ficheros montado. Comprueba que se trata de un directorio y consulta si el proceso tiene permiso de búsqueda. Obtiene el número del primer bloque de datos (el bloque 8). Comprueba que no hay un sistema de ficheros montado. Comprueba que se trata de un directorio y consulta si el proceso tiene permiso de búsqueda. Obtiene el número del primer bloque de datos (el bloque 10). Comprueba que no hay un sistema de ficheros montado. Comprueba que se trata de un directorio y consulta si el proceso tiene permiso de búsqueda. Obtiene el número del primer bloque de datos (el bloque 15). Comprueba si el proceso tiene permiso de lectura. Cache de bloques: Número de bloque Descripción: tipo de bloque y razón del acceso 8 DIR /. Busca una entrada con nombre “user” y obtiene su número de i-nodo (el 3). 4 I-N. Obtiene los 32 bytes del i-nodo 3. 10 DIR /user. Busca una entrada con nombre “jj” y obtiene su número de i-nodo (el 4). Este i-nodo se encuentra en la tabla de i-nodos (no hay que cargarlo de disco). 15 DIR /user/jj. Busca una entrada con nombre “f1” y obtiene su número de i-nodo (el 33). 5 I-N. Obtiene los 32 bytes del i-nodo 33. b) Llamada al sistema df = open(“/user/jj/f1”, s=chmod(“/user/jj”, 0044) previamente. O_RDONLY) habiéndose ejecutado Tabla de i-nodos: Nº de i-nodo Nombre del Campo(s) 1 i_mount, i_mode, i_zone[0] 3 i_mount, i_mode, i_zone[0] 4 i_mount, i_mode Descripción: razón del acceso Comprueba que no hay un sistema de ficheros montado. Comprueba que se trata de un directorio y consulta si el proceso tiene permiso de búsqueda. Obtiene el número del primer bloque de datos (el bloque 8). Comprueba que no hay un sistema de ficheros montado. Comprueba que se trata de un directorio y consulta si el proceso tiene permiso de búsqueda. Obtiene el número del primer bloque de datos (el bloque 10). Comprueba que no hay un sistema de ficheros montado. Comprueba que se trata de un directorio y consulta si el proceso tiene permiso de búsqueda. Como no lo tiene la llamada al sistema falla. Cache de bloques: Número de bloque Descripción: tipo de bloque y razón del acceso 8 DIR /. Busca una entrada con nombre “user” y obtiene su número de i-nodo (el 3). 4 I-N. Obtiene los 32 bytes del i-nodo 3. 10 DIR /user. Busca una entrada con nombre “jj” y obtiene su número de i-nodo (el 4). Este i-nodo se encuentra en la tabla de i-nodos (no hay que cargarlo de disco). c) Si un proceso perteneciente al usuario “ll” (de forma real y efectiva) ejecutase la llamada al sistema execv(“/user/jj/p1”,..), ¿fallaría la llamada al sistema o se ejecutaría sin problemas? Explicar brevemente la respuesta La llamada fallaría. Uno de los pasos que realiza MINIX durante la ejecución de la llamada al sistema execv es la de comprobar si se tiene permiso de ejecución del fichero indicado como primer parámetro. Para ello, usando el uid y el gid efectivo del proceso (valor 44 para ambos) se resuelve la ruta de “/user/jj/p1”. Durante esta resolución, al llegar al i-nodo del directorio “/user/jj” (i-nodo 4 con uid y gid 33) y comprobar el permiso de búsqueda para un proceso que ni es el propietario ni pertenece al grupo del propietario, la resolución falla y por tanto la llamada al sistema falla.