Mapeamento CHS para LBA - (armazenamento em disco)

Mapeamento CHS para LBA - (armazenamento em disco)

Antes do LBA você simplesmente tinha o mapeamento físico de um disco, cujo acesso originalmente ao disco com o BIOS em uma máquina antiga compatível com IBM-PC seria mais ou menos assim:

  • Número do cilindro:(10b)
    • 0-1024 (1024 = 2 ^ 10)
  • Número principal: (8b)
    • 0-256 (256 = 2 ^ 8)
  • Número do setor: (6b)

Endereço CHS total:24b (10+8+6)


Antigamente, o tamanho médio (arquivo | bloco | setor) era 512B.

Exemplo deWikipédia:

512(bytes) × 63(sectors) x 256(heads) × 1024(cylinders) = 8064 MiB (yields what is known as 8 GiB limit) 

O que estou confuso é o quecabeçana verdade significa, quando referido como heads-per-cylinderna fórmula LBA. Não faz sentido para mim porque pelo que sei uma cabeça écabeça, e a menos que seja mídia removível cadapratotem dois deles (superior, inferior), um para cada uma de suas superfícies.

insira a descrição da imagem aqui

Na minha opinião, seria mais útil chamá-los de heads-per-diskou heads-per-surface, já que um cilindro passa por todo o disco (vários pratos).

insira a descrição da imagem aqui


Endereçamento de bloco lógico:

Fórmula:A = (c ⋅ Nheads + h) ⋅ Nsectors + (s − 1)

  • A- Endereço do bloco lógico
  • Nheads- Número de cabeças em um discoheads-per-disk
  • Nsectors- Números de setores em uma pistasectors-per-track
  • c,h,s- são os números do cilindro, cabeçote e setor24-bits total (10+8+6)

Olhando para o primeiro exemplo emaqui:

For geometry 1020 16 63 of a disk with 1028160 sectors CHS 3 2 1 is LBA  3150=(3× 16+2)× 63

Geometria:(isto é definido pelo fabricante)

  • Cilindros - 1020
  • Cabeças- 16
  • Setores - 63

Responder1

No geral, você é um tanto desleixado com a terminologia, o que é uma fonte de ainda mais confusão.

Número endereçável de 1024 bits (1024 = 2 ^ 10)

O IBM PC/XT usava um controlador de disco Western Digital WD1010 que usava (em registros de hardware) um número de cilindro de 10 bits.
O primeiro cilindro tem endereço 0, portanto existem 1.024 endereços de cilindro.
"Número endereçável"é um absurdo.

-1 para o "setor de inicialização" (c-0,h-0,s-0)
Número endereçável de 63 bits (63 = 2^6 - 1)

O primeiro setor (de cada trilha) é o endereço 1, portanto, um número de setor de 6 bits pode endereçar até 63 setores (números de setor de 1 a 63) em cada trilha.
Não há endereço de setor zero. Não está reservado. Isso não existe.
A subtração deste deslocamento é uma necessidade aritmética e não está relacionada de forma alguma ao setor de inicialização. O uso do primeiro setor (ou qualquer setor) da unidade de disco para inicialização (ou qualquer função) é irrelevante para a necessidade de subtrair o deslocamento inicial.

Então, entendo que você pode obter um endereço máximo teórico do seguinte:

512 (bytes) × 63 (setores) x 256 (cabeças) × 1.024 (cilindros) = 8.064 MiB

Não, essa é uma capacidade máxima.
Os endereços de disco são para setores, não para bytes.

Eu entendo que o número principal é um número endereçável de 246 bits ...

Huh??? Um "número endereçável"???
Um dos parâmetros do acionamento é o número de cabeçotes (em um cilindro).
Um dos números em um endereço CHS é o número principal.
246 bits???

O que estou confuso é o que realmente é uma cabeça quando é chamada de heads-per-track.

Heads-per-tracké algo que você inventou, já que não existe tal parâmetro para o HDD típico usado em um PC (ou seja, esse número seria sempre a unidade).
Uma faixa específica seria lida e escrita por apenas um cabeçote R/W específico.
Há uma cabeça R/W por superfície. (É improvável que você use uma unidade de porta dupla.)
A cabeça R/W é montada na extremidade de um braço.
Todas as cabeças e braços R/W compreendem um conjunto que é movido/girado por um atuador.
(Mas também houvefixo-unidades de disco de cabeça, por exemplo, uma cabeça por trilha, que têm tempo de busca zero.)

