부트스트랩 만들기
어셈 파일을 만들어 주기 위한 파일
플로피 디스켓, 또는 드라이버에 쓰기 위한 파일
boot.txt 파일을 만든다.
[org 0]
[bits 16]
jmp 0x07C0:start
start:
mov ax, cs -> cs에는 0x07C0이 들어있음
mov ds, ax -> ds를 cs와 같게 해준다.
mov ax, 0xB800 -> 비디오 메모리의 세그먼트를 es 레지스터에 넣는다.
mov es, ax
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' -> 비디오 메모리에 쓴다. 비디오 메모리는 2바이트이며 아스키코드 1바이트, 배
경 및 글자색 지정하는 1바이트
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 '.', 0x67 -> 배경색으로 사용할 데이터
times 510-($-$$) db 0 -> 여기서부터 509번지까지 0으로 채운다.
dw 0xAA55 -> 510번지에 0x55를, 511번지에 0xAA를 채워준다. -> Magic Number라고 부름
위와 같이 소스를 짠다.
그 후 아래와 같이 컴파일 한다.
nasm -f bin -o test.img boot.txt
-f bin 옵션은 제작할 실행 파일이 exe나 com등의 일반 DOS 실행파일이 아닌 바이너리 실행 파일이라는 것을 어셈블러에게 알려줌
vmware 내 플로피디스크 드라이버를 추가한다. 추가 후 img 파일 적용 후 부팅 시 아래 그림과 같이 적용된다.
부팅 시 아래 그림과 같이 적용되는것을 확인할 수 있다.
부트스트랩 만들기 및 적용 성공
'OS 커널의 구조와 원리' 카테고리의 다른 글
4장 : 인터럽트와 예외 - 3(키보드 인터럽트 핸들러 구현) (0) | 2015.05.06 |
---|---|
4장 : 인터럽트와 예외 - 2(하드웨어 인터럽트) (0) | 2015.05.06 |
4장 : 인터럽트와 예외 - 1 (0) | 2015.05.04 |
3장 : Protected Mode로 변환 (0) | 2015.05.04 |
2장 : 커널 로드 (0) | 2015.04.29 |