'컴퓨터/만들면서 배우는 OS 커널의 구조와 원리'에 해당되는 글 2건
- 2007.02.10 1장 부트스트랩
- 2007.02.10 시작 하기 전에 준비 할것
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 를 넣어 둔다.
일단 예제 소스를 플로피 디스크에 넣은 후 실행화면은 아래와 같다.
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 를 넣어 둔다.
만들면서 배우는 OS 커널의 구조와 원리를 시작 한다. ^^/
플로피 드라이브가 있어야 되므로
일단 NASM을 다운로드 하자
주소는 http://sourceforge.net/projects/nasm 가서 다운로드 하자.
그 다음 NASM 의 환경 변수를 추가한다. NASM의 디렉토리를 window 환경변수에 추가한다.
그리고 Rawrite 툴을 다운로드 한다.
http://uranus.it.swin.edu.au/~jn/linux/rawwrite.htm
윈도우 바이너리 파일을 받아서 압축을 풀면 된다. 여기까지하면 준비 끝 ^^/
플로피 드라이브가 있어야 되므로
일단 NASM을 다운로드 하자
주소는 http://sourceforge.net/projects/nasm 가서 다운로드 하자.
그 다음 NASM 의 환경 변수를 추가한다. NASM의 디렉토리를 window 환경변수에 추가한다.
그리고 Rawrite 툴을 다운로드 한다.
http://uranus.it.swin.edu.au/~jn/linux/rawwrite.htm
윈도우 바이너리 파일을 받아서 압축을 풀면 된다. 여기까지하면 준비 끝 ^^/