.png)
LBA 이전에는 단순히 디스크의 물리적 매핑이 있었습니다. 원래 IBM-PC 호환 시스템에서 BIOS를 사용한 디스크 액세스는 다음과 같았습니다.
- 실린더 번호:(10b)
- 0-1024 (1024 = 2^10)
- 머리 번호: (8b)
- 0-256 (256 = 2^8)
- 섹터 번호: (6b)
- 0은 일반적으로 "부트 섹터" (씨-0,시간-0,에스-0)
- 1-64 (63 = 2^6 - 1) *0은 예약되어 있습니다.
총 CHS 주소:24b(10+8+6)
예전에는 평균(파일|블록|섹터) 크기가 512B였습니다.
예위키피디아:
512(bytes) × 63(sectors) x 256(heads) × 1024(cylinders) = 8064 MiB (yields what is known as 8 GiB limit)
내가 혼란스러워하는 것은 무엇입니까?머리heads-per-cylinder
실제로 는 LBA 공식에서 언급될 때를 의미합니다 . 내가 아는 바로는 머리가머리, 이동식 미디어가 아닌 경우 각각플래터각 표면에 하나씩 두 개(상단, 하단)가 있습니다.
내 생각에는 실린더가 전체 디스크(다중 플래터)를 통과하므로 이들을 heads-per-disk
또는 이라고 부르는 것이 더 적합할 것 같습니다 .heads-per-surface
논리적 블록 주소 지정:
공식:A = (c ⋅ Nheads + h) ⋅ Nsectors + (s − 1)
A
- 논리 블록 주소Nheads
- 디스크의 헤드 수heads-per-disk
Nsectors
- 트랙의 섹터 수sectors-per-track
c,h,s
- 실린더, 헤드, 섹터 번호입니다.24-bits total (10+8+6)
첫 번째 예를 보면여기:
For geometry 1020 16 63 of a disk with 1028160 sectors CHS 3 2 1 is LBA 3150=(3× 16+2)× 63
기하학:(이것은 제조사가 정의한 것입니다)
- 실린더 - 1020
- 머리-16
- 섹터 - 63
답변1
전반적으로 용어가 다소 엉성하여 더 많은 혼란을 야기합니다.
1024비트 주소 지정 가능 숫자(1024 = 2^10)
IBM PC/XT는 하드웨어 레지스터에서 10비트 실린더 번호를 사용하는 Western Digital WD1010 디스크 컨트롤러를 사용했습니다.
첫 번째 실린더의 주소는 0이므로 1024개의 실린더 주소가 있습니다.
"주소 지정 가능한 번호"는 말도 안되는 소리다.
-1 "부트 섹터"(c-0,h-0,s-0)
63비트 주소 지정 가능 숫자(63 = 2^6 - 1)
모든 트랙의 첫 번째 섹터는 주소 1이므로 6비트 섹터 번호는 각 트랙에서 최대 63개 섹터(섹터 번호 1~63)의 주소를 지정할 수 있습니다.
섹터 주소 0이 없습니다. 예약되어 있지 않습니다. 존재하지 않습니다.
이 오프셋을 빼는 것은 산술적으로 필요하며 부트 섹터와는 전혀 관련이 없습니다. 부팅(또는 모든 기능)을 위해 디스크 드라이브의 첫 번째 섹터(또는 모든 섹터)를 사용하는 것은 시작 오프셋을 빼는 데 필요한 것과 관련이 없습니다.
따라서 다음과 같은 이론적 최대 주소를 얻을 수 있습니다.
512(바이트) × 63(섹터) x 256(헤드) × 1024(실린더) = 8064MiB
아니요, 최대 용량입니다.
디스크 주소는 바이트가 아닌 섹터용입니다.
헤드 번호는 246비트 주소 지정이 가능한 번호인 것으로 알고 있습니다.
뭐??? "주소 지정 가능한 번호"???
구동 매개변수 중 하나는 (실린더 내) 헤드 수입니다.
CHS 주소의 숫자 중 하나가 헤드 번호입니다.
246비트???
내가 혼란스러워하는 것은 머리가 로 언급될 때 실제로 머리가 무엇인지입니다
heads-per-track
.
Heads-per-track
PC에 사용되는 일반적인 HDD에는 그러한 매개변수가 없기 때문에 사용자가 구성한 것입니다(즉, 해당 숫자는 항상 1입니다).
특정 트랙은 하나의 특정 R/W 헤드에서만 읽고 쓸 수 있습니다.
표면당 하나의 R/W 헤드가 있습니다. (듀얼 포트 드라이브를 사용할 가능성은 없습니다.)
R/W 헤드는 암 끝에 장착됩니다.
모든 R/W 헤드와 암은 액추에이터에 의해 이동/회전되는 어셈블리로 구성됩니다.
(그러나 그런 적도 있었습니다.결정된- 헤드 디스크 드라이브(예: 탐색 시간이 0인 트랙당 하나의 헤드)
내가 아는 바로는 헤드(읽기/쓰기를 수행하는 실제 팔)이고 탈착식 미디어가 아닌 한 각 플래터에는 두 개(상단, 하단)가 있으므로 실제로는 이러한 용어가 이해되지 않습니다. 그 이후로 이를 플래터당 헤드 또는 디스크당 헤드라고 부르게 되었습니다. 실제로는 트랙당 섹터여야 합니다. 그렇죠?
그렇다면 당신은 머리가 무엇인지 혼란스러워하는 것 같습니다.
또한 "플래터"와 "표면"을 혼동하고 있습니다.
플래터의 양면을 사용해야 한다는 요구 사항은 없으므로 플래터를 하나의 단위로 취급하는 것이 아니라 각 표면을 하나의 단위로 처리합니다.
라는 드라이브 매개변수가 있습니다 sectors per track
.
이제
heads-per-track
CHS에서 LBA로의 변환을 보면 이 용어가 나타납니다.
이번에도 당신이 꾸며낸 일이 있는 것 같았습니다. 트랙당 헤드 수는 단일성입니다.
하지만 기하학 1020,16,63이 CHS 3,2,1로 어떻게 변환되는지 누군가 나에게 설명해 줄 수 있습니까?
LBA는 섹터 주소입니다.
CHS는 섹터 주소이기도 합니다.
한 주소 스타일을 다른 주소 스타일로 변환하려면 드라이브 구조를 지정해야 합니다.
. number of cylinders
. number of heads (per cylinder)
. number of sectors per track
기하학을 주소로 *번역*할 수 없습니다. 너사용주소를 변환하기 위한 기하학입니다. 드라이브 구조가 다음인 경우
CHS 주소는 3,2,1
LBA 주소와 동일합니다 .3150
1020,16,63
수정된 질문에 대한 부록
내 생각에는 실린더가 전체 디스크(다중 플래터)를 통과하므로 이를 디스크당 헤드 또는 표면당 헤드라고 부르는 것이 더 적합할 것 같습니다.
내가 읽은 디스크 드라이브 제조업체의 수많은 기술 문서 중 (단일 포트) 드라이브의 사양 표에는 다음이 나열되어 있습니다.R/W 헤드 수그리고플래터의 수. heads per disk
, heads per surface
, 의 비율은 한번도 없었습니다 heads per platter
.
컨트롤러 펌웨어, 디스크용 장치 드라이버 및 파일 시스템 핸들러를 개발하는 소프트웨어/펌웨어 엔지니어로 일하면서 나는 플래터 수에 대해 걱정하거나 사용할 필요가 없었습니다. 플래터의 수 또는 플래터에 가능한 두 개의 표면이 있다는 것은 다음과 같습니다.기계적 성질이는 CHS 주소 지정을 위한 드라이브 구조와 전혀 관련이 없습니다.
CHS의 C는 실린더 주소를 나타냅니다. 디스크 드라이브는 (전기-기계적으로)구하다R/W 헤드 어셈블리가 올바르게 배치되도록 요청된 실린더 주소/위치로 이동합니다.
CHS의 H는 R/W 헤드 주소를 나타냅니다. 디스크 컨트롤러(전기적으로)선택하다요청된 R/W 헤드(탐색이 완료된 후)를 해당 주소로 검색하여 올바른 트랙에 액세스합니다. 다른 모든 R/W 헤드는 (전기적으로) 비활성화됩니다.
CHS의 S는 섹터 주소를 나타냅니다. 디스크 컨트롤러는 (선택된) R/W 헤드 아래에서 회전하면서 요청된 섹터를 찾을 때까지(예: 섹터의 ID 레코드를 읽고 주소를 수행할 때까지) 각 섹터를 프로그래밍 방식으로 검색합니다(탐색 및 헤드 선택 후). 비교).
또한
차원 분석에 익숙하다면 디스크 드라이브의 헤드 수를 heads per cylinder
로 지정하는 것이 heads per drive
.
기하학 CHS 번호를 이해하지만 (3,2,1) 튜플 CHS 번호는 어디에서 오는 것입니까?
이는 LBA 주소로의 변환 예에 사용하기 위해 선택한 임의의 CHS 주소일 뿐입니다.
지금
최종 사용자 전문 용어로는 "디스크" == 디스크 드라이브입니다.
전문 HDD 전문 용어로 "디스크" == 디스크 플래터입니다.
답변2
다음은 Python에서 구현된 변환, 역사적 특이점 및 적절한 용어에 대한 편리하고 빠른 요약입니다. 대문자는 기하학을 지정하고, 소문자는 (c,h,s)
섹터 주소의 구성 요소를 지정합니다.
기본 (C,H,S)
구조는 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)