U E D R , A S I H C RSS

VM Ware/OS Implementation Test

2. ž‘„ํ•œ ดœ 

OS งŒ“ค–ดณดณ  ‹ถ€ งˆŒ— ฌดž‘ • ›ฐ–ด “ค—ˆŠ”ฐ Œ€€„ ํ™˜ฒฝ€ ฆฌˆ…Šคƒด
gcc˜€Šต‹ˆ‹ค. ํ•˜€งŒ  €Š” windows ํ™˜ฒฝํ•˜˜ vc ฐœฐœ„ กœ ํ•ด™”œ€กœ ฌดฒ™
ถˆํŽธ(?)ํ–ˆŠต‹ˆ‹ค. Djgpp Š” dosšฉ gcc ํฌํŒ… „ „ œˆ„šฐšฉ cygwin ํŒจํ‚ค€
‚ฌšฉํ•˜ฉด —ญ‹œ ™ํ•˜ฒŒ gcc œˆ„šฐ—„œ ปดํŒŒ ํ•  ˆ˜ žˆŠต‹ˆ‹ค ทธž˜„  €Š” vc˜
—””ํŒ… ํ™˜ฒฝด ง˜— “ค–ด„œ ””„…Œ€Š” ํž˜“คฒ €งŒ (–ดฐจํ” ปค„ ””„…ํ•˜ คฉด
ŠคŠคกœ ž‹ ˜ ปค„ ””„ งŒ“ค–ด• ํ•˜Š” ฐ™Šต‹ˆ‹ค. ) —””ํŒ… ปดํŒŒ
ทธฆฌณ  งปค vc6 ‚ฌšฉํ•˜ณ  ‹ถ—ˆณ  ทธž˜„œ ด ‚ฌšฉํ•  ˆ˜ žˆŠ” ฐฉฒ•„ †Œฐœํ•˜ ค
ํ•ฉ‹ˆ‹ค.

3. ฐธณ ํ•˜ฉด ข‹€ ‚ฌดํŠธ“ค

–ด คšด ˜ฌธ OSฐœฐœฐฉฒ•„ ํ•œ€ํ™” ํ•ดŠ” ณ งˆšด ‚ฌดํŠธ
Chobits os˜ †ŒŠค –ป„ ˆ˜ žˆŠต‹ˆ‹ค.
ฌดฒ™ ข‹€ Protected mode— Œ€ํ•œ „ช… †ŒŠค ‹ดณ  žˆŠ” ‚ฌดํŠธ
http://www.nondot.org/sabre/os/articles
-
OS— Œ€ํ•œ  „ฐ˜ ธ žฃŒ€ žˆŠต‹ˆ‹ค.
http://www.osdever.net/
-
Bona Fide OS ฐœฐœ ํŠœํ† ฆฌ– ‚ฌดํŠธ
http://mega-tokyo.com/osfaq2/
-
OS FAQ
http://www.osdev.org/
-
†ŒŠค€ ณตฐœœ —ฌŸฌ os€ žˆŠต‹ˆ‹ค.
http://www.bellona2.com
-
ํ˜ž„œ GUI OS งŒ“œ‹œณ  …„ ถœํŒํ•˜‹  „˜ ‚ฌดํŠธ
http://ksyspro.org
-
ํ•œตญ ž„ฒ ””“œ ฐœฐœž ชจž„

4. Protected i386 OS œ„ํ•œ 잛€ „ช…

Intel€ ‹คฅธ cpu ฒค”ณด‹ค —ญ‚ฌ€ ˜คž˜˜–ด„œ 4bit microprocessorธ 4004—„œ
ถœฐœํ•ด„œ 8bit cpu 8008, 8080, 16„ํŠธ 8086, 80186, 80286, 32„ํŠธ 80386, 80486,
80586 (˜Š” P5 ทธŸฌ‚˜ ˆซžŠ”  €ž‘ถŒ ณดํ˜ธ ฐ›€ ชปํ•œ‹คธธž˜ ดํ›„— Pentiumœกœ
ฐ”€Œ—ˆŠต‹ˆ‹ค ). ด ‡ฒŒ ธด —ญ‚ฌ ฐ–ณ  žˆŠ” ณดํŽธ ธ cpu 8080 ˜Š” 8086 ํ†ตํ‹€–ด
intel x86 cpu—„œ Œ˜ ํ”„กœทธžจ„ 586—„œ„ ˆ˜ํ–‰˜„ก ํ•˜œ„ํ˜ธํ™˜„ ฐ–ฒŒ ฉ‹ˆ‹ค.

