; 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 처리되서 바로 종료되는듯 하다.
'컴퓨터과학 > 컴퓨터, OS' 카테고리의 다른 글
os만들기 - 19. c언어를 이용해 메모리 쓰기 (0) | 2020.08.02 |
---|---|
os만들기를 하는중에 (0) | 2020.08.02 |
os만들기 - 17. 본체 동작시키기 (0) | 2020.08.02 |
os만들기 - 16. 부트섹터에서 본프로그램 부팅 (0) | 2020.08.02 |
os만들기 - 15. os 본체? 만들기 (0) | 2020.08.02 |