9. 테스트를 위한 가상 os이미지 생성

가상 os이미지는 이전에 했던 os이미지 로딩 기능 구현이 제대로 돌아가는지 확인을 위해 만드는 임시적인 것이다.
자신의 섹터번호를 화면 위치에 대응시켜서 0~9까지 번호를 출력하게 만들것.

1024섹터나 되는 코드를 작성하려면 nasm의 전처리기(Preprocessor)를 사용할 것이다.

./01.Kernel32/VirtualOS.asm

[ORG 0x00]
[BITS 16]

SECTION .text

jmp 0x1000:START

SECTORCOUNT:  dw 0x0000 ; 현재 실행중인 섹터 번호를 저장

START:
  ; 비디오 초기화
  mov ax, cs
  mov ds, ax
  mov ax, 0xB800
  mov es, ax

  mov ax, 2                               ; 한문자를 나타내는 바이트 수(2)를 ax에 설정
  mul word [ SECTORCOUNT ]                ; ax와 섹터 수를 곱함
  mov si, ax                              ; 곱한 결과를 si에 설정
  mov byte [ es : si + (160 * 2 ) ], '0'  ; 계산된 결과를 비디오 메모리에 오프셋으로 삼아 세번째 라인부터 화면에 0을 출력

  add word [ SECTORCOUNT ], 1             ; 섹터 수를 1증가

  jmp $                                   ; 현재 위치에서 무한루프

  times 512 - ( $ - $$ )  db 0x00
  • SECTORCOUNT라는 메모리 어드레스는 정상저긍로 처리된 섹터의 수를 기록한다.
  • 위의 코드는 1섹터만 작성 한 것으로 1024섹터를 만들어야 한다.
    • 1024섹터중 마지막섹터를 제외한 1023섹터의 코드는 화면에 자신을 출력하는 코드 및 다음 섹터의 어드레스로 이동하는 코드를 반복하면 된다.
    • 마지막 섹터는 더이상 섹터가 없으므로 무한루프를 수행하면 된다.

./01.Kernel32/VirtualOS.asm

[ORG 0x00]
[BITS 16]

SECTION .text

jmp 0x1000:START

SECTORCOUNT:      dw 0x0000 ; 현재 실행중인 섹터 번호를 저장
TOTALSECTORCOUNT  equ 1024  ; 가상 os의 총 섹터 수 최대 1152섹터(0x90000byte)까지 가능

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 코드 영역
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START:
  ; 비디오 초기화
  mov ax, cs
  mov ds, ax
  mov ax, 0xB800
  mov es, ax

  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ; 각 섹터별로 코드를 생성
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  %assign i 0               ; value i = 0;
  %rep TOTALSECTORCOUNT     ; TOTALSECTORCOUNT 만큼 반복
    %assign i i + 1         ; i++;

    ; 현재 실행중인 코드가 포함된 섹터의 위치를 화면 좌표로 변환
    mov ax, 2                               ; 한문자를 나타내는 바이트 수(2)를 ax에 설정
    mul word [ SECTORCOUNT ]                ; ax와 섹터 수를 곱함
    mov si, ax                              ; 곱한 결과를 si에 설정
    mov byte [ es : si + (160 * 2 ) ], '0' + ( i % 10 )  ; 계산된 결과를 비디오 메모리에 오프셋으로 삼아 세번째 라인부터 화면에 0을 출력
    add word [ SECTORCOUNT ], 1             ; SECTORCOUNT++;

    ; if 마지막 섹터 일경우 무한루프 수행
    ; else 다음 섹터로 이동해서 코드 수행
    %if i == TOTALSECTORCOUNT               ; 마지막 섹터이면
      jmp $                                 ; 현재위치에서 무한루프
    %else                                   ; 마지막 센터 아니면
      jmp ( 0x1000 + i * 0x20 ): 0x0000     ; 다음 섹터 오프셋으로 이동
    %endif

    times 512 - ( $ - $$ )  db 0x00
  %endrep
  • line 9: TOTALSECTORCOUNT equ 1024 ; 가상 os의 총 섹터 수 최대 1152섹터(0x90000byte)까지 가능
    • sector의 최댓값이 1152인 이유는
    • os이미지가 로딩되는 어드레스가 0x10000이고 상위 0xA0000이후 영역은 비디오 메모리로 사용되기 때문이다.
    • 따라서 os를 로딩할 수 있는 전체 크기는 0x90000byte(576KB)가 되며, 섹터가 512 바이트 크기이므로 최대 1152섹터가 된다.

./01.Kernel32/makefile

all: VirtualOS.bin

VirtualOS.bin: VirtualOS.asm
  nasm -o VirtualOS.bin VirtualOS.asm

clean:
  rm -f VirtualOS.bin

os이미지 통합과 qemu 실행

  1. 01.Kernel32에서 make 수행 하여 가상 os이미지를 빌드
  2. 부트 이미지를 복사해서 부팅이미지를 만드는 기존 방식을 수정하여 부트로더와 가상 os이미지를 하나의 파일로 합치도록 수정

./makefile

all: BootLoader Kernel32 Disk.img

BootLoader:
  @echo
  @echo =================== Build Boot Loader ===================
  @echo

  make -C 00.BootLoader

  @echo
  @echo =================== Build Complete ===================
  @echo

Kernel32:
  @echo
  @echo =================== Build 32bit Kernel ===================
  @echo

  make -C 01.Kernel32

  @echo
  @echo =================== Build Complete ===================
  @echo

Disk.img: BootLoader Kernel32
  @echo
  @echo =================== Disk Image Build Start ===================
  @echo 

  cat 00.BootLoader/BootLoader.bin 01.Kernel32/VirtualOS.bin > Disk.img

  @echo
  @echo =================== All Build Complete ===================
  @echo

clean:
  make -C 00.BootLoader clean
  make -c 01.Kernel32 clean
  rm -f Disk.img

<실행 결과>

issue: 모든 섹터를 다돌아서 출력을 하지 못한다. 64bit 멀티코어 OS 제작하기 [4] - 3 : 부트 로더 테스트용 가상 이미지 제작에서 코드, makefile을 모두 복사, 붙여넣기 해도 마찬가지 이다.

'Project > OS' 카테고리의 다른 글

10. 32비트 보호모드로 전환하자  (0) 2019.07.18
8. os 이미지 로딩 기능 구현  (0) 2019.07.16
7. 디스크에서 os이미지 로딩  (0) 2019.07.16
6. Bootloader 만들기  (0) 2019.07.11
5. 부팅과 부트로더  (0) 2019.07.11

+ Recent posts