ด ํ•˜œ„ํ˜ธํ™˜ •Œฌธ— •„ฌดฆฌ ตœ‹  ปดํ“จํ„„ ฒ˜Œ €ํŒ…‹œ—Š”  ฅธ x86 ฒ˜Ÿ
ˆ˜ํ–‰˜„ก „„˜—ˆŠต‹ˆ‹ค. €ํŠธ„„—„œ ด  ฅธ x86—„œ ตœ‹ ˜ ธฐŠฅ„ ‚ฌšฉํ•˜Š”
i386+ ํ™˜ฒฝœกœ งŒ“คธฐ œ„ํ•ด„œ  –ด„ ‹คŒ ฐ™€ „ ํ•˜ฒŒ ฉ‹ˆ‹ค.

ORG 0x7C00 - PC€ ฆฌ…‹˜ฉด €ํŒ…  ””ฐ”ดŠค˜ ฒซฒˆงธ „„ฐ(512ฐ”ดํŠธ)
ฝ–ด ฉ”ชจฆฌ 0x7C00— ˜ฌ ค †“€ ํ›„ ด ฝ”“œกœ  ํ”„ํ•˜ฒŒ ฉ‹ˆ‹ค. ”ฐ„œ €ํŠธ„„
ฝ”“œŠ” ทธ ฉ”ชจฆฌ—„œ ‹œž‘ํ•œ‹คณ  € •ํ•ด• ํ• ฒƒž…‹ˆ‹ค.

A20 enable - ˜ˆ „—Š” ‹ค œ ฉ”ชจฆฌํฌธฐ€ ํฌ€ •Š•„ 1M ดํ•˜งŒ  ‘ํ•˜„ก
„„˜—ˆŠ”ฐ ด   ฉ”ชจฆฌ€ 1Mดƒ ˜Š” ฒƒด งŽ•„ 1M ดƒ„ ‹ค œ  ‘ ํ•˜ธฐ œ„ํ•ด„œ
ํ•ด–ด• ํ•ฉ‹ˆ‹ค.

Protected mode - ฒ˜Œ €ํŒ…ํ• • x86 Real ModeŠ” „ทธํŠธ:˜คํ”„…‹
€ • ฐฉ‹œกœ ˆ˜ํ–‰˜€งŒ 80286ดƒ—„œŠ” ณดํ˜ธชจ“œ€ €›˜—ˆณ  (ตœŒ€16M€Šฅ)
80386—„œŠ” 4GŒ€  ‘ €Šฅํ•˜„ก ˜—ˆŠต‹ˆ‹ค.

ปค„กœ“œ - €ํŠธ„„ฝ”“œŠ” Cกœœ ฐ”ด„ˆฆฌ ปค„„ —ฌŸฌ „„—„œ
ฝ–ด„œ ํŠ • ฉ”ชจฆฌ ฒˆ€— กœ“œํ•œ ํ›„ ทธ ‹œž‘ ํ•จˆ˜ (—”ํŠธฆฌ ํฌธํŠธ ํ•จˆ˜)กœ  ํ”„ํ•˜ฒŒ
ฉ‹ˆ‹ค.

5. €„


VC6,
- ปค„˜ ปดํŒŒ ฐ งํ‚„ ‹ด‹ํ•ฉ‹ˆ‹ค.
- šฐฆฌŠ” ””Šค“„ ‚ฌšฉํ•˜€ •Šณ  ฐ”กœ ปดํŒŒํ•ด„œ ด€กœ œฌ ํ›„ VMWareกœ
กœ“œํ•  ฒƒž…‹ˆ‹ค. ( no ํ”Œกœํ” €ํŒ…””Šค“, no ฆฌถ“, no test machine )

