qemu : 다른 emulator
http://fabrice.bellard.free.fr/qemu/download.html
http://www.psyon.org/bochs-win32/
http://www.apcmag.com/apc/v3.nsf/0/A7A69A11C4F5D613CA256E6F0011A248
=====================================================
제목 : IBM Compatible PC Emulator 사용법 (Bochs)
작성자 : edward_frswz
작성일자 : 2002. 12. 16
분석 : edward frswz
분석버젼 : ver 0.0.1
라이센스 : GPL
홈페이지 : http://osx86.codesum.org
=====================================================
가상머신 bochs 사용법
=======================================================
- 준비물
i386+ Compatible PC
Win32 Operating System
Bochs Emulator
NASM (Win32 Version)
틀린 내용이나 이상한 내용은 바로 메일로 씹어주세요.
제가 검증 후 바로 고쳐서 업데이트 하겠습니다.
email : osx86@codesum.org
=======================================================
0. 소개
OS 개발이나 분석을 위해서 꼭 필요한 것들중에 하나인
VM 을 소개하고자 합니다.
VM 에는 Bochs(옛 Plex86), Virtual PC, vmware 같은 것들이 있죠.
테스트용으로 쓰기엔 제가 써본것들중 Bochs 가 젤 빠르고
편한듯합니다. 설정은 가장 어렵지만 ...
세부설정이 가능한 점이 참 좋은것 같습니다.
Bochs 의 역할은 PC 안에 하나의 PC 처럼 BIOS 와 각종 장치들을
가상으로 동작할수 있게 해줍니다.
이 문서의 끝부분에서 BOCHS 로 간단한 어셈블리 프로그램을
부팅해서 동작하는것을 해보도록 하겠습니다.
1. 다운로드 및 설치
다운로드와 설치는 너무 간단해서 설명할것이 별로 없을것 같네요.
우선 제 홈페이지나 bochs 홈페이지에서 다운로드를 하세요.
OSx86 홈페이지 (http://osx86.codesum.org/data/vm/bochs-2p4.exe)
Bochs 홈페이지 (http://bochs.sf.net)
그리고 설치는 바이너리를 실행하시면 됩니다.
이 문서에서 설치 경로는 C:\bochs2p4 로 하겠습니다.
설치하실때 체크하는건 원하시는데로 해주시면 됩니다.
2. bochs의 설정
우선 가상머신을 사용하기 전에 장치에 대해서 설정을 해주어야 합니다.
설정파일은 bochs2p4\bochsrc-sample.txt 파일입니다.
에디터 창에 파일을 열어보시면 ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# You many now use double quotes around pathnames, in case
# your pathname includes spaces.
#=======================================================================
# CONFIG_INTERFACE
#
# The configuration interface is a series of menus or dialog boxes that
# allows you to change all the settings that control Bochs's behavior.
# There are two choices of configuration interface: a text mode version
# called "textconfig" and a graphical version called "wx". The text
# mode version uses stdin/stdout and is always compiled in. The graphical
# version is only available when you use "--with-wx" on the configure
# command. If you do not write a config_interface line, Bochs will
# choose a default for you.
.......................................
(중략)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
다음과 같은 내용이 나옵니다 거기서 부터 시작하죠 ...
우선 bochsrc-sample.txt 파일을 복사해서 bochsrc.txt 라는 이름의 파일을
하나 만듭니다. 그리고 bochsrc.txt 파일을 열고 젤 위에서 부터 설정하겠습니다.
# CONFIG_INTERFACE
================================
#config_interface: textconfig
#config_interface: wx
================================
이 옵션은 컨피그 모드를 정하는 것입니다.
textconfig 는 텍스트 모드를 통해서 설정을 하게 되고,
wx 는 그래픽 모드를 통해서 설정할수 있습니다. bochs 사용과는 아무런
상관이 없으므로 그냥 놔두고 내려갑니다.
# DISPLAY_LIBRARY
================================
#display_library: amigaos
#display_library: beos
#display_library: carbon
#display_library: macintosh
#display_library: nogui
#display_library: rfb
#display_library: sdl
#display_library: term
#display_library: win32
#display_library: wx
#display_library: x
================================
디스플레이 옵션입니다. 이 부분도 크게 설정할 필요가 없겠군요.
보크스가 디폴트 설정을 해줍니다.
# ROMIMAGE
=============================================================
#romimage: bios/BIOS-bochs-970717a
romimage: file=bios/BIOS-bochs-latest, address=0xf0000
#romimage: file=bios/BIOS-bochs-2-processors, address=0xf0000
#romimage: file=bios/BIOS-bochs-4-processors, address=0xf0000
#romimage: file=bios/rombios.bin, address=0xf0000
=============================================================
사용할 롬 바이오스를 선택합니다. 여기서 기존 세팅으로 그냥 쓰셔도
되구요. 프로세서가 2개 혹은 4개짜리 인경우
2-processors 혹은 4-processors 를 사용하시면 되구요.
(Caution : 저 바이오스들은 bochs2p4에 그냥 풀어져 있을겁니다.
저위에 나열된 파일들을 bochs2p4\ 디렉토리 밑에 bios 라는 폴더를
만들어주시고, 그쪽으로 옮겨주세요.)
# MEGS
================================
#megs: 256
#megs: 128
#megs: 64
megs: 32
#megs: 16
#megs: 8
================================
bochs 로 돌릴 운영체제의 메모리를 설정합니다.
이것도 원하는 만큼 메모리가 허용하는대로 주세요.
# OPTROMIMAGE[1-4]
=======================================================
#optromimage1: file=optionalrom.bin, address=0xd0000
#optromimage2: file=optionalrom.bin, address=0xd1000
#optromimage3: file=optionalrom.bin, address=0xd2000
#optromimage4: file=optionalrom.bin, address=0xd3000
=======================================================
추가 ROMIMAGE 입니다.
저도 설정안하고 잘 씁니다. ^^; 필요하신분은 로드해서 쓰세요.
# VGAROMIMAGE
=======================================
#vgaromimage: bios/VGABIOS-lgpl-latest
vgaromimage: bios/VGABIOS-elpin-2.40
=======================================
원하는 VGABIOS 를 선택합니다. 기본 설정으로 해도 무난하죠.
C0000 영역에 로드됩니다.
(Caution : 위의 바이오스와 마찬가지로... bochs2p4\bios 로
위의 파일들을 다 옮겨주세요.)
# FLOPPYA
=============================================
floppya: 1_44=/dev/fd0, status=inserted
#floppya: file=../1.44, status=inserted
#floppya: 1_44=/dev/fd0H1440, status=inserted
#floppya: 1_2=../1_2, status=inserted
#floppya: 1_44=a:, status=inserted
#floppya: 1_44=a.img, status=inserted
=============================================
Floppy A: 를 설정하는 곳입니다. 우선 크기는 1_44
로 사용하시면 되구요. 맨 밑의 설정을 선택해주시면 되겠네요.
다음의 예를 보죠.
#floppya: 1_44=a.img, status=inserted
우선 주석처리된 #을 지우시고, 1_44는 디스크의 크기를 말합니다.
a.img 는 디스크로 쓸 이미지 파일명입니다. 나중에 우리가 쓸
디스크 이미지 입니다. 저는 ed.img 로 해뒀죠.
status=inserted 는 보크스 머신이 시작할때 삽입해두겠다는 소리입니다.
eject도 있는데 eject 는 빼두겠다는 소리구요.
결론적으로 다음과 같이 했겠죠.
floppya: 1_44=ed.img, status=inserted
# FLOPPYB
=====================================
#floppyb: 1_44=b:, status=inserted
floppyb: 1_44=b.img, status=inserted
=====================================
Floopy B: 를 사용하기 위해 설정하는 것이지요.
저는 안쓰려고 두번째 라인을 주석처리 했습니다.
#floppyb: 1_44=b.img, status=inserted
이렇게요...
# ATA0, ATA1, ATA2, ATA3
=======================================================
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata1: enabled=0, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e8, irq=11
ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x368, irq=9
=======================================================
HDD 나 CDROM 을 위한 ATA 컨트롤러를 설정합니다.
사용할것만 enable 상태를 1로 만들어 줍니다.
# ATA[0-3]-MASTER, ATA[0-3]-SLAVE
==========================================================================
ata0-master: type=disk, path="30M.sample", cylinders=615, heads=6, spt=17
#ata0-slave: type=cdrom, path=D:, status=inserted
#ata0-slave: type=cdrom, path=/dev/cdrom, status=inserted
==========================================================================
여기서는 bximage 라는 프로그램을 사용합니다.
물론 bochs 설치시 자동 설치되는 프로그램이죠.
ata0-master: type=disk, path="30M.sample", cylinders=615, heads=6, spt=17
여기서 type 은 디스크인지 cdrom 인지를 설정하게 되구요.
path는 기본을 bochs2p4로 되어있습니다. 따라서 파일명만
설정해주시면 됩니다.
30M.sample 이걸 hdd0.img 로 해주시고, bximage 로 hdd0.img 파일을
만들어주면 됩니다.
그럼 여기서 bximage 를 사용해볼까요 ?
c:\bochs2p4\bximage
========================================================================
bximage
Disk Image Creation Tool for Bochs
$Id: bximage.c,v 1.17 2002/11/26 11:21:31 cbothamy Exp $
========================================================================
Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd]
여기서 물어보는건 이미지를 만들때 floppy 이미지를 만들꺼냐
hard disk 이미지를 만들꺼냐구 물어보는겁니다.
우리는 hdd0.img 즉 hard disk 이미지를 만들꺼니까
hd 를 입력해주시던지 아니면 기본 설정이 [hd] 로 되어있으니까
그냥 엔터를 입력해주시면 됩니다.
그럼 다음 화면을 볼까요 ?
Enter the hard disk size in megabytes, between 1 and 32255
[10]
이 내용은 하드디스크 크기를 얼마로 잡을꺼냐고 물어보는겁니다.
우리가 작성하게될 OS 가 얼마나 커질까요. 대충
30메가 정도로 잡아봅시다.
30 을 입력하시고 엔터키를 눌러주세요.
I will create a hard disk image with
cyl=60
heads=16
sectors per track=63
total sectors=60480
total size=29.53 megabytes
이렇게 나오죠...
이 정보를 위의 ata0-master 와 다음과 같이 맞춰주세요.
ata0-master: type=disk, path="hdd0.img", cylinders=60, heads=16, spt=63
What should I name the image?
[c.img]
이미지 이름을 물어보는거죠. hdd0.img 라고 입력하시고
엔터키를 눌러주세요. 그러면 다음과 같은 화면이 나옵니다.
Writing: [] Done.
I wrote 30965760 bytes to (null).
The following line should appear in your bochsrc:
ata0-master: type=disk, path="hdd0.img", cylinders=60, heads=16, spt=63
이제 이미지가 완성되었으니 bochs2p4\ 폴더로 가보시면
hdd0.img 라는 30메가 짜리 이미지가 완성되어 있습니다.
# DISKC: file=, cyl=, heads=, spt=
====================================================
#diskc: file="30M.sample", cyl=615, heads=6, spt=17
====================================================
이 옵션은 deprecated 되었습니다. 그냥 넘어가세요.
# DISKD
====================================================
#diskd: file="diskd.img", cyl=615, heads=6, spt=17
====================================================
이 옵션도 마찬가지구요.
# CDROMD
===========================================
#cdromd: dev=D:, status=inserted
#cdromd: dev=/dev/cdrom, status=inserted
===========================================
이옵션도 마찬가지임다. 그냥 넘어가세요
# NEWHARDDRIVESUPPORT: enabled=[0|1]
====================================
#newharddrivesupport: enabled=1
====================================
넘어가세요 ...
# BOOT
================================
#boot: floppy
boot: disk
================================
어느것으로 부팅할것인지 물어보는겁니다.
그냥 floppy 로 설정하죠.
boot: floppy
# FLOPPY_BOOTSIG_CHECK: disabled=[0|1]
======================================
#floppy_bootsig_check: disabled=1
floppy_bootsig_check: disabled=0
======================================
boot 옵션에서 설정한 부트 시그너쳐를 체크하는 부분입니다.
부트섹터의 끝부분에 0xaa55 코드를 체크안하겠냐고 물어보는거죠.
그냥 놔두시면 됩니다. 그럼 체크할껄요.
# LOG:
================================
#log: /dev/null
log: bochsout.txt
================================
보크스 실행시 로그를 남기는 겁니다 걍 놔두세요.
아래쪽은 별로 설정할 필요없습니다. 이정도면 충분하죠.
이제 bochsrc.txt 파일을 저장해주세요.
3. bochs의 실행
bochs 를 기본적으로 실행하게되면 config 파일도 로드해야되고,
그리고 실행해야 되므로 상당히 귀찮습니다.
스크립트를 하나 만들어서 해결하도록 하죠.
c:\bochs2p4\copy con bs.bat
@echo off
bochs -qf bochsrc.txt^Z
1개 파일이 복사되었습니다.
끝부분에 ^Z는 F6 펑션키 입력하시면 됩니다.
이제 스크립트가 완성되었군요.
c:\bochs2p4\bs 를 실행해주시면 다음과 같이 bochs가 실행되는
모습을 볼수가 있습니다.
4. boot sector 프로그램 작성
우려먹기 식이 되어서 죄송합니다만 ...
Boot Sector 예제 1번 코드(레지스터 정보출력)를 사용하도록 하겠습니다.
우선 다음 프로그램을 작성해주세요.
#source : boot.asm
================================================================
[org 0h]
; 캐리지 리턴과 라인피드(?) 매크로
; bios 인터럽트 10h 는 화면 출력과 관계된 겁니다.
%macro CRLF 0
mov ax, 0E0Dh
xor bx, bx
int 10h
mov al, 0Ah
int 10h
%endmacro
; 출력 매크로
%macro PRINT 1
pop dx
mov di, %1
call printreg
mov ax, 0E20h
xor bx, bx
int 10h
%endmacro
; 레지스터들을 스택에 열라게 집어 넣죠
EntryPoint:
push sp
push ss
call NextLine ; IP+5 on the stack
NextLine:
push cs
push es
push ds
push bp
push di
push si
push dx
push cx
push bx
push ax
; 레지스터값을 세팅해두고, 음 잘은 모르겠지만
; 화면좌표를 셋업하는 작업이겠죠.
; 자세한 bios int 10h 레지스터 값에 대한 설명은
; 어셈블러 책을 참조해주세요.
mov ax, 1301h
mov bx, 0007h
mov cx, 23
mov dh, 10
mov dl, 1
push cs
pop es
mov bp, String
int 10h
CRLF
CRLF
; 모든 레지스터 값을 macro를 이용해서 출력하는군요.
PRINT _AX
PRINT _BX
PRINT _CX
PRINT _DX
CRLF
PRINT _SI
PRINT _DI
PRINT _BP
CRLF
PRINT _DS
PRINT _ES
CRLF
PRINT _CS
; 조위에 NextLine call 할때 IP+5작업을 한거보이시죠.
; sub ax,5 는 IP 값 출력하기 전에
; 그대로 출력하면 엉뚱한 값이 나오기에 수정하는거겠죠.
pop ax
sub ax, 5
push ax
PRINT _IP
PRINT _SS
PRINT _SP
CRLF
; 비프음 출력
mov ax, 0E07h
int 10h
; 아무것도 안합니다. 그냥 -_- 잡질이죠.
hang:
jmp hang
; DS:DI에 의해 포인트 되고 있는 DX 의 16bit hexadecimal 숫자를
3 문자스트링으로 출력하기 위한 약간 난잡한 프로시져
printreg:
mov ah, 0Eh
xor bx, bx
mov al, byte[di]
int 10h
mov al, byte[di+1]
int 10h
mov al, byte[di+2]
int 10h
xchg dl, dh
rol dl, 4
rol dh, 4
xor bx, bx
mov ah, 0Eh
mov cx, 4
ploop:
mov al, dl
and al, 0Fh
shr dx, 4
add al, '0'
cmp al, '9'
jbe nochange
add al, 'A' - '9'-1
nochange:
int 10h
loop ploop
ret
; Data Section
String equ $ + 7C00h
db "initial register values"
_AX equ $ + 7C00h
db "AX="
_BX equ $ + 7C00h
db "BX="
_CX equ $ + 7C00h
db "CX="
_DX equ $ + 7C00h
db "DX="
_SI equ $ + 7C00h
db "SI="
_DI equ $ + 7C00h
db "DI="
_BP equ $ + 7C00h
db "BP="
_SP equ $ + 7C00h
db "SP="
_IP equ $ + 7C00h
db "IP="
_CS equ $ + 7C00h
db "CS="
_DS equ $ + 7C00h
db "DS="
_ES equ $ + 7C00h
db "ES="
_SS equ $ + 7C00h
db "SS="
; 이 코드의 5번째 라인으로 올라가보세요.
; org 0h 보이시죠.
; 여기서 org 510 은 첫번째 섹터 512byte중에
; 510번째 byte부터 아래 데이터를 0AA55h 를
; 삽입하겠다는 의미입니다.
times 510-($-$$) db 0
dw 0AA55h
================================================================
그리고 나서 다음과 같이 어셈블 작업을 거칩니다.
#assemble
[example]
=== nasm -o [bochs에서 설정한 floppyA 의 이미지이름] boot.asm ===
저의 경우는 다음과 같이 하겠죠.
nasm -o ed.img boot.asm
이렇게 해주신후 bochs 를 실행 하시면 ... ^^;
부팅시 ed.img 라는 floppyA 의 이미지 파일을 읽게되고,
자동적으로 위 프로그램이 실행되겠죠.
이런식으로 차츰차츰 접근해가면 될거예요. 한걸음씩 한걸음씩 말예요...
ps. 혹시라도 lkdp 에 참여하시고 싶은 분이 계시면 ...
같이 외국애들하고 같이 작업해보고 싶네요. 관심있으시면
제게 메일주세요 ^^;
http://fabrice.bellard.free.fr/qemu/download.html
http://www.psyon.org/bochs-win32/
http://www.apcmag.com/apc/v3.nsf/0/A7A69A11C4F5D613CA256E6F0011A248
=====================================================
제목 : IBM Compatible PC Emulator 사용법 (Bochs)
작성자 : edward_frswz
작성일자 : 2002. 12. 16
분석 : edward frswz
분석버젼 : ver 0.0.1
라이센스 : GPL
홈페이지 : http://osx86.codesum.org
=====================================================
가상머신 bochs 사용법
=======================================================
- 준비물
i386+ Compatible PC
Win32 Operating System
Bochs Emulator
NASM (Win32 Version)
틀린 내용이나 이상한 내용은 바로 메일로 씹어주세요.
제가 검증 후 바로 고쳐서 업데이트 하겠습니다.
email : osx86@codesum.org
=======================================================
0. 소개
OS 개발이나 분석을 위해서 꼭 필요한 것들중에 하나인
VM 을 소개하고자 합니다.
VM 에는 Bochs(옛 Plex86), Virtual PC, vmware 같은 것들이 있죠.
테스트용으로 쓰기엔 제가 써본것들중 Bochs 가 젤 빠르고
편한듯합니다. 설정은 가장 어렵지만 ...
세부설정이 가능한 점이 참 좋은것 같습니다.
Bochs 의 역할은 PC 안에 하나의 PC 처럼 BIOS 와 각종 장치들을
가상으로 동작할수 있게 해줍니다.
이 문서의 끝부분에서 BOCHS 로 간단한 어셈블리 프로그램을
부팅해서 동작하는것을 해보도록 하겠습니다.
1. 다운로드 및 설치
다운로드와 설치는 너무 간단해서 설명할것이 별로 없을것 같네요.
우선 제 홈페이지나 bochs 홈페이지에서 다운로드를 하세요.
OSx86 홈페이지 (http://osx86.codesum.org/data/vm/bochs-2p4.exe)
Bochs 홈페이지 (http://bochs.sf.net)
그리고 설치는 바이너리를 실행하시면 됩니다.
이 문서에서 설치 경로는 C:\bochs2p4 로 하겠습니다.
설치하실때 체크하는건 원하시는데로 해주시면 됩니다.
2. bochs의 설정
우선 가상머신을 사용하기 전에 장치에 대해서 설정을 해주어야 합니다.
설정파일은 bochs2p4\bochsrc-sample.txt 파일입니다.
에디터 창에 파일을 열어보시면 ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# You many now use double quotes around pathnames, in case
# your pathname includes spaces.
#=======================================================================
# CONFIG_INTERFACE
#
# The configuration interface is a series of menus or dialog boxes that
# allows you to change all the settings that control Bochs's behavior.
# There are two choices of configuration interface: a text mode version
# called "textconfig" and a graphical version called "wx". The text
# mode version uses stdin/stdout and is always compiled in. The graphical
# version is only available when you use "--with-wx" on the configure
# command. If you do not write a config_interface line, Bochs will
# choose a default for you.
.......................................
(중략)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
다음과 같은 내용이 나옵니다 거기서 부터 시작하죠 ...
우선 bochsrc-sample.txt 파일을 복사해서 bochsrc.txt 라는 이름의 파일을
하나 만듭니다. 그리고 bochsrc.txt 파일을 열고 젤 위에서 부터 설정하겠습니다.
# CONFIG_INTERFACE
================================
#config_interface: textconfig
#config_interface: wx
================================
이 옵션은 컨피그 모드를 정하는 것입니다.
textconfig 는 텍스트 모드를 통해서 설정을 하게 되고,
wx 는 그래픽 모드를 통해서 설정할수 있습니다. bochs 사용과는 아무런
상관이 없으므로 그냥 놔두고 내려갑니다.
# DISPLAY_LIBRARY
================================
#display_library: amigaos
#display_library: beos
#display_library: carbon
#display_library: macintosh
#display_library: nogui
#display_library: rfb
#display_library: sdl
#display_library: term
#display_library: win32
#display_library: wx
#display_library: x
================================
디스플레이 옵션입니다. 이 부분도 크게 설정할 필요가 없겠군요.
보크스가 디폴트 설정을 해줍니다.
# ROMIMAGE
=============================================================
#romimage: bios/BIOS-bochs-970717a
romimage: file=bios/BIOS-bochs-latest, address=0xf0000
#romimage: file=bios/BIOS-bochs-2-processors, address=0xf0000
#romimage: file=bios/BIOS-bochs-4-processors, address=0xf0000
#romimage: file=bios/rombios.bin, address=0xf0000
=============================================================
사용할 롬 바이오스를 선택합니다. 여기서 기존 세팅으로 그냥 쓰셔도
되구요. 프로세서가 2개 혹은 4개짜리 인경우
2-processors 혹은 4-processors 를 사용하시면 되구요.
(Caution : 저 바이오스들은 bochs2p4에 그냥 풀어져 있을겁니다.
저위에 나열된 파일들을 bochs2p4\ 디렉토리 밑에 bios 라는 폴더를
만들어주시고, 그쪽으로 옮겨주세요.)
# MEGS
================================
#megs: 256
#megs: 128
#megs: 64
megs: 32
#megs: 16
#megs: 8
================================
bochs 로 돌릴 운영체제의 메모리를 설정합니다.
이것도 원하는 만큼 메모리가 허용하는대로 주세요.
# OPTROMIMAGE[1-4]
=======================================================
#optromimage1: file=optionalrom.bin, address=0xd0000
#optromimage2: file=optionalrom.bin, address=0xd1000
#optromimage3: file=optionalrom.bin, address=0xd2000
#optromimage4: file=optionalrom.bin, address=0xd3000
=======================================================
추가 ROMIMAGE 입니다.
저도 설정안하고 잘 씁니다. ^^; 필요하신분은 로드해서 쓰세요.
# VGAROMIMAGE
=======================================
#vgaromimage: bios/VGABIOS-lgpl-latest
vgaromimage: bios/VGABIOS-elpin-2.40
=======================================
원하는 VGABIOS 를 선택합니다. 기본 설정으로 해도 무난하죠.
C0000 영역에 로드됩니다.
(Caution : 위의 바이오스와 마찬가지로... bochs2p4\bios 로
위의 파일들을 다 옮겨주세요.)
# FLOPPYA
=============================================
floppya: 1_44=/dev/fd0, status=inserted
#floppya: file=../1.44, status=inserted
#floppya: 1_44=/dev/fd0H1440, status=inserted
#floppya: 1_2=../1_2, status=inserted
#floppya: 1_44=a:, status=inserted
#floppya: 1_44=a.img, status=inserted
=============================================
Floppy A: 를 설정하는 곳입니다. 우선 크기는 1_44
로 사용하시면 되구요. 맨 밑의 설정을 선택해주시면 되겠네요.
다음의 예를 보죠.
#floppya: 1_44=a.img, status=inserted
우선 주석처리된 #을 지우시고, 1_44는 디스크의 크기를 말합니다.
a.img 는 디스크로 쓸 이미지 파일명입니다. 나중에 우리가 쓸
디스크 이미지 입니다. 저는 ed.img 로 해뒀죠.
status=inserted 는 보크스 머신이 시작할때 삽입해두겠다는 소리입니다.
eject도 있는데 eject 는 빼두겠다는 소리구요.
결론적으로 다음과 같이 했겠죠.
floppya: 1_44=ed.img, status=inserted
# FLOPPYB
=====================================
#floppyb: 1_44=b:, status=inserted
floppyb: 1_44=b.img, status=inserted
=====================================
Floopy B: 를 사용하기 위해 설정하는 것이지요.
저는 안쓰려고 두번째 라인을 주석처리 했습니다.
#floppyb: 1_44=b.img, status=inserted
이렇게요...
# ATA0, ATA1, ATA2, ATA3
=======================================================
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata1: enabled=0, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e8, irq=11
ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x368, irq=9
=======================================================
HDD 나 CDROM 을 위한 ATA 컨트롤러를 설정합니다.
사용할것만 enable 상태를 1로 만들어 줍니다.
# ATA[0-3]-MASTER, ATA[0-3]-SLAVE
==========================================================================
ata0-master: type=disk, path="30M.sample", cylinders=615, heads=6, spt=17
#ata0-slave: type=cdrom, path=D:, status=inserted
#ata0-slave: type=cdrom, path=/dev/cdrom, status=inserted
==========================================================================
여기서는 bximage 라는 프로그램을 사용합니다.
물론 bochs 설치시 자동 설치되는 프로그램이죠.
ata0-master: type=disk, path="30M.sample", cylinders=615, heads=6, spt=17
여기서 type 은 디스크인지 cdrom 인지를 설정하게 되구요.
path는 기본을 bochs2p4로 되어있습니다. 따라서 파일명만
설정해주시면 됩니다.
30M.sample 이걸 hdd0.img 로 해주시고, bximage 로 hdd0.img 파일을
만들어주면 됩니다.
그럼 여기서 bximage 를 사용해볼까요 ?
c:\bochs2p4\bximage
========================================================================
bximage
Disk Image Creation Tool for Bochs
$Id: bximage.c,v 1.17 2002/11/26 11:21:31 cbothamy Exp $
========================================================================
Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd]
여기서 물어보는건 이미지를 만들때 floppy 이미지를 만들꺼냐
hard disk 이미지를 만들꺼냐구 물어보는겁니다.
우리는 hdd0.img 즉 hard disk 이미지를 만들꺼니까
hd 를 입력해주시던지 아니면 기본 설정이 [hd] 로 되어있으니까
그냥 엔터를 입력해주시면 됩니다.
그럼 다음 화면을 볼까요 ?
Enter the hard disk size in megabytes, between 1 and 32255
[10]
이 내용은 하드디스크 크기를 얼마로 잡을꺼냐고 물어보는겁니다.
우리가 작성하게될 OS 가 얼마나 커질까요. 대충
30메가 정도로 잡아봅시다.
30 을 입력하시고 엔터키를 눌러주세요.
I will create a hard disk image with
cyl=60
heads=16
sectors per track=63
total sectors=60480
total size=29.53 megabytes
이렇게 나오죠...
이 정보를 위의 ata0-master 와 다음과 같이 맞춰주세요.
ata0-master: type=disk, path="hdd0.img", cylinders=60, heads=16, spt=63
What should I name the image?
[c.img]
이미지 이름을 물어보는거죠. hdd0.img 라고 입력하시고
엔터키를 눌러주세요. 그러면 다음과 같은 화면이 나옵니다.
Writing: [] Done.
I wrote 30965760 bytes to (null).
The following line should appear in your bochsrc:
ata0-master: type=disk, path="hdd0.img", cylinders=60, heads=16, spt=63
이제 이미지가 완성되었으니 bochs2p4\ 폴더로 가보시면
hdd0.img 라는 30메가 짜리 이미지가 완성되어 있습니다.
# DISKC: file=, cyl=, heads=, spt=
====================================================
#diskc: file="30M.sample", cyl=615, heads=6, spt=17
====================================================
이 옵션은 deprecated 되었습니다. 그냥 넘어가세요.
# DISKD
====================================================
#diskd: file="diskd.img", cyl=615, heads=6, spt=17
====================================================
이 옵션도 마찬가지구요.
# CDROMD
===========================================
#cdromd: dev=D:, status=inserted
#cdromd: dev=/dev/cdrom, status=inserted
===========================================
이옵션도 마찬가지임다. 그냥 넘어가세요
# NEWHARDDRIVESUPPORT: enabled=[0|1]
====================================
#newharddrivesupport: enabled=1
====================================
넘어가세요 ...
# BOOT
================================
#boot: floppy
boot: disk
================================
어느것으로 부팅할것인지 물어보는겁니다.
그냥 floppy 로 설정하죠.
boot: floppy
# FLOPPY_BOOTSIG_CHECK: disabled=[0|1]
======================================
#floppy_bootsig_check: disabled=1
floppy_bootsig_check: disabled=0
======================================
boot 옵션에서 설정한 부트 시그너쳐를 체크하는 부분입니다.
부트섹터의 끝부분에 0xaa55 코드를 체크안하겠냐고 물어보는거죠.
그냥 놔두시면 됩니다. 그럼 체크할껄요.
# LOG:
================================
#log: /dev/null
log: bochsout.txt
================================
보크스 실행시 로그를 남기는 겁니다 걍 놔두세요.
아래쪽은 별로 설정할 필요없습니다. 이정도면 충분하죠.
이제 bochsrc.txt 파일을 저장해주세요.
3. bochs의 실행
bochs 를 기본적으로 실행하게되면 config 파일도 로드해야되고,
그리고 실행해야 되므로 상당히 귀찮습니다.
스크립트를 하나 만들어서 해결하도록 하죠.
c:\bochs2p4\copy con bs.bat
@echo off
bochs -qf bochsrc.txt^Z
1개 파일이 복사되었습니다.
끝부분에 ^Z는 F6 펑션키 입력하시면 됩니다.
이제 스크립트가 완성되었군요.
c:\bochs2p4\bs 를 실행해주시면 다음과 같이 bochs가 실행되는
모습을 볼수가 있습니다.
4. boot sector 프로그램 작성
우려먹기 식이 되어서 죄송합니다만 ...
Boot Sector 예제 1번 코드(레지스터 정보출력)를 사용하도록 하겠습니다.
우선 다음 프로그램을 작성해주세요.
#source : boot.asm
================================================================
[org 0h]
; 캐리지 리턴과 라인피드(?) 매크로
; bios 인터럽트 10h 는 화면 출력과 관계된 겁니다.
%macro CRLF 0
mov ax, 0E0Dh
xor bx, bx
int 10h
mov al, 0Ah
int 10h
%endmacro
; 출력 매크로
%macro PRINT 1
pop dx
mov di, %1
call printreg
mov ax, 0E20h
xor bx, bx
int 10h
%endmacro
; 레지스터들을 스택에 열라게 집어 넣죠
EntryPoint:
push sp
push ss
call NextLine ; IP+5 on the stack
NextLine:
push cs
push es
push ds
push bp
push di
push si
push dx
push cx
push bx
push ax
; 레지스터값을 세팅해두고, 음 잘은 모르겠지만
; 화면좌표를 셋업하는 작업이겠죠.
; 자세한 bios int 10h 레지스터 값에 대한 설명은
; 어셈블러 책을 참조해주세요.
mov ax, 1301h
mov bx, 0007h
mov cx, 23
mov dh, 10
mov dl, 1
push cs
pop es
mov bp, String
int 10h
CRLF
CRLF
; 모든 레지스터 값을 macro를 이용해서 출력하는군요.
PRINT _AX
PRINT _BX
PRINT _CX
PRINT _DX
CRLF
PRINT _SI
PRINT _DI
PRINT _BP
CRLF
PRINT _DS
PRINT _ES
CRLF
PRINT _CS
; 조위에 NextLine call 할때 IP+5작업을 한거보이시죠.
; sub ax,5 는 IP 값 출력하기 전에
; 그대로 출력하면 엉뚱한 값이 나오기에 수정하는거겠죠.
pop ax
sub ax, 5
push ax
PRINT _IP
PRINT _SS
PRINT _SP
CRLF
; 비프음 출력
mov ax, 0E07h
int 10h
; 아무것도 안합니다. 그냥 -_- 잡질이죠.
hang:
jmp hang
; DS:DI에 의해 포인트 되고 있는 DX 의 16bit hexadecimal 숫자를
3 문자스트링으로 출력하기 위한 약간 난잡한 프로시져
printreg:
mov ah, 0Eh
xor bx, bx
mov al, byte[di]
int 10h
mov al, byte[di+1]
int 10h
mov al, byte[di+2]
int 10h
xchg dl, dh
rol dl, 4
rol dh, 4
xor bx, bx
mov ah, 0Eh
mov cx, 4
ploop:
mov al, dl
and al, 0Fh
shr dx, 4
add al, '0'
cmp al, '9'
jbe nochange
add al, 'A' - '9'-1
nochange:
int 10h
loop ploop
ret
; Data Section
String equ $ + 7C00h
db "initial register values"
_AX equ $ + 7C00h
db "AX="
_BX equ $ + 7C00h
db "BX="
_CX equ $ + 7C00h
db "CX="
_DX equ $ + 7C00h
db "DX="
_SI equ $ + 7C00h
db "SI="
_DI equ $ + 7C00h
db "DI="
_BP equ $ + 7C00h
db "BP="
_SP equ $ + 7C00h
db "SP="
_IP equ $ + 7C00h
db "IP="
_CS equ $ + 7C00h
db "CS="
_DS equ $ + 7C00h
db "DS="
_ES equ $ + 7C00h
db "ES="
_SS equ $ + 7C00h
db "SS="
; 이 코드의 5번째 라인으로 올라가보세요.
; org 0h 보이시죠.
; 여기서 org 510 은 첫번째 섹터 512byte중에
; 510번째 byte부터 아래 데이터를 0AA55h 를
; 삽입하겠다는 의미입니다.
times 510-($-$$) db 0
dw 0AA55h
================================================================
그리고 나서 다음과 같이 어셈블 작업을 거칩니다.
#assemble
[example]
=== nasm -o [bochs에서 설정한 floppyA 의 이미지이름] boot.asm ===
저의 경우는 다음과 같이 하겠죠.
nasm -o ed.img boot.asm
이렇게 해주신후 bochs 를 실행 하시면 ... ^^;
부팅시 ed.img 라는 floppyA 의 이미지 파일을 읽게되고,
자동적으로 위 프로그램이 실행되겠죠.
이런식으로 차츰차츰 접근해가면 될거예요. 한걸음씩 한걸음씩 말예요...
ps. 혹시라도 lkdp 에 참여하시고 싶은 분이 계시면 ...
같이 외국애들하고 같이 작업해보고 싶네요. 관심있으시면
제게 메일주세요 ^^;
'KB > 기타' 카테고리의 다른 글
인텔 아키텍쳐 매뉴얼 무료 배송 (0) | 2005.05.03 |
---|---|
md5, sha1` 알고리즘 뚤렸네.. (1) | 2005.04.29 |
wincvs for sourceforge (0) | 2005.04.18 |
윈도에서 ip로 컴퓨터 이름얻기 (0) | 2005.04.18 |
Linux on MobilePro (0) | 2005.04.17 |