Esses termos não fazem nenhum sentido para mim porque, pelo que sei, é uma cabeça (o braço real que faz a leitura/gravação) e, a menos que seja uma mídia removível, cada prato tem dois deles (superior, inferior), então realmente faria faz mais desde que se referiu a eles como cabeçotes por prato ou cabeçotes por disco... e realmente deveriam ser setores por trilha, certo?

Então, aparentemente, você está confuso sobre o que é uma cabeça.
Você também está confundindo “prato” com “superfície”.
Não há exigência de que ambos os lados de um prato sejam usados; portanto, cada superfície é tratada como uma unidade, e não o prato como uma unidade.
Existe um parâmetro de drive chamado sectors per track.

Agora, esse termo heads-per-trackaparece quando você olha para a conversão de CHS para LBA.

Novamente, algo que você parecia ter inventado. Cabeças por faixa é unidade.

mas como a geometria 1020,16,63 se traduz em CHS 3,2,1, alguém pode me explicar?

LBA é um endereço setorial.
CHS também é um endereço setorial.
Para converter um estilo de endereço para outro, você precisa especificar a geometria da unidade:

. number of cylinders  
. number of heads (per cylinder)  
. number of sectors per track

Você não pode *traduzir* a geometria para um endereço; vocêusara geometria para converter um endereço.
O endereço CHS 3,2,1é equivalente ao endereço LBA 3150se a geometria do drive for 1020,16,63.


ADENDO para a pergunta revisada

Na minha opinião, seria mais útil se referi-los a eles como cabeçotes por disco ou cabeçotes por superfície, já que um cilindro passa por todo o disco (vários pratos).

Dos numerosos documentos técnicos (dos fabricantes de unidades de disco) que li, a tabela de especificações para uma unidade (porta única) listaria osnúmero de cabeças R/We anúmero de pratos. Nunca houve uma proporção de heads per disk, heads per surfaceou heads per platter.

Em meu trabalho como engenheiro de software/firmware desenvolvendo firmware de controlador, drivers de dispositivo para discos e manipuladores de sistema de arquivos, nunca me preocupei ou tive que usar o número de pratos. O número de pratos ou a existência de duas superfícies possíveis para um prato sãopropriedades mecânicasque são totalmente irrelevantes para a geometria do drive para endereçamento CHS.

O C em CHS refere-se ao endereço do cilindro. A unidade de disco deve (eletromecanicamente)procurarpara o endereço/localização do cilindro solicitado para que o conjunto do cabeçote R/W fique posicionado corretamente.

O H em CHS refere-se ao endereço principal R/W. O controlador de disco (eletricamente)Selecione% so cabeçalho R/W solicitado (após a conclusão da busca) por seu endereço para acessar a trilha correta. Todos os outros cabeçotes R/W estão (eletricamente) desativados.

O S em CHS refere-se ao endereço do setor. O controlador de disco (programaticamente) varre cada setor (após a busca e a seleção do cabeçote) à medida que gira sob o cabeçote R/W (selecionado), até que o setor solicitado seja localizado (por exemplo, lê o registro de ID do setor e executa um endereço comparação).

Além disso,
se você estiver familiarizado com análise dimensional, especificar o número de cabeçotes de uma unidade de disco heads per cylinderfaz mais sentido do que heads per drive.

Eu entendo os números CHS da geometria, mas de onde vêm os números CHS da tupla (3,2,1)?

Esse é apenas um endereço CHS arbitrário escolhido para uso em exemplos de conversões para endereços LBA.

POR FALAR NISSO
No jargão do usuário final, “disco” == unidade de disco.
No jargão profissional do HDD, "disco" == prato de disco.

Responder2

Aqui está um resumo rápido e conveniente da conversão, peculiaridades históricas e terminologia adequada implementada em python. Maiúsculas especificam a geometria, minúsculas especificam os (c,h,s)componentes de um endereço de setor.

A geometria padrão (C,H,S)fornece valores normalmente usados ​​para discos grandes modernos na inicialização inicial para inicialização no 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)

informação relacionada