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 에 참여하시고 싶은 분이 계시면 ...

같이 외국애들하고 같이 작업해보고 싶네요. 관심있으시면

제게 메일주세요 ^^;

'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

+ Recent posts