.png)
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)
- 0 é normalmente reservado para o "setor de inicialização" (c-0,h-0,é-0)
- 1-64 (63 = 2^6 - 1) *0 é reservado
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-cylinder
na 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.
Na minha opinião, seria mais útil chamá-los de heads-per-disk
ou heads-per-surface
, já que um cilindro passa por todo o disco (vários pratos).
Endereçamento de bloco lógico:
Fórmula:A = (c ⋅ Nheads + h) ⋅ Nsectors + (s − 1)
A
- Endereço do bloco lógicoNheads
- 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-track
aparece 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 3150
se 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 surface
ou 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 cylinder
faz 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)