728x90
; haribote-os
; TAB=4

; BOOT_INFO 관계
CYLS	EQU		0x0ff0			; 부트섹터 설정
LEDS	EQU		0x0ff1
VMODE	EQU		0x0ff2			; 색상 갯수에 관한 정의, 몇비트 컬러인지
SCRNX	EQU		0x0ff4			; 해상도 x
SCRNY	EQU		0x0ff6			; 해상도 y
VRAM	EQU		0x0ff8			; 그래픽 버퍼 개시번지
		
		ORG		0xc200			; harybote.sys가 로딩되는 메모리 주소

		MOV		AL,0x10			; VGA 그래픽스, 320x200x8bit 컬러
		MOV		AH,0x00
		MOV		BYTE [VMODE],8	; 화면 모드를 기록함.
		MOV		WORD [SCRNX],320
		MOV		WORD [SCRNY],200
		MOV		DWORD [VRAM],0x000a0000

; 키보드 LED 상태를 BIOS가 알려줌

		MOV		AH,0x02
		INT		0x16 			; keyboard BIOS
		MOV		[LEDS],AL

fin:
		HLT
		JMP		fin

 

CPU의 모드

- 16비트모드, 32비트 모드가 존재

- 16비트 모드로 부팅시 AX, CX와 같은 16비트 레지스터 사용 가능하나 EAX같은 32비트 레지스터는 불가

- 기계어 명령 번호도 다르고, 해석 방법과 동작이 달라 호환 불가

 

 

32비트 모드 장단점

- 장점 : 메모리 1MB 이상 사용 가능. 이상한 기계어 만나도 오동작하는 보호 기능 사용 가능

- 단점 : BIOS 사용불가. BIOS는 16비트 기계어로 작성됨 => 32비트 쓰기전에 마음것 해보자

 

 

할일

- 키보드 상태를 BIOS가 알려주는것 확인

 

 

작업

- 화면 모드 설정후 관련 정보를 메모리에 저장. 이후 필요할것을 고려 => 부팅시 정보로 BOOT_INFO로 명명

- vRAM 비디오램 : 값을 저장할수도 있지만 번지와 화소가 매칭되어 그림 표현 가능

  * VRAM은 메모리 맵 상에 여러개 존재. 화면 모드가 여러가지가 존재하기 때문

 * BOOT_INFO에 어느 VRAM 사용하는지 기록(현재 0x000a 0000 ~ 0x000a fffff로 64kb)

- 기타 정보(화소수, 컬러수, 키보드 상태 등)은 0x0ff0 주변에 저장

 

 

 

 

 

 

 

 

C언어 사용하기 

- 기존의 haribote.nas -> asmhead.nas로 이름 변경

- bootpack.c c언어 파트 추가. 앞으로 OS 부팅에 필요한 처리들을 패키지로 작성 예정

 

bootpack.c를 기계어로 만들기

1. cc1.exe : bootpack.c -> bootpack.gas

 => cc1.exe는 gcc 개조한 것. gas 어셈블리어 파일 출력

2. gas2nask.exe : bootpack.gas -> bootpack.nas

 => gas를 nask로 번역

3. nask.exe : bootpack.nas -> bootpack.obj

  => nask 파일로 우선 목적 파일 작성(기계어)

4. ob2bim.exe : bootkpack.obj -> bootpack.bim

  => 서로 다른 목적파일들을 연결해야함 obj2bim : 오브젝트 파일들을 binary image file로

5. bim2hrb.exe -> bootpack.bim -> bootpack.hrb

  => 기계어를 붙여 정리한것으로 완성 x. 각 OS에 맞게 수정 필요 하리보테 os에 맞게 bim을 번역

  * 하리보테 os c언어는 harimain()에서 시작함

6. asmhead.bin과 bootpack.hrb를 붙여 haribote.sys 만듬

 

 

 

* 이미지란 단어

- 영상의 image라기 보다는 상상하는 무언가, 가짜로 된 것을 의미

 

 

 

 

 

HLT 하기

- hlt 명령어를 어셈블러로 함수 만듦

- 함수명은 io_hlt

; naskfunc
; TAB=4

[FORMAT "WCOFF"]				; 오브젝트 파일 만드는 모드
[BITS 32]						; 32비트 모드용 기계어 만듬


; 오브젝트 파일을 위한 정보

[FILE "naskfunc.nas"]			; 소스 파일명 정보

		GLOBAL	_io_hlt			; 이 프로그램에 포함된 함수명


; 아래는 실제 함수

[SECTION .text]		; 오브젝트 파일에서 다음의 함수가 있으면 어셈블리어로 작성

_io_hlt:	; void io_hlt(void);
		HLT
		RET

 

HLT 함수 파일 naskfunc.nas 설명

- bootpack.obj와 링크하기 위해 오브젝트 파일로 만들어야 함

 => 출력 포맷을 WCOFF

- 32비트용 기계어로 만들기 위해 [BITS 32] 설정

- C언어 함수와 연계할수 있도록 앞에 _를 붙여 GLOBAL 명령으로 선언

- 실제 함수 내용 작성 : 함수명과 동일한 레이블에 작성. RET는 return;

- bootpack.c에서 io_hlt는 naskfunc.nas 상에 정의되어 있으므로 선언만 해둠

void io_hlt(void);

void HariMain(void)
{

fin:
	io_hlt(); /* c언어에선 HLT 할수 없음 */
	goto fin;

}

 

실행 결과

- 실행해보면 hlt 처리되서 바로 종료되는듯 하다.

300x250

+ Recent posts