Nasm
- Netwide Asmœกœ at&t „—ด ฐ intel „—ด ‘˜‹ค €›ํ•˜ณ  target format„
งŽด €›ํ•˜Š” –ด…ˆธ”Ÿฌž…‹ˆ‹ค. „˜ •—†ด ทธƒฅ nasm.exe งŒ žˆœฉด ฉ‹ˆ‹ค.

6. †ŒŠค ํŒŒ“ค

bootsect.asm
- „‹จํ•œ ณดํ˜ธชจ“œ(„ทธํ…Œด…˜ฐฉ‹) „ž… ฐ ปค„ กœ“œ €ํŠธกœ”

main.c
- VCกœ ปดํŒŒ  ž‘€ ปค„

Makeboot.exe
- €ํŠธ„„™€ ปค„ด€ mergeํ•˜Š” „‹จํ•œ makeboot.c ปดํŒŒํ•ด„œ ž‹ งŒ˜
€ํŠธ ด€ œจŠ” ํ”„กœทธžจ งŒ“คฉดœ‹ค.

7. †ŒŠค

7.1. bootsect.asm

[BITS 16]       ; We need 16-bit intructions for Real 
mode

[ORG 0x7C00]    ; The BIOS loads the boot sector into memory location 
0x7C00

reset_drive:

        mov ah, 0               ; RESET-command

        int 13h                 ; Call interrupt 13h

        or ah, ah               ; Check for error code

        jnz reset_drive         ; Try again if ah != 0

        ;vc—„œ /base 10000 กœ 헀ธฐ •Œฌธ— —ฌธฐ„œ€„ฉ”ชจฆฌ กœ“œ
        ; ํ•ด• ํ•œ‹ค. ES:BX กœ 1000:0000h ดธฐ •Œฌธ— •„ž˜ฒ˜Ÿ ํ•œ‹ค.

        mov ax, 1000h           ; es:bx <-- 1000:0000h 

        mov es, ax
        mov bx, 0h          ; Destination address = 0000:1000

        mov ah, 02h             ; READ SECTOR-command

        ; ‘ฒˆงธ „„€„ฐ 3„„€ ปค„ด€ „„‹ค.

        mov al, 3h             ; Number of sectors to read = 1

        mov ch, 0               ; Cylinder = 0

        ; ํ˜„žฌ ฒซฒˆงธ„„ฐ512 ดฉฐ ‘ฒˆงธ „„€„ฐ 3ฐœ „„€ ปค„ด€‹ค

        mov cl, 02h             ; Sector = 2

        mov dh, 0               ; Head = 0

        int 13h                 ; Call interrupt 13h

        or ah, ah               ; Check for error code

        jnz reset_drive         ; Try again if ah != 0

A20Address:    ; Set A20 Address line here

    CLI

    CALL enableA20

    STI
    JMP Continue

enableA20:
        call enableA20o1

        jnz short enableA20done

        mov al,0d1h

        out 64h,al

        call enableA20o1

        jnz short enableA20done

        mov al,0dfh

        out 60h,al

enableA20o1:

        mov ecx,20000h

enableA20o1l:

        jmp short $+2

        in al,64h

        test al,2

        loopnz enableA20o1l

enableA20done:

        ret

Continue:   

        cli                 ; Disable interrupts, we want to be alone

        xor ax, ax

        mov ds, ax              ; Set DS-register to 0 - used by lgdt

        lgdt [gdt_desc]         ; Load the GDT descriptor

        mov eax, cr0            ; Copy the contents of CR0 into EAX

        or eax, 1               ; Set bit 0

        mov cr0, eax            ; Copy the contents of EAX into CR0

        jmp 08h:clear_pipe      ; Jump to code segment, offset clear_pipe

[BITS 32]                       ; We now need 32-bit instructions

clear_pipe:

        mov ax, 10h             ; Save data segment identifyer

        mov ds, ax              ; Move a valid data segment into the data segment register

        mov ss, ax              ; Move a valid data segment into the stack segment register

        mov esp, 090000h        ; Move the stack pointer to 090000h

        ; 10200hกœ  ํ”„ 200hŠ” vcกœ งํ‚ํ•˜ฉด ธฐณธ PEํ—ค”(200h) ถ™—ฌ„œ ”ํ–ˆ‹ค.

        ; 10200h ฆ‰ 1000:0200h กœ  ํ”„

        ;jmp 1000:0200h

        jmp 10200h

        

