.png)
Antes de LBA, simplemente tenías el mapeo físico de un disco, cuyo acceso original al disco con el BIOS en una máquina antigua compatible con IBM-PC se vería así:
- Número de cilindro:(10b)
- 0-1024 (1024 = 2^10)
- Número de cabeza: (8b)
- 0-256 (256 = 2^8)
- Número de sector: (6b)
- 0 está reservado normalmente para "sector de arranque" (C-0,h-0,s-0)
- 1-64 (63 = 2^6 - 1) *0 está reservado
Dirección total de CHS:24b (10+8+6)
En el pasado, el tamaño promedio (archivo|bloque|sector) era 512B.
Ejemplo deWikipedia:
512(bytes) × 63(sectors) x 256(heads) × 1024(cylinders) = 8064 MiB (yields what is known as 8 GiB limit)
Lo que me confunde es quécabezaen realidad significa, cuando se hace referencia a él heads-per-cylinder
en la fórmula LBA. No tiene sentido para mí porque por lo que sé una cabeza escabeza, y a menos que sea un medio extraíble cadaplatotiene dos de ellos (arriba, abajo), uno para cada una de sus superficies.
En mi opinión, sería mejor referirse a ellos como heads-per-disk
o heads-per-surface
, ya que un cilindro atraviesa todo el disco (múltiples platos).
Direccionamiento de bloques lógicos:
Fórmula:A = (c ⋅ Nheads + h) ⋅ Nsectors + (s − 1)
A
- Dirección de bloque lógicoNheads
- Número de cabezas en un discoheads-per-disk
Nsectors
- Números de sectores en una pista.sectors-per-track
c,h,s
- son los números de cilindro, culata y sector24-bits total (10+8+6)
Mirando el primer ejemplo deaquí:
For geometry 1020 16 63 of a disk with 1028160 sectors CHS 3 2 1 is LBA 3150=(3× 16+2)× 63
Geometría:(Esto lo define el fabricante)
- Cilindros - 1020
- Cabezas- 16
- Sectores - 63
Respuesta1
En general, usted es bastante descuidado con la terminología, lo que es una fuente de mayor confusión.
Número direccionable de 1024 bits (1024 = 2^10)
IBM PC/XT usaba un controlador de disco Western Digital WD1010 que usaba (en registros de hardware) un número de cilindro de 10 bits.
El primer cilindro tiene la dirección 0, por lo que hay 1024 direcciones de cilindro.
"Número direccionable"Es una tontería.
-1 para el "sector de arranque" (c-0,h-0,s-0)
Número direccionable de 63 bits (63 = 2^6 - 1)
El primer sector (de cada pista) es la dirección 1, por lo que un número de sector de 6 bits puede direccionar hasta 63 sectores (números de sector del 1 al 63) en cada pista.
No hay dirección de sector cero. No está reservado. No existe.
La resta de este desplazamiento es una necesidad aritmética y no está relacionada de ninguna manera con el sector de arranque. El uso del primer sector (o cualquier sector) de la unidad de disco para el arranque (o cualquier función) es irrelevante para la necesidad de restar el desplazamiento inicial.
Entonces entiendo que puedes obtener una dirección máxima teórica de lo siguiente:
512 (bytes) × 63 (sectores) x 256 (cabezas) × 1024 (cilindros) = 8064 MiB
No, esa es una capacidad máxima.
Las direcciones de disco son para sectores, no para bytes.
Entiendo que el número principal es un número direccionable de 246 bits...
¿¿¿Eh??? ¿Un "número direccionable"?
Uno de los parámetros de accionamiento es el número de culatas (en un cilindro).
Uno de los números en una dirección de CHS es el número principal.
246 bits???
Lo que me confunde es qué es realmente una cabeza cuando se la conoce como
heads-per-track
.
Heads-per-track
es algo que usted inventó, ya que no existe tal parámetro para el disco duro típico usado en una PC (es decir, ese número siempre sería la unidad).
Una pista específica sería leída y escrita por un solo cabezal R/W específico.
Hay un cabezal R/W por superficie. (No es probable que utilice una unidad de doble puerto).
El cabezal R/W está montado en el extremo de un brazo.
Todos los cabezales y brazos R/W comprenden un conjunto que se mueve/gira mediante un actuador.
(Pero también ha habidofijado-unidades de disco de cabezal, por ejemplo, un cabezal por pista, que tienen tiempo de búsqueda cero.)
Estos términos no tienen ningún sentido para mí porque, por lo que sé, es una cabeza (el brazo real que realiza la lectura/escritura) y, a menos que sea un medio extraíble, cada plato tiene dos (arriba, abajo), por lo que realmente Desde entonces hace más referencia a ellos como cabezales por plato o cabezales por disco... y realmente debería ser sectores por pista, ¿verdad?
Entonces aparentemente no sabes qué es una cabeza.
También estás confundiendo "plato" con "superficie".
No es necesario utilizar ambos lados de un plato, por lo que cada superficie se trata como una unidad, en lugar de que el plato sea una unidad.
Hay un parámetro de unidad llamado sectors per track
.
Ahora bien, este término
heads-per-track
aparece cuando observa la conversión de CHS a LBA.
De nuevo, algo que parecías haber inventado. Cabezas por pista es la unidad.
pero ¿cómo se traduce la geometría 1020,16,63 a CHS 3,2,1? ¿Puede alguien explicármelo?
LBA es una dirección sectorial.
CHS también es una dirección sectorial.
Para convertir un estilo de dirección a otro, debe especificar la geometría de la unidad:
. number of cylinders
. number of heads (per cylinder)
. number of sectors per track
No puedes *traducir* la geometría a una dirección; túusarla geometría para convertir una dirección.
La dirección CHS 3,2,1
es equivalente a la dirección LBA 3150
si la geometría de la unidad es 1020,16,63
.
ADENDA para la pregunta revisada
En mi opinión, sería mejor llamarlos cabezales por disco o cabezales por superficie, ya que un cilindro atraviesa todo el disco (múltiples platos).
De los numerosos documentos técnicos (de los fabricantes de unidades de disco) que he leído, la tabla de especificaciones para una unidad (de un solo puerto) enumeraría losnúmero de cabezales R/Wy elnumero de platos. Nunca hubo una proporción de heads per disk
, heads per surface
o heads per platter
.
En mi trabajo como ingeniero de software/firmware desarrollando firmware de controlador, controladores de dispositivos para discos y controladores de sistemas de archivos, nunca me preocupé ni tuve que usar la cantidad de platos. El número de platos o que hay dos superficies posibles para un plato sonpropiedades mecánicasque son totalmente irrelevantes para la geometría del variador para el direccionamiento CHS.
La C en CHS se refiere a la dirección del cilindro. La unidad de disco tiene que (electromecánicamente)buscara la dirección/ubicación solicitada del cilindro para que el conjunto del cabezal R/W esté colocado correctamente.
La H en CHS se refiere a la dirección principal de R/W. El controlador de disco (eléctricamente)seleccionael cabezal R/W solicitado (una vez completada la búsqueda) por su dirección para acceder a la pista correcta. Todos los demás cabezales R/W están (eléctricamente) desactivados.
La S en CHS se refiere a la dirección del sector. El controlador de disco (programáticamente) escanea cada sector (después de la búsqueda y selección del cabezal) a medida que gira bajo el cabezal R/W (seleccionado), hasta que se localiza el sector solicitado (por ejemplo, lee el registro de identificación del sector y realiza una dirección). comparación).
Además,
si está familiarizado con el análisis dimensional, especificar el número de cabezales de una unidad de disco heads per cylinder
tiene más sentido que heads per drive
.
Entiendo los números CHS de geometría, pero ¿de dónde provienen los números CHS de la tupla (3,2,1)?
Esa es solo una dirección CHS arbitraria elegida para usar en ejemplos de conversiones a direcciones LBA.
POR CIERTO
En la jerga del usuario final, "disco" == unidad de disco.
En la jerga profesional de HDD, "disco" == plato de disco.
Respuesta2
Aquí hay un resumen rápido y conveniente de la conversión, las peculiaridades históricas y la terminología adecuada implementada en Python. Las mayúsculas especifican la geometría, las minúsculas especifican los (c,h,s)
componentes de una dirección de sector.
La (C,H,S)
geometría predeterminada proporciona valores que se utilizan normalmente para discos grandes modernos en el inicio temprano para el inicio estilo MBR/BIOS.
def chs(lba,C=1024,H=255,S=63):
"""
'lba' linearly addresses sector, indexing from zero.
'C','H','S' specify geometry - fixed for a given disk:
1 <= C <= 1024 (10 bits)
1 <= H <= 255 (8 bits) not 256 due to WD1010 quirk
1 <= S <= 63 (6 Bits) not 64 due to WD1010 quirk
Returns address as c,h,s tuple:
0 <= c <= 1023 (10 bits) modulo C
0 <= h <= 255 (8 bits) modulo H
1 <= s <= 63 (6 Bits) not 64 due to WD1010 quirk
"""
if C<1 or H<1 or S<1 or C>1024 or H>255 or S>63:
raise ValueError, \
"Invalid (C,H,S) geometry: ({},{},{})". \
format(C,H,S)
t,s = divmod(lba,S); s+=1 # tracks, sector offset
c,h = divmod(t,H)
if c>=C: raise ValueError, \
"Unaddressable lba value: {} for ({},{},{}) geometry.". \
format(lba,C,H,S)
return (c,h,s)
def lba(c,h,s,C=1024,H=255,S=63):
"""
'C','H','S' specify geometry as for function 'chs'.
'c','h','s' address a sector in this geometry.
"""
if C<1 or H<1 or S<1 or C>1024 or H>255 or S>63:
raise ValueError, \
"Invalid (C,H,S) geometry: ({},{},{})". \
format(C,H,S)
if c<0 or h<0 or s<1 or c>=C or h>=H or s>S:
raise ValueError, \
"Unaddressable (c,h,s) value: ({},{},{}) for ({},{},{}) geometry.". \
format(c,h,s,C,H,S)
return (c*H+h)*S+(s-1)