ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [컴퓨터 구조] 디스크 주소 지정
    공학/컴퓨터구조 2023. 8. 7. 15:20

    글의 참고

    - https://en.wikipedia.org/wiki/Cylinder-head-sector

    - https://www.win.tue.nl/~aeb/linux/Large-Disk-4.html

    - http://www.c-jump.com/CIS24/Slides/DiskDrives/DiskDrives.html

    - https://wiki.osdev.org/Disk_access_using_the_BIOS_(INT_13h)#LBA_in_Extended_Mode#The_Algorithm 

    - https://en.wikipedia.org/wiki/Cylinder_1024

    - https://en.wikipedia.org/wiki/Partition_alignment


    글의 전제

    - 내가 글을 쓰다가 궁금한 점은 파란색 볼드체로 표현했다. 나도 모르기 때문에 나중에 알아봐야 할 내용이라는 뜻이다.

    - 밑줄로 작성된 글은 좀 더 긴 설명이 필요해서 친 것이다. 그러므로, 밑 줄 처친 글이 이해가 안간다면 링크를 따라서 관련 내용을 공부하자.


    글의 내용

    - 디스크 주소 지정

    : 디스크 주소 지정이란 간단히 물리적 디스크의 기본 단위인 섹터의 주소를 어떻게 지정할 것인가에 대한 방식이다. 섹터는 이전부터 지금까지 불변으로 512B로 고정되어 있다. 디스크 주소 지정 방식은 크게 2가지로 나눈다. CHS와 LBA가 있다. CHS는 이제는 거의 쓰이지 않는 옛날 방식이다. 현대에 거의 모든 디스크 주소 지정 방식은 LBA를 사용한다.

     

    - CHS

    : CHS는 Cylinder-head-sector의 약자이다. 이 CHS 주소 지정 방식 실린더, 헤드, 섹터를 이용해서 디스크에 주소를 지정한다. 이 방식은 헤드와 실린더 번호에 의해서 트랙이 결정이 된다. 

     

    : CHS 구성

    " 아래 그림에서 3개의 원판이 보일 것이다.이 원판들 하나를 `플래터(platter)` 라고 부른다. 그리고 이 플레터 윗면과 아래면에는 하나씩 헤더가 존재한다. 즉, 플레터 하나당 2개의 헤더가 위, 아래로 존재한다. 그리고 헤드는 아래에서 보다시피 다 같이 고정이 되어있다. 즉, 헤드는 모두 동일하게 움직이며 물리적 항상 동일한 트랙을 가리키고 있어야 한다. A라는 헤드가 0번 트랙에 있고, B라는 헤드가 1000번 트랙에 있을 수 없다.

     

    " 헤드의 이러한 수직적 정렬관계 때문에, 헤드가 가리키는 섹터를 수평적으로 나누는 트랙보다는 섹터를 수직적으로 나누는 실린더의 개념을 더 많이 사용하게 했다. 실린더는 아래에서 볼 수 있다시피 수직으로 현재 헤드가 가리키고 있는 트랙의 개수를 의미한다. 그러나, 사실 트랙과 실린더의 개념은 거의 동일하게 사용되고 있다. 

    출처 - https://en.wikipedia.org/wiki/Cylinder-head-sector

     

    : CHS 읽기/쓰기

    " CHS는 섹터부터 시작해서, 헤드, 실린더 순으로 값이 증가하면서 섹터를 하나씩 읽는다. 섹터가 18개라고 하고, 헤드의 개수도 2개, 실린더는 80개라고 하자.

    LBA =    0:   CHS = ( 0,  0,  1)
    LBA =    1:   CHS = ( 0,  0,  2)
    ....
    LBA =   16:   CHS = ( 0,  0, 17)
    LBA =   17:   CHS = ( 0,  0, 18)
    LBA =   18:   CHS = ( 0,  1,  1)
    LBA =   19:   CHS = ( 0,  1,  2)
    ....
    LBA =   34:   CHS = ( 0,  1, 17)
    LBA =   35:   CHS = ( 0,  1, 18)
    LBA =   36:   CHS = ( 1,  0,  1)
    LBA =   37:   CHS = ( 1,  0,  2)
    LBA =   38:   CHS = ( 1,  0,  3)
    
    ... [skip] ...
    
    LBA = 2859:   CHS = (79,  0, 16)
    LBA = 2860:   CHS = (79,  0, 17)
    LBA = 2861:   CHS = (79,  0, 18)
    LBA = 2862:   CHS = (79,  1,  1)
    LBA = 2863:   CHS = (79,  1,  2)
    ....
    LBA = 2878:   CHS = (79,  1, 17)
    LBA = 2879:   CHS = (79,  1, 18)

     

    " 위의 그림에서 볼 수 있다시피, 섹터가 19개가 되면 헤드가 1개 증가한다. 그리고 헤드의 값이 2가 되면 실린더의 값이 증가한다. 가장 주의할 부분은 섹터의 시작은 `1`이 라는게 가장 중요하다. 실제 프로그래밍을 할 때는, CHS 함수를 만들어야 한다면, 위의 내용을 머리속에 그리면서 아래의 공식을 통해 함수를 구현하면 된다. 

    " Temp = LBA / (Sectors per Track)
    " Sector = (LBA % (Sectors per Track)) + 1
    " Head = Temp % (Number of Heads)
    " Cylinder = Temp / (Number of Heads)

    : 위 공식은 LBA를 받아서 CHS의 읽을 시작 섹터의 위치를 찾는 공식이다. 그러나 사실, CHS를 코딩으로 읽는 방법은 그리 간단한 일이 아니다. 이 글을 참고하자.

     

    : CHS 단점

    " 첫 번째로, 디스크에 할당할 수 있는 주소의 개수가 부족하다. 초기 IDE/ATA 디스크에서 CHS 주소 지정 방식은 전통적으로 큰 제한이 하나있다. 바로 맨 처음 주소를 기준으로 8GB 밖에 사용하지 못한다는 것이다. 왜냐면, 구조상 하나의 섹터는 512B이고, 트랙 하나는 63개의 섹터를 갖고, 하나의 실린더는 255개의 헤드를 갖으며, 1024개의 실린더가 있다. 이걸 모두 곱하면 8GB 정도가 나온다. 

     

    " 두 번째로, CHS 주소 지정은 방식의 첫 번째 섹터가 1로 시작한다는 것이다. 그래서 혹시나 MBR 섹터를 읽고 싶다면, 시작 섹터를 1로 설정해야 한다. 대개 프로그래밍에서는 0부터 시작을 하는데, CHS는 1부터 시작한다. 

     

    " 세 번째로, 계산 방식이 복잡하다. 

     

    " 네 번째로, 섹터, 헤드, 실린더 개수의 표준이 없는것인지 매번 많은 양의 데이터를 읽기 전에는 반드시 BIOS를 통해서 트랙 당

     

    : Cylider 1024

    " 초기 BIOS 13h 기능은 큰 문제가 있다. 실린더의 개수를 지정하기 위해 10비트, 섹터 개수 6비트, 헤드 개수를 8비트로 제한한다. 즉, 1024개의 실린더, 256개의 헤드, 63개의 섹터가 최대가 된다. 이 값을 통해 디스크에서 읽어올 수 있는 값은 8.5GB 밖에 되지 않는다. 즉, 디스크가 128GB라면, 맨 앞 8.5GB 밖에 못 읽는단 소리다(CHS 주소 지정 방식이 `0/0/1` 부터 시작해서 `1023/255/63`으로 끝이난다). 더 큰 문제는 디스크에서 부트 로더와 커널을 읽어와야 하는데, 8.5GB 뒤에 위치에 있다면, 읽어올 수 없게된다. 그래서 마이크로스프트는 초기 도스시절에 부트 로더와 커널같은 중요한 소프트웨어는 첫 번째 파티션에 저장했다.

     

    : 504M 제한

    " 1993년 최악의 문제가 발생했다. ATA 스펙과 BIOS 스펙이 합쳐지면서, 주소 지정 가능한 바이트가 더 줄어들었다.

    ATA" 16 / 4 / 8
    BIOS" 10 / 8 / 6

    : 위에 내용은 각 스펙에서 주소 지정 가능한 비트를 써놨다. 저기서 각 대응하는 최소값들을 구하면, `10 / 4 / 6`이 된다. 이 값은, 504MB가 된다. 즉, 주소 지정 가능한 바이트가 504MB라는 뜻이다. 왜 이렇게 됬을까? BIOS 13h의 스펙은 사실 ATA 스펙을 전제로 한다. 즉, BIOS 13h 기능이 ATA 기능을 이용하는 것이기 때문에, BIOS에서 지정한 주소 지정 크기가 ATA 스펙보다 커질 수 가 없다. 그래서 BIOS와 ATA가 결합되면서 CHS 주소 지정 가능한 크기가 더 작아진 것 이다.     

     

    : EDIE & ATA-2

    " 앞에 문제 때문에, `EIDE & ATA-2`에서는 CHS 주소 지정에 더 많은 비트를 할당했다. 16비트에서 28비트로 확장했다. 65535개의 실린더(16비트), 16개의 헤드(4비트), 255개의 섹터(8비트)를 해서 128GB까지 지정할 수 있게 만들었다. 그러나, 이것 또한 현재에 1TB 디스크에 비하면 너무나 부족한 주소 지정이다.

     

    : Partition Alignment

    " DOS 같은 경우, BIOS와 MBR 파티션을 사용하던 초기 시절, 각 파티션들이 `Cylinder Boundary`로 정렬되도록 했다. 왜 ? 정렬을 하면 좋은점이 뭘까? 이 글을 참고하자.

    When using Advanced Format drives with legacy operating systems, it is important to realign the disk drive using software provided by the hard disk manufacturer. Disk realignment is necessary to avoid a performance degrading condition known as `cluster straddling` where a shifted partition causes filesystem clusters to span partial physical disk sectors.

    - 참고 : https://en.wikipedia.org/wiki/Advanced_Format

    '공학 > 컴퓨터구조' 카테고리의 다른 글

    [컴퓨터 구조] PCI 인터럽트  (0) 2023.08.08
    [컴퓨터구조][ARM] ARMv7 부트 코드  (0) 2023.08.07
    [컴퓨터 구조] Data Alignment  (0) 2023.08.07
    VGA 텍스트 모드  (1) 2023.08.05
    [컴퓨터구조] 파이프라인  (0) 2023.08.04
Designed by Tistory.