Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Tecnología del PC

[Home]  [Inicio]  [Índice]


6.2  Direccionamientos CHS / LBA

§1  La interrupción 13h estándar

Al diseñar el PC XT en 1983, los ingenieros de IBM establecieron que los servicios BIOS relativos al manejo de disco duro serían activados por la línea IRQ5 (IRQ6 se destinaba al disquete).  Esta línea generaba la interrupción 19 (13h) cuya rutina de servicio disponía de seis servicios estándar:  reinicialización; obtención del estado; lectura; escritura y verificación de sectores, y formateo de pistas.  A partir de la introducción del PC AT en 1984, se introdujeron 12 nuevos servicios para disco, incluyendo recalibrado de la unidad, diagnóstico del controlador, Etc.  En concreto, los servicios 2h y 3h ofrecen la posibilidad de leer y escribir sectores en el disco, mientras que Ah y Bh ofrecen la misma posibilidad de lectura y escritura para sectores largos.

Estos servicios ofrecen la posibilidad de leer y escribir en las unidades de disco a nivel de sectores individuales (unidades de asignación), para lo que, además del número de unidad, se requiere pasar a la rutina los valores de geometría correspondientes (Cilindro, Cabeza y Sector concretos);  lo que se conoce como direccionamiento CHS ("Cilinder Head Sector").  La especificación de IBM establecía que los siguientes valores para dichos parámetros ( 8.1.2c):


 

Tamaño n del  campo (bits)

Valor máximo teórico 2n

Rango permitido

Total utilizable

Cilindro

10

1,024

0-1,023

1,024

Cabeza

8

256

0-255

256

Sector

6

64

1-63

63


Los valores anteriores nos dejan un total de 1024 x 256 x 63 = 16,515,072 clusters.  Como en este sistema FAT cada cluster es de 512 bytes, los servicios de la BIOS podían direccionar teóricamente un máximo de 1024 x 256 x 63 x 512 =  8, 455,716,864 Bytes, 8.455 GB [1].  Este es el límite del direccionamiento CHS directo o de la interrupción 13h de la BIOS estándar.

Nota:  Observe que la limitación anterior se deriva a que en realidad la BIOS utiliza 10 + 8 + 6 = 24 bits para direccionamiento del cluster, aunque los 6 últimos no pueden ser cero, lo que conduce a 224 - 218 = 16,515,072 clusters de 512 Bytes (8.455 GB).  Como se verá más adelante, este direccionamiento ha sido aumentado a 64 bits en las nuevas BIOSes .

Resaltar que los valores CHS (cilindro, cabeza y sector) que se manejan, son valores lógicos (lo que se denomina geometría lógica).  Los verdaderos valores CHS, correspondientes a la geometría real, son un asunto interno, y solamente conocidos por el controlador de la unidad.

§2  Especificación ATA

Aparte de lo anterior, la especificación ATA ( 6.1) establecía otras limitaciones para los valores de Cilindro, Cabeza y Sector, eran las siguientes:

 

Tamaño del  campo (bits)

Valor máximo teórico

Rango permitido

Total utilizable

Cilindro

16

65,536

0-65,535

65,536

Cabeza

4

16

0-15

16

Sector

8

256

1-255

255


Los límites ATA eran por tanto 65536 x 16 x 255 = 267,386,880 clusters, o lo que es lo mismo: 136,902,082,560 bytes (136.902 GB).

§3  BIOS estándar con unidad IDE

La instalación de una unidad IDE en un PC tradicional (de BIOS estándar) supone que para estar dentro de ambas normas, deberían utilizarse los valores más restrictivos de ambas que serían los siguientes:

Cilindros:  1,024

Cabezas:  16

Sectores:  63

Estos números nos conducen a un total máximo de 1024 x 16 x 63 = 1,032,192 clusters, es decir, 528,482,304 bytes (528 MB).  Este sería el máximo espacio de disco direccionable mediante los servicios de la interrupción 13h estándar BIOS con una controladora ATA/IDE.

§4  Traducción CHS extendida

Evidentemente 528 MB es un valor es muy pequeño; pronto se vio que había que dar una solución que permitiera utilizar discos mayores, siguiera para llegar a los 8.45 GB que teóricamente podía proporcionar la BIOS estándar.  Se adoptó una solución denominada CHS extendido o ampliado ECHS.  Soportada por un nuevo tipo de BIOSes extendidas ("Enhanced BIOS") que aparecieron a partir de 1993/94.

