7. 디스크에서 OS이미지 로딩

BIOS 서비스와 소프트웨어 인터럽트

  • BIOS는 우리가 일반적으로 많이 쓰는 라이브러리 파일과 달리 특별한 방법으로 외부에 제공한다.
  • 함수의 어드레스를 인터럽트 벡터 테이블(Interrupt Vector Table)에 넣어 두고, 소프트웨어 인터럽트(SWI, Software Interrupt)를 호출하는 방법을 사용한다.
  • 인터럽트 벡터 테이블(Interrupt Vector Table)
    • 메모리 어드레스 0에 있는 테이블로 특정 번호의 인터럽트가 발생했을 때 인터럽트를 처리하는 함수(인터럽트 핸들러, Interrupt Handler) 검색에 사용한다.
    • 테이블의 각항목은 인덱스에 해당하는 인터럽트가 발생했을 때 처리하는 함수 어드레스가 저장되어 있다.
    • 각 항목은 크기가 4바이트 이다.
    • 인터럽트는 최대 256개까지 설정할 수 있으므로 리얼모드의 인터럽트 벡터 크기는 최대 256*4 = 1024바이트가 된다.

  • 디스크 서비스를 사용하려면 위의 표에 나와있듯이 0x13 인터럽트를 발생시켜야 한다.
  • BIOS의 기능을 사용하려면 레지스터를 이용해 함수의 파라미터와 return값을 주고 받는다.
  • BIOS 서비스 마다 요구하는 파라미터의 수가 다르므로 서비스에 맞는 레지스터를 확인하고 사용 할 것

플로피 디스크의 내부구조

  • 헤드는 디스크의 표면을 의미
    • 헤드의 개수는 디스크 수 * 2
    • 플로피 디스크의 경우 디스크가 한장이므로 헤드의 개수는 2이다.
  • 트랙은 디스크를 여러 개의 동심원으로 나눴을 때 그 동심원 하나가 가지는 영역을 의미한다.
    • 플로피 디스크의 경우 80개
  • 섹터는 디스크를 구성하는 가장 작은 단위로 트랙을 여러 조각으로 자른 것을 의미
    • 플로피 디스크의 경우 18개
    • 섹터번호는 1부터 시작하므로 1~18의 값을 갖는다.
  • 플로피디스크의 모든 섹터를 순차적으로 읽는 알골리즘
    1. 섹터 = 1, 헤드 = 0, 트랙 = 0으로 설정
    2. 섹터를 1에서 18까지 증가시키면서 읽음
    3. 섹터 18번까지 다 읽었으면 0번 헤드를 다 읽었으므로 헤드 1증가
      A. 헤드 = 1, 섹터 = 1로 변경
    4. 섹터를 1에서 18까지 증가시키면서 읽음
    5. 섹터 18번까지 다 읽었으면 0번과 1번 헤드를 모두 다 읽었으므로, 트랙 1증가
      A. 트랙 = 1, 헤드 = 0, 섹터 = 1로 변경
    6. 2번에서 5번과정을 79번 트랙까지 반복

'Project > OS' 카테고리의 다른 글

9. 테스트를 위한 가상 os이미지 생성  (0) 2019.07.16
8. os 이미지 로딩 기능 구현  (0) 2019.07.16
6. Bootloader 만들기  (0) 2019.07.11
5. 부팅과 부트로더  (0) 2019.07.11
4. 운영모드와 메모리 관리기법  (0) 2019.07.11

+ Recent posts