'OS공부'에 해당되는 글 1건

  1. 2010.03.23 :: OS 공부 1일차
OS개발 공부 2010. 3. 23. 08:46
부팅이 되는 과정을 이해해보자.

BIOS를 통하여 POST과정(여러가지 디바이스를 체킹하고 테스트하는 과정)을 거치고나면
비로소 부트가 시작된다고 할 수 있다.

이 때  부팅에 사용되는 코드가 적재될 위치를 파악해야 하는데 이는 IBM이 IBM-PC를 제조할 당시에 정의 해놓은 메모리 맵을 참조해야 알 수 있다. 아래가 메모리 맵이다.

IBM PC AT 호환기종의 메모리 맵핑

  • PCI 장치 혹은 PC에 장착하는 카드를 사용할 때, 각 장치가 메모리에 맵핑되는 상태를 설명합니다.
  • 0x00000000 - 0x0009ffff : RAM
  • 0x000a0000 - 0x000bffff : 비디오 카드 접근 영역
  • 0x000c0000 - 0x000c7fff : 비디오 BIOS
  • 0x000c8000 - 0x000dffff : 각종 카드의 ROM 영역
  • 0x000d0000 - 0x000dffff 영역은 대부분 비어 있다
  • 0x000e0000 - 0x000effff : 확장 BIOS
  • 0x000f0000 - 0x000fffff : BIOS
  • 0x00100000 - 0x00efffff : RAM
  • 0x00f00000 - 0x00ffffff : RAM 혹은 ISA 홀(BIOS의 설정에 의해서 결정될 수 있다)
    • 286의 경우는, 0x00fffff0로부터의 16바이트에 리셋트 점프 명령이 있을 수도 있다
  • 0x01000000 - 메모리의 끝 : RAM
  • 메모리의 끝 - 0xffffffef : PCI 장치등의 메모리 맵핑 I/O에 이용 가능한 영역
  • 0xfffffff0 - 0xffffffff : 386이후에서는 여기에 리셋트 점프 명령이 있다

 

소프트웨어에 따른 용도 구분

  • 0x00000000 - 0x000003ff : 리얼모드용 인터럽트 벡터
  • 물론 IDT를 변경하면 변경할 수 있지만 기본적으로는 이 주소가 사용된다
  • 0x00000300 - 0x000003ff는 BIOS용 스택
  • 0x00000400 - 0x000004ff : BIOS가 사용하는 영역
  • 0x00007c00 - 0x00007dff : 부트섹터가 로딩되는 주소
  • 0x0009fc00 - 0x0009ffff : ACPI 영역

    [출처] AT-MEMORYMAP|작성자 프레코프

    위의 글에 보면 여러가지 정보가 나와있는데, 위의 메모리 맵을 참조하여 액세스를 해야한다.
    바이오스 영역 및 디바이스 매핑 영역등이 있는데 혹시나 잘못 건드리게 된다면 시스템 패닉을 불러일으 킬 수 있으므로 주의해야한다.
    내가 지금 중점으로 보는 부분은 역

  • 0x00007c00 - 0x00007dff : 부트섹터가 로딩되는 주소

     이 부분이다.
     이 부분에 우리가 부팅에 사용할 코드가 적재되어야만 부트가 시작될 수 있다.
     좀 더 자세히 기술하자면 BIOS는 해당 장치의 부트영역으로부터 부트데이터를 로드하고, 그 로드된 데이터가 위의 메모리영역에 적재가되어야만 BIOS가 점프를 뛰어서 ( Program Counter의 개념을 이해해야 도움이된다.) 흔히 부트로더라고 불리우는 부분이 작동이 가능해 지는 것이다.

개발에 사용할 랭기지는 C언어와 어셈블리언어 이며, 어셈블러는 NASM을 사용할 계획이다.
MASM등 여러가지 어셈블러가 존재하지만 사용하는 책에서 NASM을 기준으로 설명하고 있고, 리눅스 등에서 작업할시에는 NASM이 유리하므로 NASM을 기준으로 작업을 시작할 것이다.

결국 오늘 공부한 내용을 한마디로 종합한다면 ORG 0x7c00을 통하여 이 프로그램이 적재될 메모리의 주소를 지정해 주어야 한다라는 점이다.

posted by Sense.J
: