'컴퓨터/만들면서 배우는 OS 커널의 구조와 원리'에 해당되는 글 2건

  1. 2007.02.10 1장 부트스트랩
  2. 2007.02.10 시작 하기 전에 준비 할것

1장 부트스트랩

|
1장은 가장 먼저 컴퓨터를 부팅 시키는 역할을 하는 코드이다. 시스템의 메모리 맵이나 동작 모드등을 설명하고 가장 심플한 부팅 코드를 작성한다.

일단 예제 소스를 플로피 디스크에 넣은 후 실행화면은 아래와 같다.

사용자 삽입 이미지

i386 PC를 부팅시켜서 다음과 같은 그림을 출력하는 소스를 설명하고 소스를 컴파일 하는 방법 실행 하는 방법등을 설명한다.

그중 알아 둬야 하는 개념으로는 Real mode 와 Protected mode가 있다. 책에서의 설명으로는 dos에서 사용했던 방법을 Real mode, windows나 요즘 나오는 OS의 방식이 protectd mode 라고 하고 있다. 선점과 비선점과 같은 의미로 사용한 것 같다. 하지만 선점, 비선점과 다른 차이점이 있는지는 확실하지 않은 듯하다. 그리고 알아둬야 할 점은 세그먼트와 오프셋. 정상적으로 컴퓨터 시스템을 공부했다면 알만한 용어이므로 패스 하도록 한다. ^^

그 다음 1장에서는 위에서 출력 소스를 설명하는 것으로 구성된다. 책에서 간단하게 NASM에 대한 간단한 정리가 있었으면 도움이 될 듯 하다.

아래는 위의 화면을 출력하는 예제

[org 0]
[bits 16]
    jmp 0x07C0:start        ;far jmp 를 한다.

start:
    mov ax, cs            ;cs 에는 0x07C0 이 들어 있다.
    mov ds, ax             ;ds 를 cs 와 같게 해준다.

        mov ax, 0xB800            ;비디오 메모리의 세그먼트를
    mov es, ax            ;es 레지스터에 넣는다.
    mov di, 0        ;제일 윗 줄의 처음에 쓸 것이다.
    mov ax, word [msgBack]     ;써야 할 데이터의 주소값을 지정한다.
    mov cx, 0x7FF           ;화면 전체에 쓰기 위해서는
                    ;0x7FF(10진수 2047)개의 WORD 가 필요하다.
paint:
    mov word [es:di], ax    ;비디오 메모리에 쓴다.
    add di,2        ;한 WORD를 썼으므로, 2를 더한다.
    dec cx                ;한 WORD를 썼으므로, CX 의 값을 하나 줄인다.
    jnz paint           ;CX 가 0이 아니면, paint로 점프하여
                   ;나머지를 더 쓴다.


    mov edi, 0        ;제일 윗 줄의 처음에 쓸 것이다.
    mov byte [es:edi], 'A'  ;비디오 메모리에 쓴다.
    inc edi            ;한 개의 BYTE를 썼으므로 1을 더한다.
    mov byte [es:edi], 0x06 ;배경색을 쓴다.
    inc edi            ;한 개의 BYTE를 썼으므로 1을 더한다.
    mov byte [es:edi], 'B'
    inc edi
    mov byte [es:edi], 0x06
    inc edi
    mov byte [es:edi], 'C'
    inc edi
    mov byte [es:edi], 0x06
    inc edi
    mov byte [es:edi], '1'
    inc edi
    mov byte [es:edi], 0x06
    inc edi
    mov byte [es:edi], '2'
    inc edi
    mov byte [es:edi], 0x06
    inc edi
    mov byte [es:edi], '3'
    inc edi
    mov byte [es:edi], 0x06

    jmp $            ;이 번지에서 무한루프를 돈다.

msgBack db '.', 0xE7        ;배경색으로 사용할 데이터

times 510-($-$$) db 0        ;여기서 부터, 509 번지까지 0 으로 채운다.
         dw 0xAA55    ;510 번지에 0xAA 를, 511 번지에 0x55 를 넣어 둔다.

And

시작 하기 전에 준비 할것

|
만들면서 배우는 OS 커널의 구조와 원리를 시작 한다. ^^/

플로피 드라이브가 있어야 되므로

일단 NASM을 다운로드 하자

주소는 http://sourceforge.net/projects/nasm 가서 다운로드 하자.

그 다음 NASM 의 환경 변수를 추가한다. NASM의 디렉토리를 window 환경변수에 추가한다.

그리고 Rawrite 툴을 다운로드 한다.

http://uranus.it.swin.edu.au/~jn/linux/rawwrite.htm

윈도우 바이너리 파일을 받아서 압축을 풀면 된다. 여기까지하면 준비 끝 ^^/
And
prev | 1 | next