En realidad el direccionamiento CHS extendido es un truco aritmético por el que se informa a la BIOS que el disco instalado (suponemos que es una unidad IDE) tiene un número de cilindros, cabezas y sectores distintos de los reales, pero adaptado a lo que puede manejar la BIOS (lo que se denomina geometría trasladada).  Para ello, si el número de cilindros del dispositivo IDE es superior a los 1024 soportados por la BIOS, se divide este número por 2, 4, 8 o 16, hasta que el valor resultante sea igual o menor que los mentados 1024.  El valor resultante es el que se pasa a la BIOS como número de cilindros.  Por su parte, el número de cabezas se multiplica por el factor 2, 4, 8 o 16 utilizado, y éste es el que se suministra a la BIOS (podríamos decir que se cambian cilindros por cabezas).

Nota:  A pesar del límite teórico de 256, en la práctica ningún disco IDE/ATA ofrece especificaciones con más de 63 sectores lógicos por pista.  La razón es que sobrepasar el límite de 63 de la BIOS estándar hubiese complicado aún más las cosas.

Ilustraremos lo anterior con un ejemplo:  Las características de un disco IDE indican que tiene 12000 cilindros, 16 cabezas y 63 sectores por pista (un total de 12,096,000 clusters).  Su número CHS real sería 12000-16-63, pero como 12000 es superior al número de cabezas que soporta la BIOS, se divide este número por 16, para que el resultado sea igual o menor que 1024.  En este caso el resultado es 12000/16 = 750, con lo que en el setup se informa a la BIOS que el disco instalado tiene 750 cilindros.  A cambio, el número real de cabezas (16) se multiplica por 16; el resultado 256 es el que se pasa como número de cabezas, así que la BIOS cree que el disco instalado es de 750 cilindros, 256 cabezas y 63 sectores por pista.

Otro ejemplo:  Supongamos el caso de un disco Caviar AC33100 de 3.1 GB de capacidad de Western Digital, con una geometría lógica de 6,136 cilindros, 16 cabezas y 63 sectores, lo que está dentro del estándar ATA/IDE, pero fuera de los límites de la interrupción 13h de la BIOS.  En este caso el número de cilindros se divide por 8;  6136 / 8 = 767, y el número de cabezas se multiplica por este mismo número (16 x 8 = 128).  El resultado de la geometría "traducida" es de 767 cilindros, 128 cabezas y 63 sectores por pista.  Con estos valores la capacidad permanece inalterada y la geometría lógica ajusta con las exigencias de la BIOS.

Las BIOSes que soportan direccionamiento ECHS realizan automáticamente las conversiones adecuadas. En realidad esta "traducción" funciona entre el disco IDE/ATA y la interrupción 13h de la BIOS.  La BIOS toma la geometría lógica del disco (según el estándar ATA) y la traduce a una geometría equivalente, pero que ajuste dentro de los límites aceptables por la interrupción 13h estándar.  El sistema permitió sobrepasar la barrera de 528 MB del conjunto BIOS estándar/dispositivo IDE, aunque es evidente que aún se encontraba limitado por el tope de 8.455 GB de la propia BIOS [2].

§5  Direccionamiento LBA

Como la capacidad de los discos crecía de forma imparable, pronto se hizo necesario sobrepasar también el límite de los 8,455 GB de la interrupción 13h de la BIOS.  Para esto se ideó un sistema denominado LBA ("Logical Block Addressing), que implica un sistema radicalmente distinto de direccionar los clusters.

En lugar de referirse a ellos en términos geométricos (Cilindro, Cabeza y Sector), a cada cluster se le asigna un número único, Número de Sector.  Para ello se numeran 0, 1, 2, ... N-1, donde N es el número total de sectores del disco.  Actualmente LBA es el sistema dominante para direccionamiento de discos grandes, puesto que desde que alcanzaron el límite de 8.455 GB, se hizo imposible expresar su geometría en términos de Cilindro, Cabeza y Sector.

Observe en realidad LBA es un sistema radicalmente nuevo de direccionamiento que, en principio, no implica por sí mismo ampliar ningún límite.  Aunque desde luego, las BIOS que detectan sistemas LBA también disponen de la traducción adecuada para solventar las limitaciones de la combinación BIOS/ATA (saltar la limitación de 528 MB o incluso la de 8.455 GB).  Esta traducción es la que resuelve el paso de la barrera, ya que la interrupción 13h no sabe nada sobre direccionamientos LBA.  Por supuesto todas las nuevas unidades de disco soportan LBA, y cuando esta circunstancia es auto-detectada por la BIOS, se establece automáticamente este modo de direccionamiento y se habilita la traducción correspondiente.

Esta traducción es parecida a la ECHS, aunque el algoritmo es diferente; se denomina traducción auxiliar LBA.  La diferencia substancial es que en ECHS, la BIOS traslada los parámetros utilizados por la interrupción 13h desde la geometría trasladada a la geometría local del disco.  En la traducción LBA, la BIOS traslada la geometría trasladada directamente en un número de sector.

Con posterioridad al establecimiento del sistema, se empezó a utilizar una extensión conocida como LBA48, que aumentaba de 24 a 48 los bits reservados para representar los números de sector.  Asumiendo que el formateo se realiza en sectores de 512 Bytes,  el método permite unidades con un máximo teórico de 512 x 248 = 144.11 Petabytes (millones de Gigas).

§6  Extensiones de la interrupción 13h

Desde luego, con geometría traducida o no, mientras que se utilicen los servicios de la interrupción 13h de la BIOS, se está bajo los límites de 1,024 cilindros, 256 cabezas y 63 sectores.  Para sobrepasar este límite fue preciso modificar la Int 13h, añadiendo las que se denominan Extensiones de la interrupción 13h.  El uso de estas extensiones significa modificar todo lo que tiene que ver con los accesos a disco, la propia BIOS, el Sistema Operativo y los propios discos.  En este sentido operan, los nuevos Sistemas Operativos (por ejemplo DOS 7.0 y superiores, Windows 95 y siguientes y OS/2 Warp).

Nota:  Algunos fabricantes de discos disponen de utilidades que permiten chequear si la BIOS del equipo soporta las extensiones de la interrupción 13h.  En su tiempo (1998-2000) este tipo de utilidades, así como las actualizaciones de BIOS, fueron muy populares. Porque en esta época se instalaban ampliaciones de discos con unidades que no eran soportadas por algunas de las BIOSes montadas en los equipos.  Aunque han perdido actualidad, su utilización puede ser muy didáctica.  Puede probarse con la utilidad ExtBios de Jan Steunebrink    web.inter.nl.net  [3]

En realidad, estas extensiones utilizan un direccionamiento de 64 bits en lugar de los 24 estándar , o los 48 de LBA48, que para los estándares actuales, supone una capacidad astronómica: 18.446 x 1018 (18.446 Hexa Clusters).  Suponiendo un tamaño de sector de 512 bytes son 9.444 x 1021 (9.444 miles de Trillones de bytes).

Además de las necesarias modificaciones en los discos, la BIOS y el Sistema Operativo, otra implicación de estas ampliaciones es que el sistema clásico de especificar el tamaño en términos de la geometría lógica de las unidades, ha quedado obsoleto.  Debido a los múltiples niveles de traducción en la BIOS y en el propio disco, los parámetros de geometría lógica de los discos ATA/IDE, ha dejado de tener ninguna relación con la realidad.  El único valor que tiene sentido es el número total de sectores.  Por ejemplo, si una unidad 75GXP IBM de 45 GB fuese expresada en términos de geometría convencional tendría 89,355 cilindros, 16 cabezas y 63 sectores;  en lugar de esto se dice simplemente que tiene 90,069,840 sectores de datos.  Por convención y por compatibilidad, todas las unidades con más de 8.4 GB tienen unos parámetros lógicos de 16,383 cilindros, 16 cabezas y 63 sectores,  razón por la cual, aparecen todos como de 8.4 GB si se instalan en un equipo en el que la BIOS no soporta las extensiones de Int 13h.

§7  Ejercicios
  • Comprobar las características de los discos IDE con las utilidades IDEinfo y IDEdiag ( 6.1).
  • Comprobar las extensiones de la BIOS con Extbios
  • Aparte de las utilidades señaladas, mediante la utilidad hdparm (generalmente en /sbin) los usuarios de Linux pueden obtener directamente y sin necesidad de tales utilidades, completa información sobre las características de las unidades IDE conectadas en sus sistemas.  Tenga especial cuidado con este comando que permite setear distintos aspectos de los discos IDE a muy bajo nivel!!.  Consulte el manual (man hdparm)

A continuación se muestra la salida proporcionada en un caso concreto mediante el comando hdparm -I /dev/hda, que permite obtener las características de la primera unidad de disco del primer canal IDE del sistema.

/dev/hda:

ATA device, with non-removable media
    Model Number:       HITACHI_DK23BA-15 
    Serial Number:      10BMKY
    Firmware Revision:  00E1A0A0
Standards:
    Used: ATA/ATAPI-5 T13 1321D revision 1 
    Supported: 5 4 3 2 
Configuration:
    Logical        max     current
    cylinders      16383   16383
    heads          16      16
    sectors/track  63      63
    --
    CHS current addressable sectors:  16514064
    LBA user addressable sectors:     29498112
    device size with M = 1024*1024:      14403 MBytes
    device size with M = 1000*1000:      15103 MBytes (15 GB)
Capabilities:
    LBA, IORDY(cannot be disabled)
    bytes avail on r/w long: 4      Queue depth: 1
    Standby timer values: spec'd by Vendor, no device specific minimum
    R/W multiple sector transfer: Max = 16  Current = 16
    Advanced power management level: 159 (0x9f)
    DMA: sdma0 sdma1 sdma2 mdma0 mdma1 mdma2 udma0 udma1 *udma2 udma3 udma4 
         Cycle time: min=120ns recommended=120ns
    PIO: pio0 pio1 pio2 pio3 pio4 
         Cycle time: no flow control=400ns   IORDY flow control=120ns
Commands/features:
    Enabled   Supported:
        *     READ BUFFER cmd
        *     WRITE BUFFER cmd
        *     Host Protected Area feature set
        *     Look-ahead
        *     Write cache
        *     Power Management feature set
              Security Mode feature set
        *     SMART feature set
              Address Offset Reserved Area Boot
        *     Advanced Power Management feature set
Security: 
    Master password revision code = 65534
           supported
    not    enabled
    not    locked
           frozen
    not    expired: security count
           supported: enhanced erase
    24min for SECURITY ERASE UNIT. 24min for ENHANCED SECURITY ERASE UNIT.
HW reset results:
    CBLID- above Vih
    Device num = 0 determined by the jumper
Checksum: correct

Entre otros datos, puede comprobarse que, aunque su capacidad es de 15 GB, la unidad responde a la configuración lógica tradicional de 16383 / 16 / 63 (cilindros / cabezas / sectores). Lo que se traduce en el valor señalado "CHS current addressable sectors: 16514064" (producto cilindros x cabezas x sectores), que es el máximo de unidades lógicas de asignación utilizables según el método CHS tradicional.  En cambio, el direccionamiento LBA permite 29498112 sectores, que asumiendo (como es usual para discos de esta capacidad) un tamaño de 512 bytes para cada unidad de asignación, proporciona una capacidad total de 29498112 x 512 = 15.103 GB.

Como se ha señalado en el capítulo anterior ( 6.1) las unidades físicas (discos) pueden ser divididas en varias particiones primarias, cada una de las cuales puede subdividirse a su vez en distintas unidades lógicas que aparecen como "discos" distintos. El resultado es que, desde el explorador del Sistema, es imposible saber si tales discos corresponden realmente a distintas unidades físicas.  Por ejemplo, en el caso anterior, la unidad Hitachy de 15 GB. tiene la siguiente distribución interna: 

Dispositivo Comentario
/dev/hda Primer y (en este caso) único dispositivo conectado al canal-0 IDE
/dev/hda1 Wind95 FAT32 LBA. Partición primaria; aparece como unidad C: en Windows.
/dev/hda2 Esta es la "visión" que tiene Linux de la partición extendida DOS (ver a continuación). Comprende las particiones señaladas (*)
/dev/hda3 Linux swap.  Partición primaria;  utilizado automáticamente por el sistema Linux (no accesible para el usuario)
/dev/hda4 Linux native.  Partición primaria; es el directorio raíz "/" en Linux
/dev/hda5 Wind95 FAT32 LBA. Aparece como unidad D: en Windows (*).
/dev/hda6 Wind95 FAT32 LBA. Aparece como unidad E: en Windows (*).
/dev/hda7 Wind95 FAT32 LBA. Aparece como unidad F: en Windows (*).
/dev/hda8 Wind95 FAT32 LBA. Aparece como unidad G: en Windows (*).

La información anterior, junto con el tamaño y los puntos de inicio y fin de cada zona, pueden obtenerse con el comando fdisk -l. En el caso que nos ocupa, el resultado es el siguiente:

Disk /dev/hda: 15.1 GB, 15103033344 bytes
255 heads, 63 sectors/track, 1836 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot  Start      End    Blocks   Id  System
/dev/hda1   *       1      255   2048256    b  Win95 FAT32
/dev/hda2         256     1027   6201090    f  Win95 Ext'd (LBA)
/dev/hda3        1028     1052    200812+  82  Linux swap
/dev/hda4        1053     1836   6297480   83  Linux
/dev/hda5         256      510   2048256    b  Win95 FAT32
/dev/hda6         511      765   2048256    b  Win95 FAT32
/dev/hda7         766     1020   2048256    b  Win95 FAT32
/dev/hda8        1021     1027     56196    6  FAT16

Para los interesados en conocer como se llegó a esta situación, diremos que el disco se particionó inicialmente con la utilidad fdisk de MS-DOS.  De esta forma se creó una partición primaria de 2 MB destinada a albergar el SO Windows (que posteriormente constituiría la unidad C: de dicho Sistema) y una partición extendida (en realidad otra partición primaria pero con capacidad para contener varias particiones lógicas en su interior) con 6.56 MB.  En este espacio se crearon 3 unidades lógicas de 2 GB y una de 55 MB que posteriormente corresponderían a las unidades D:, E:, F: y G: del Sistema Windows -señaladas con (*) en la tabla-.  El resto se dejó sin utilizar.

Posteriormente, cuando se instaló Linux, éste detectó el espacio sobrante y creó dentro de él dos particiones primarias:  la de swap, con 196 MB y la principal con los 6.15 GB restantes para el propio Sistema y usuarios.  Las particiones Windows son accesibles desde Linux (no a la inversa ;-) con los identificadores de dispositivo señalados en la primera columna.

Debemos aclarar que la asignación que realizan los Sistemas Operativos de los dispositivos IDE, se realiza en el momento de la carga inicial del sistema.  De forma que la adición o eliminación de un dispositivo puede originar el cambio de denominación del resto de la cadena en el próximo arranque del Sistema.  En el caso de Linux, la asignación de dispositivos IDE es como sigue:

/dev/hda Primera unidad física. Unidad maestra en el primer canal
/dev/hdb Segunda unidad física. Unidad esclava en el primer canal
/dev/hdc Tercera unidad física.  Unidad maestra en el segundo canal
/dev/hdd Cuarta unidad física. Unidad esclava en el segundo canal
/dev/hda1 Primera partición primaria en la 1ª unidad física
/dev/hda2 Segunda partición primaria en la 1ª unidad física
/dev/hda3 Tercera partición primaria en la 1ª unidad física 
/dev/hda4 Cuarta partición primaria en la 1ª unidad física
/dev/hda5 Primera partición lógica en la primera partición primaria (extendida) que tenga unidades lógicas.  Observe que este número es siempre 5, incluso cuando la primera unidad física (hda) tiene menos de cuatro particiones primarias.
/dev/hda6 Segunda partición lógica ... 
...
/dev/hdb1 Primera partición primaria en la 2ª unidad física
...

La mejor forma de comprobar las unidades IDE montadas en el sistema y su disposición lógica, es utilizar la utilidad dmesg mediante el comando: dmesg | grep [hs]d[az]. En el equipo que comentamos produce la siguiente salida:

Kernel command line: root=/dev/hda4 vga=0x311 desktop splash=silent
ide0: BM-DMA at 0x10c0-0x10c7, BIOS settings: hda:DMA, hdb:pio
hda: HITACHI_DK23BA-15, ATA DISK drive
hda: attached ide-disk driver.
hda: host protected area => 1
hda: 29498112 sectors (15103 MB) w/2048KiB Cache, CHS=1836/255/63, UDMA(33)
hda: hda1 hda2 < hda5 hda6 hda7 hda8 > hda3 hda4

Hemos resaltado la última línea (la que realmente nos interesa) donde puede comprobarse que en este caso, las particiones lógicas pertenecen a la segunda partición primaria de la unidad física.

Sabiendo que esta unidad está conectada al bus ide0, pueden conseguirse más datos sobre la unidad en el directorio /proc/ide/ide0/hda. Donde encontramos varios subdirectorios con la información pertinente.

  Inicio.


[1]  Por ser lo más común en la literatura informática, en toda esta exposición representaremos los números según el sistema USA, es decir, utilizando la coma para representar los miles, decenas de miles, etc. y el punto para representar los decimales.  Por ejemplo: 1,000.25

[2]  Modificar la interrupción 13h habría supuesto que gran parte del software antiguo no hubiese funcionado en los sistemas que empezaban a utilizar discos de más de 8 GB.

[3]  En caso de no funcionar el enlace anterior, puede probar esta copia de mi archivo histórico  ExtBios.