gdt:                    ; Address for the GDT

gdt_null:               ; Null Segment

        dd 0

        dd 0

gdt_code:               ; Code segment, read/execute, nonconforming

        dw 0FFFFh

        dw 0

        db 0

        db 10011010b

        db 11001111b

        db 0

gdt_data:              ; Data segment, read/write, expand down

        dw 0FFFFh

        dw 0

        db 0

        db 10010010b

        db 11001111b

        db 0

gdt_end:		; Used to calculate the size of the GDT

gdt_desc:               ; The GDT descriptor

        dw gdt_end - gdt - 1    ; Limit (size)

        dd gdt                  ; Address of the GDT

times 510-($-$$) db 0           ; Fill up the file with zeros

        dw 0AA55h                ; Boot sector identifyer
•„ž˜ฒ˜Ÿ –ด…ˆธ” ํ•˜—ฌ ˜คธŒ  €ํŠธกœ” ฐ”ด„ˆฆฌ –ป–ด‚ด•
ํ•ฉ‹ˆ‹ค.

nasm -f bin bootsect.asm -o bootsect.bin

‹คŒ€ €ํŠธกœ”™€ ปค„ ด€ ํ•ฉณ„œ ํ•˜‚˜˜ €ํŒ…ด€กœ งŒ“ค–ดŠ” makeboot.c
ž…‹ˆ‹ค. ”ฐกœ ํ”„กœ ํŠธ งŒ“ค–ด„œ „‹จํžˆ ปดํŒŒํ•ด„œ makeboot.exe งŒ“ค„ก
ํ•ฉ‹ˆ‹ค.
#include 

int 
main(int argnr, char *args[])

