PRÁCTICAS DE LABORATORIO DE SISTEMAS OPERATIVOS

TERCERA SESIÓN


  1. Sistema de ficheros MS-DOS.

    Hoy haremos una pausa en la programación con llamadas al sistema para adentrarnos en el funcionamiento de un sistema de ficheros: el sistema de ficheros MS-DOS.

    Aunque es un sistema de ficheros muy antiguo y adolece de múltiples deficiencias, es aún bastante usado y es lo suficientemente simple como para poder ser analizado con facilidad. En la práctica de hoy se os dará un disco duro formateado con un sistema de ficheros MS-DOS y tendréis que examinarlo para ver cuál es su contenido.

    Recordemos lo visto en la parte teórica de la asignatura acerca del sistema de ficheros MS-DOS:

    4 SISTEMA DE FICHEROS MS-DOS (FAT).

    El sistema de ficheros de MS-DOS está muy extendido debido a la popularidad de este sistema operativo. Puede ser usado por Linux y Windows NT.

    Los bloques físicos se agrupan en bloques lógicos denominados clústeres. Toda la gestión se realiza considerando clústeres.

    La estructura de un volumen MS-DOS es la que sigue:

    El sector de arranque es donde se almacena la información del volumen y el que contiene la rutina de carga del propio DOS. Los datos en él almacenados son:



  2. Formato del disco entregado.

    Evidentemente no se os va a dar un disco físico a cada uno. Lo que dispondréis será de un volcado del contenido de un disco con formato MS-DOS en un fichero. El fichero lo podréis encontrar en encina en: /usuarios/profes/gyermo/SESION3/disco. Para trabajar con él NO os copiéis el fichero a vuestro directorio. Esto supondría un desperdicio inútil de espacio de disco. El área de datos estaría duplicada en cada uno de vuestros directorios. Haced un enlace simbólico al fichero desde el lugar donde vayáis a trabajar:
    ln -s /usuarios/profes/gyermo/SESION3/disco disco 
    Así, entre todos ocuparemos unas 200K de disco, mientras que si os lo copiáis, se duplicarán los bloques de datos del fichero y ocuparemos 20M de espacio de disco.

  3. Herramienta para poder analizar el disco.

    Usaremos para analizar el disco la orden de la shell od. Tenéis a vuestra disposición su página de manual en encina en inglés y, como ayuda, la traducción de la versión de od de tejo en el fichero /usuarios/profes/gyermo/SESION3/od.man en formato ASCII.

    Esta orden nos muestra el contenido de un fichero interpretando los bytes que forman parte de él según las opciones que le especifiquemos. Por ejemplo, si queremos ver los primeros 1000 bytes del disco (-N 1000), como bytes expresados en decimal (-td1) y con los desplazamientos expresados en decimal también (-Ad), el resultado que se obtiene es el siguiente:
    /home/so/SESION3$ od -Ad -N100 -td1 disco
    0000000  235  60 144 109 107 100 111 115 102 115   0   0   2   2   1   0
    0000016    2   0   2   0   8 248   4   0  63   0 255   0   0   0   0   0
    0000032    0   0   0   0   0   0  41  29  69 225  54  32  32  32  32  32
    0000048   32  32  32  32  32  32  70  65  84  49  54  32  32  32  14  31
    0000064  190  91 124 172  34 192 116  11  86 180  14 187   7   0 205  16
    0000080   94 235 240  50 228 205  22 205  25 235 254  84 104 105 115  32
    0000096  105 115  32 110
    0000100     

  4. Primera práctica.

    Ni hay que entregarla, ni opta al 0.25. Se trata de obtener toda la información que se encuentra en el sector de arranque de la partición del disco con la ayuda de od. Por ejemplo, lo primero que hay que conocer es la instrucción de salto a la rutina de arranque, que ocupa tres bytes. Como se trata de una instrucción en ensamblador, lo mejor es expresarla en hexadecimal. Así que damos la orden:
    /home/so/SESION3$ od -Ad -N3 -tx1 disco
    0000000   eb  3c  90
    0000003     
    Por lo tanto, la instrucción de salto es EB 3C 90.

    Lo siguiente que debéis encontrar es el fabricante y número de versión de DOS, que ocupa 8 bytes y tenéis que interpretarlos como caracteres ASCII.

    A continuación, viene el número de bytes por sector del sistema de ficheros, que será un entero que ocupe dos bytes. Para poder ver este valor, hay que considerar que el sistema de ficheros MS-DOS sigue, como sigue la familia de procesadores del 8086 el convenio little endian para almacenar valores enteros de más de un byte en memoria. "Little endian" significa que hay que tomar primero el extremo (end) más pequeño. Como mejor se ve es en hexadecimal. En cada celda de memoria cabe un número de dos dígitos en hexa. Si queremos almacenar en memoria el número 0x13A5, lo partimos a la mitad y almacenamos en la primera posición 0xA5 y en la segunda 0x13.

    La información que buscamos se halla en los bytes duodécimo y décimotercero, así que los solicitamos con:
    /home/so/SESION3$ od -Ad -j11 -N2 -tx1 disco
    0000000    0   2
    0000002     
    Luego los números obtenidos son 0x00 y 0x02. Como se usa little endian, el número de dos bytes es el 0x0200, que en decimal es 512. Luego el tamaño del sector es 512 bytes.

    Como od trabaja con formato big endian, pues encina es una máquina big endian, observad cómo nos realiza mal la conversión si le decimos que queremos que nos diga el número de dos bytes almacenado en esa posición del fichero:
    /home/so/SESION3$ od -Ad -j11 -N2 -td2 disco
    0000000        2
    0000002     
    Esto nos daría un sector de 2 bytes, lo que es absurdo. Sin embargo, en Linux probablemente sí funcione, al ser el PC una máquina little endian. El resto de entradas de la tabla las podéis hacer vosotros y servirán para prácticas de más abajo.

    Soluciones y comentarios.

  5. Segunda práctica.

    Hacer un mapa del disco duro expresando el comienzo de cada zona del disco duro tanto en bytes (hexadecimal y decimal), como en sectores. Se trata de que hagáis algo parecido a esto:
    Sección Dirección inicio Sector inicio
    Sector de arranque 0x0 (0) 0
    FAT 0x200 (512) 1
    Directorio raíz 0x600 (1536) 3
    Área de datos 0x800 (2048) 4

    Tanto los valores como las zonas que se expresan en la tabla son ficticios. Para obtener los valores reales, hay que basarse en los datos de la primera práctica.

    Soluciones y comentarios.

  6. Formato de las entradas de directorio en un sistema de ficheros MS-DOS.

    Los directorios y subdirectorios de cualquier sistema de ficheros son ficheros normales. La información en ellos contenida consiste en registros de igual longitud con algunos datos esenciales acerca de los ficheros que contiene el directorio. En el caso de MS-DOS, recordemos de la teoría que:

    Las entradas del directorio raíz, así como las de cualquier otro subdirectorio tienen el siguiente formato:

    Si el primer byte de un fichero es 0, significa que ya no hay más entradas de directorio.

    Si es 0xE5, significa que esa entrada de directorio está libre.

    Si es 0x5, significa que el primer carácter del nombre del fichero es 0xE5 (s ).

    Los atributos del fichero vienen codificados en los bits de un byte:

    Debido a las limitadas posibilidades de nombrar a un fichero (8+3 caracteres como máximo), el sistema de MS-DOS se amplió para poder utilizar nombres de ficheros largos y aún así mantener compatibilidad con lo anterior.

     

    A esta información hay que añadir la forma en que están grabadas la fecha y la hora de creación del fichero. Esta información se almacena en dos bytes para la fecha y dos bytes para la hora. Se sigue, cómo no, el formato little endian. La buena interpretación de fecha y hora sólo se obtiene si tenemos en cuenta que se trata de campos de bits con la siguiente estructura:
    Formato de la hora:
        --------------------  H-Hora.        M-Minuto.       S-Par de segundos.
        |HHHHH|MMMMMM|SSSSS|
        --------------------
    
    Formato de la fecha:
        --------------------  A-Año (desde 1980). M-Mes.     D-Día del mes.
        |AAAAAAA|MMMM|DDDDD|
        -------------------- 
    Para la hora, tened en cuenta que como a los diseñadores no les cabía en 16 bits especificar la hora (0-23), el minuto (0-60) y los segundos (0-60), decidieron que vendría los pares de segundo. Es decir, que si en ese campo hay un siete, los segundos efectivos son catorce. Van especificados de dos en dos. Nótese que con este formato de fecha, se puede llegar hasta el año 1980+127=2107. El sistema de ficheros de MS-DOS padece de "efecto 2108" ;).

  7. Tercera práctica.

    Escribir la salida que daría la orden "DIR \ /S" ejecutada sobre ese disco. Esta orden lista el contenido de todos los ficheros y directorios del disco. El formato puede ser parecido a este:
     El volumen de la unidad D no tiene etiqueta.
     El número de serie del volumen es: 20FA-6AF1
    
    
     Directorio de D:\WINNT\Profiles\Administrador\Escritorio\Pedro
    
    23/02/00  14.24         <DIR>          .
    23/02/00  14.24         <DIR>          ..
    02/10/99  11.59                 11.057 Form1.frm
    23/02/00  14.24         <DIR>          KK
    02/10/99  11.59                  6.107 Module1.bas
    02/10/99  11.59                    740 TELEFONO.VBP
    02/10/99  12.03                     90 TELEFONO.VBW
                   7 archivos         17.994 bytes
    
     Directorio de D:\WINNT\Profiles\Administrador\Escritorio\Pedro\KK
    
    23/02/00  14.24         <DIR>          .
    23/02/00  14.24         <DIR>          ..
    23/11/99  13.37                 26.112 Calendario.doc
                   3 archivos         26.112 bytes
    
         Total de archivos en la lista:
                  10 archivos         44.106 bytes
                                197.205.504 bytes libres  
    Para poder hacer esto, necesitáis conocer el mapa del disco (práctica segunda) para localizar las entradas del directorio raíz, conocer el formato de las entradas de directorio, vistas en el apartado anterior y encontrar la fórmula matemática que liga número de clúster con número de sector.

    Esto es debido a que en la entrada de directorio, cuando encontréis un subdirectorio, tenéis que ir al área de datos de disco para localizar el contenido de ese subdirectorio. En la entrada de directorio del directorio que vais a examinar viene el clúster de comienzo. Necesitáis obtener el número de sector que corresponde con ese clúster de comienzo para poder examinar la zona correspondiente del fichero disco, donde vienen los datos. La fórmula que liga estas dos variables es:
    número_de_sector = número_de_clúster * número_de_sectores_por_clúster + desplazamiento_inicial 
    El número_de_sectores_por_clúster lo podéis obtener de la información del sector de arranque (práctica primera). El desplazamiento_inicial lo podéis deducir por prueba y error.

    Soluciones y comentarios.

  8. La F.A.T.

    Respecto a la tabla de colocación de ficheros (F.A.T.), en la parte de teoría decíamos:

    La FAT (File Allocation Table) contiene información acerca de los bloques de datos del volumen. Es una tabla con una entrada para cada bloque de datos. En cada entrada hay un único valor:

      • 0: el clúster está libre.
      • 0x(F...F)FF0-0x(F...F)FF6: reservado.
      • 0x(F...F)FF7: clúster defectuoso.
      • 0x(F...F)FF8-0x(F...F)FFF: último clúster de un fichero.
      • Otro valor: siguiente clúster.

    El tamaño de la entrada es variable y depende del tamaño del disco. Así se habla de FAT12, FAT16 o FAT32, dependiendo del número de bits que componen una entrada de la FAT.

    Por lo tanto, el enlazado de los bloques y la gestión de bloques defectuosos y libres se lleva a cabo en la FAT.

    El número del primer clúster de datos es 2.

    En el caso que nos ocupa, tenemos una FAT de 12 bits, con lo cual los valores de la tabla de teoría son correctos si nos quedamos con tres dígitos en hexa (doce bits):
        - 0x000: Clúster libre.
        - 0xFF0-0xFF6: Reservado.
        - 0xFF7: Defectuoso.
        - 0xFF8-0xFFF: Último clúster del fichero.
        - Otro valor: siguiente clúster del fichero. 


  9. Cuarta práctica.

    Hacer un listado hasta el último valor distinto de 0x000 de las entradas de la F.A.T.

    Para ello, tenéis que localizar dónde comienza la F.A.T. (práctica segunda) y volcar su contenido en bytes en hexa. Tomáis los bytes de tres en tres. Cada trío os va a proporcionar dos entradas de la F.A.T. La manera de conseguir una entrada es la siguiente: suponed que leéis los bytes 0x9A, 0xBC, 0xDE, las dos entradas que corresponden a esos tres bytes son: 0xC9A y 0xDEB. La tabla resultante tendrá el aspecto siguiente:

    F.A.T.
    0x0 0xFDF
    0x1 0xFFF
    0x2 0x006
    0x3 0x000
    0x4 0xFF8
    0x5 0xFF7
    ...


    Soluciones y comentarios.

  10. Acceso a los datos de un fichero.

    Pasos que hay que realizar para leer el fichero C:\DOS\FDISK.EXE:

     



  11. Quinta práctica.

    El fichero DICT.TXT contiene al final el nombre de su autor. Encontrar y escribir dicho nombre.

    Para hacerlo, seguid las indicaciones que vimos en teoría (apartado anterior). Os tenéis que ayudar de la F.A.T. (práctica cuarta).

  12. Para saber más

    Podéis hacer que el ordenador haga el trabajo sucio y duro por vosotros ;). ¿Qué tal si lográis engañar a Linux para que os monte el fichero disco como si se tratara de un disco duro de verdad? Para ello debéis entender cómo se monta un disco duro de verdad (orden mount) y cómo se logra que un fichero parezca un dispositivo de disco a los ojos de Linux (también orden mount, curiosamente).

    Si lográis hacer esto, podréis solucionar toda la sesión mediante órdenes del sistema operativo directas (ls, cat, etc.)

    Por otro lado, para los más curiosos, Microsoft ofrece la especificación completa del sistema de ficheros FAT32 en http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx

  13. Órdenes de la shell relacionadas.

    od
    volcado del contenido de un fichero


  14. Funciones de biblioteca relacionadas.



  15. LPEs.


© 2000 Guillermo González Talaván.