{

  FILE 
*output, *input;

  int 
i, bytes_read, sectors_read, bytes_from_file;

  char 
buffer[512];

  if 
(argnr < 4) {

    printf("Invalid 
number of parameters.\n\n");

    printf("USAGE: 
%s [output] [input 1] [input 2] ... [input n]\n", args[0]);

    printf("Example: 
%s a.img bootsect.bin kernel.bin");

    exit(0);

  }

  output 
= fopen(args[1], "r");

// 
ฎ–ด “ฐธฐ ํ• ƒณ  –ดณดŠ” ฝ”“ ฐ ทธƒฅ ฎ–ด“ฐž. --

  if 
(output != NULL) {

    buffer[0] 
= 0;

  }

  fclose(output);

  output 
= fopen(args[1], "wb");

  for 
(i = 2; i < argnr; i++) {

    input 
= fopen(args[i], "rb");

    if 
(input == NULL) {

      printf("Missing 
input file %s. Aborting operation...", args[i]);

      fclose(output);

      exit(1);

    }

    bytes_read 
= 512;

    bytes_from_file 
= 0;

    sectors_read 
= 0;

    while(bytes_read 
== 512 && !feof(input)) {

      bytes_read 
= fread(buffer, 1, 512, input);

      if 
(bytes_read == 0)

        break;

      if 
(bytes_read != 512)

        memset(buffer+bytes_read, 
0, 512-bytes_read);

      sectors_read++;

      fwrite(buffer, 
1, 512, output);

      bytes_from_file 
+= bytes_read;

    }

    printf("%d 
sectors, %d bytes read from file %s...\n", sectors_read, bytes_from_file, 

args[i]);

    fclose(input);

  }

  fclose(output);

  return 
0;

}

‹คŒ€ ปค„ †ŒŠคž…‹ˆ‹ค.


// 
bro (bro@shinbiro.com)2004-02-17 - initial ( vc dev envronment setting )

// 
starting function

void 
start()

{   

    char* 
hello = "Hello OS!";

    unsigned 
char* vidmem = (unsigned char*)0xB8000;

    while( 
*hello != '\0' )        

    {

        *vidmem++ 
= *hello++;

        *vidmem++ 
= 7;        // ฌธž ธฐณธ †„

    }   

    

    // 
ปค„ด ‚˜ฉด •ˆœ‹ค. „† Œ•„•ํ•œ‹ค.   

    for(;;);

}

7.2. Visual C++ ปดํŒŒ ํ™˜ฒฝ ตฌ„ํ•˜ธฐ


œ„˜ ปค„ †ŒŠค ปดํŒŒ ํ•˜ธฐ œ„ํ•ด„œ VC ปดํŒŒ ํ™˜ฒฝ„ ตฌ„ํ•ดณด„ก ํ•ฉ‹ˆ‹ค.

 € Win32 Console Applicationœกœ „‹จํžˆ ํ”„กœ ํŠธ ƒ„ํ•ฉ‹ˆ‹ค.

””„…€ ชปํ•˜‹ˆ ทธƒฅ Release ชจ“œกœ „ ํƒํ•œ ํ›„ C++ „ธํŒ…„ •„ž˜ฒ˜Ÿ ํ•ฉ‹ˆ‹ค.
/nologo /G4 /Zp1 /ML /W3 /vmg /vd0 /GX /Od /Gf /FAc /Fa"Release/" /Fo"Release/" /Fd"Release/" /FD /c
Linkํƒญ˜ ˜ต…˜€ •„ž˜ฒ˜Ÿ ํ•ฉ‹ˆ‹ค.
/nologo /base:"0x10000" /entry:"start" /subsystem:console /incremental:no /pdb:"Release/testos.pdb" /map:"Release/testos.map" /machine:I386 /nodefaultlib /out:"testos.bin" /DRIVER /align:512 /FIXED
˜ํ•œ ปดํŒŒ ž‘—…—„œ ฐ”กœ €ํŠธ„„„ ปดํŒŒํ•˜ณ  ปดํŒŒ ‚˜ฉด ฐ”กœ €ํŠธ ด€„
งŒ“ค„ก Pre-Link™€ Post-Build ž‘„ํ•ฉ‹ˆ‹ค.

ปดํŒŒ„ ํ•ดด…‹ˆ‹ค.
Deleting intermediate files and output files for project 'testos - Win32 Release'.
--------------------Configuration: testos - Win32 Release--------------------
Compiling...
main.c
Linking...
LINK 
: warning LNK4096: /BASE value "10000" is invalid for Windows 95; image may 
not run 1 sectors, 512 bytes read from file bootsect.bin...
3 sectors, 1536 bytes read from file testos.bin...
testos.bin 
- 0 error(s), 1 warning(s)

8. VMWare ํ…ŒŠคํŠธ ํ™˜ฒฝ ตฌ„ํ•˜ธฐ

ปดํŒŒ„ งˆ˜ณ  ‚˜ฉด •„ž˜™€ ฐ™€ ํƒƒ‰ธฐ ชจŠตด   ฒƒž…‹ˆ‹ค. งˆ€ง‰œกœ …„œ testos.img € šฐฆฌ˜ ปค„ ด€€ ฉ‹ˆ‹ค.
zeropage:VMWareOSImplementationTest01.gif
Partcopy.exe ํˆด„ ‚ฌšฉํ•˜—ฌ €ํŒ… ””Šค“— †“„ ˆ˜„ žˆ€งŒ ฒˆกญŠต‹ˆ‹ค. ”ฐ„œ VMWare—„œ ง ‘ ด ””Šค“ ด€กœ กœ“œํ•˜„ก ํ•ฉ‹ˆ‹ค.
zeropage:VMWareOSImplementationTest02.gif
ฌดกฐทธƒฅ ธฐณธœกœ Next ํ•ฉ‹ˆ‹ค.
zeropage:VMWareOSImplementationTest03.gif
 œ ค‘š”ํ•œ ฒƒ€ ด ‡ฒŒ งŒ“  €ƒ testos ˜ ํ”Œกœํ” ””Šค“ €ํŒ… „ •ž…‹ˆ‹ค.
zeropage:VMWareOSImplementationTest04.gif
Use Floppy Image— ํ•ด‹ img ํŒจŠค งžถ”„ก ํ•ฉ‹ˆ‹ค.

ด œ ‹คํ–‰ํ•ดด…‹ˆ‹ค.
zeropage:VMWareOSImplementationTest05.gif
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:28:21
Processing time 0.0474 sec