728x90

현황

- 검은 화면이 뜨도록 만듬

- 뭔가 띄우려면 VRAM 비디오 램에 올바른 값을 써야함

 

문제

- c언어에서는 VRAM 등 직접 메모리 지정해서 쓰는 명령 없음 => 함수 작성

 * 사실 포인터를 이용해서 쓸수 있기하나 넘어가자

 

메모리에 쓰기 함수 추가하기

- naskfunc.nas에 write_mem8함수 추가(8비트 값을 쓰기)

- 사용법 : write_mem8(0x1234, 0x56)

 => 의미 : MOVE BYTE[0x1234], 0x56 -> 0x1234 번지에 바이트 크기(8비트)로 0x56이란 값을 쓴다.

- 사용 과정 : c언어에서 write_mem8() 함수 호출 -> naskfunc.nas의 _write_mem로 점프

- 아래의 코드에서 +4를 하는 이유 32비트 모드(4 x 8비트)이므로 한칸씩 이동하기 위함

 

 

INSTRSET

- 이 프로그램이 486용임을 nask에 알려줌.

 => nask는 EAX(32비트 레지스터)라는 단어를 만나면 레지스터로 해석함

 => 이걸 안해주면 8086 CPU 명령어로 생각해서 레이블 중 하나로 인식



 

 

 

인텔 CPU 아키텍처 흐름

- 8086 -> 80186 -> 286 -> 386 -> 486 -> Pentium -> PentiumPro -> Pentium2 -> Pentium3 -> Pentium4 ...

- 286까지 16비트 CPU, 386부터 32비트 CPU

 

 

 

bootpack.c  부트 프로그램 패키지 수정

- 변수 초기화 해주고

- VRAM에 값을 저어주는 명령을 써보자

 => 아래의 코드에선 0xa0000 ~ 0xaffff 번지에 15라는 값을 입력해줌

 

 

 

실행 결과

 

 

 

 

줄무늬 쓰기

- write_mem8(i, i & 0x0f);로 수정

- i와 0x0f를 and연산한 결과를 반환

- 정리

  0x0f = 0x0000 000f

     i     = 0x000a 0000

     i     = 0x000a  f f f f

=> i의 최하위 비트 LSB(Least Significant bit) 가 f인 경우 

    i번지에 0x0000 000f 쓰기

=> 이외의 경우

    i번지에 0x0000 0000 쓰기

- 결론 : 0x0000 0000 을 쓰다가   일정 구간이 지나서 0x0000 000f쓰기를 반복한다.

 

 

 

 

 

줄무늬 쓰기 실행결과

 

 

 

 

300x250
728x90

벡터 vector

- 크기와 방향을 가지는 물리량

특징 벡터 feature vector

- 차원을 가지는 벡터

벡터의 전치 transeposed vector

- 벡터의 원소를 행과 열을 바꾼것

 

벡터의 크기, 노름 norm

- 원점에서 벡터공간상 한점까지의 거리

 

 

단위 벡터 unit vector

- 특정 방향에 대해 길이가 1인 벡터

 

 

 

벡터의 연산

1. 스칼라 곱

- 벡터에 스칼라(실수) 곱하는 연산

2. 내적 dot product

- 점으로 표기하기 때문에 점곰, 혹은 결과가 스칼라이므로 스칼라 곱, 꺽쇄를 사여 표기하기도 함.

3. 외적 cross product

- 벡터끼리 곱하여 벡터가 나와 벡터 곱, 교곱이라고도 부르는 연산

- 자세한 연산은 공업수학 참조

 

 

 

 

수직 사영 projection

- 벡터 y를 벡터 x에 사영하면, x방향의 벡터가 생김

 

 

벡터의 직교(수직)과 정규 직교

- 아래의 조건을 만족하는 경우 두 벡터 x, y는 수직 orthogonal/정규 직교 orthonormal이됨.

 

 

 

선형 결합 linear combination

- 벡터 집합과 스칼라 계수 집합들의 곱, 합이 선형성을 가지고 있으면 선형 결합. 1차결합이라고 부름

 

 

 

선형 독립과 선형 종속

- 아래의 벡터 집합과 스칼라 계수 집합이 주어질때

- 선형 독립 : 모든 a_i = 0인 경우에만 성립하는 경우. 벡터 집합은 선형 독립 linear indepent

- 선형 종속 : 선형 독립이 아닌 경우. 선형 종속 linear dependent

 

 

 

기저 

- 스칼라 곱을 해서 벡터 공간을 생성할수 있는 벡터

- ex

  기저 벡터 : (1, 0)가 주어질때

   a (1, 0) => (2, 0), (3, 0), (4, 0) 등의 생성 벡터 공간(span vector space)이 만들어짐

https://losskatsu.github.io/linear-algebra/basis/#2-%EC%A2%8C%ED%91%9C%ED%8F%89%EB%A9%B4%EC%97%90%EC%84%9C%EC%9D%98-%EA%B8%B0%EC%A0%80

 

기저 집합

- 2차원에서의 기저 (1, 0), (0, 1)

- 3차원에서 기저 (1, 0, 0), (0, 1, 0), (0, 0, 1) 과 같이

 벡터 공간을 생성해내는 기저의 모임

 

 

그램 슈미트 직교화 과정

- n개의 선형 독립 벡터가 주어질때, 생성 벡터공간에 대한 정규 직교 기저를 찾을 수 있음

- 아래의 경우 3개의 선형 독립 벡터(u1, u2, u3)가 주어질때 생성 벡터(v1, v2, v3) 공간을 보여줌

300x250
728x90

패턴인식 시스템 설계

1. 데이터 수집 : 올바른 형태의 많은 표본 데이터 필요 -> 텍스트, 사진, 음성 등

2. 특징 선택 : 어떤 특징을 사용할 것인가 선정 -> 관심점, 키, 몸무게 등

3. 모델 선택 : 패턴을 분류하기 위해 어떤 알고리즘을 사용할 것인가 -> 회귀 분석기, 분류기, 클러스터링, 신경망 등

4. 학습 : 훈련 안된 텅빈 모델을 학습된 모델로 만듬 -> 지도학습, 비지도학습, 강화학습 등

5. 인식 : 입력 데이터의 분류를 결정

 

https://sungkipyung.wordpress.com/2011/09/12/pattern-recognition-1%EC%9E%A5-%EC%9A%94%EC%95%BD/

 

 

패턴인식 문제 종류

1. 분류 classification

 - 입력 데이터에 특정 클래스를 줌(어디에 속하는지 분류해줌)

 * 모호한 퍼지같은 결과가 아니라, 분류에 대한 명확한 정수 라벨링이 수행됨

 

2. 회귀 regression

 - 표본 데이터로 입력 데이터를 예측가능한 모델을 만듬 -> 회귀분석

3. 군집화 clustering

 - 표본 데이터들이 서로 어느 그룹에 속하는지 분류

=> 아래의 그림은 머신러닝, 패턴인식 문제들의 종류를 정리한 것임

https://riseone.tistory.com/entry/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D%EC%9D%98-%EB%B6%84%EB%A5%98

 

 

 

 

 

 

 

 

 

 

패턴인식에서의 분류

- 특징 공간에 존재하는 클래스들을 분할해주는 경계를 찾는 문제

 => 분류란? 결정 경계 decision boundaries를 찾는 문제

- 아래의 그림은 모델이 올바르게 분류할수 있는 결정 경계를 찾는 과정을 보여줌

https://devashishshankar.wordpress.com/tag/tutorial/

 

 

 

 

분류기의 형태

- 분류기는 판별 함수 discriminant functions g(x)의 집합으로 정리할 수 있음.

 => 입력 특징 벡터 x가 주어질때, x는 g_n(x)가 가장 큰 n에 속함

 

 

 

패턴 인식의 접근 방법

1. 통계적 접근 방법

 - 통계 모델을 이용한 패턴 분류 -> 통계 모델 = 해당 클래스별 확률 밀도 함수, 베이즈 결정 규칙으로 분류

2. 신경망 접근 방법

 - 신경망 구현. 표본 데이터로 신경망 가중치 훈련 -> 입력 패턴에 대해 인식

- 아래의 그림은 통계적 방법 예시 : 샘플 데이터로 봉우리 형태의 확률 밀도 함수를 띔

- 신경망 방법 예시 : 입력 벡터(패턴)에 대해 신경망 가중치들이 조정됨

 

 

 

 

 

패턴 인식 예시

1. 문자 인식

2. 보안

3. 사물 분류 등 

300x250
728x90

패턴인식 Pattern Recognition

- 분야 : 인지과학 + 인공지능 분야 중하나

 * 인지 과학 : 심리, 컴퓨터 사이언스, 언어 등을 통합하여 지능을 다루는 학문 분야

 * 인공 지능 : 사람의 학습, 추론 능력을 인공적 모델링을하고, 프로그램으로 구현 기술

- 패턴인식이란 ? : 센싱을 통해 얻은 정보로 대상을 다루는 분야

 

 

 

패턴 pattern

- 패턴 = 특징

- 특징을 모아놓은 집합

- 특징 ? 물체가 가진 고유한 특성

 

특징 feature의 종류

- 색상, 높이, 넓이, 무게 등

 

특징 벡터

- d 차원의 특징 열벡터

- 아래는 1차원 특징 벡터와 2차원 특징 벡터를 보여줌

 

 

 

 

 

 

 

특징 공간

- 특징 벡터가 정의되는 공간

- 1차원 특징 공간의 경우 : 특징 길이가 1

- 2차원 특징 공간의 경우 : 특징 길이가 2

- 3차원 특징 공간의 경우 : 특징 길이가 3

 => 아래의 예시는 사람 별로 나이, 키, 몸무게가 주어질때 특징공간에서 표현한 것

- n차원 특징 공간의 경우 : 특징 길이가 4

 => 아래의 예시는 나이의 변화에 따라 키와 몸무게, 발 크기가 변하는 특징 공간을 보여줌

 

 

패턴 인식이란?

- 특징 벡터인 패턴이 주어질때 이 패턴이 어디에 속하는지 찾아내는 문제

 => 분류 classification이라고 부름 = 특징 벡터 x가 주어질때 클레스 omega를 찾는 문제

- ex. 키와 몸무게로 남성 여성을 분류하는 문제

 => 아까 2차원 특징 공간에서 남성과 여성을 분류 한다면 다음과 같이 분류 가능할듯

 

 

 

 

좋은 특징과 나쁜 특징

- 좋은 특징 : 분류하기 좋은 특징

  => 선형/비선형 모델로 분류 가능

- 분류하기 힘든 특징 => 나쁜 특징

  => 선형/비선형 모델로  분류가 힘듬 + 아웃라이어 심함

 

 

 

패턴의 유형

1. 선형 분류가 가능한 패턴

2. 비선형 분류가 가능한 패턴

3. 상관관계가 큰 패턴

4. 멀티 모달인 패턴(봉우리가 2개 이상인 패턴)

 

300x250
728x90

하리보테OS를 만드는 중에

힘들어 죽는줄 알았다.

 

친숙하지 않은 기계어 어셈블리어 가지고

부팅 가능하게 만들고 화면 띄우게 만들고

처음 하는 입장이라 상당히 시간이 오래걸렸다.

 

내일부터는 C언어 위주라 조금 수월해질듯한데,

최적화, 영상처리보다 이게 정리하는데 훨씬 오래걸렸다.

 

앞으로 조금 수월해질지는 모르겠는데 이것만 올인하기 보다는

다른 학문이랑 조금씩 병행하면서 해야되겠다.

하나만 하니 질리기도 하고

300x250
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
728x90
; haribote-ipl
; TAB=4

CYLS	EQU		10				; CYLS를 10으로 정의

		ORG		0x7c00			; 메모리 안에서 로딩되는 곳

; 아래는 표준 FAT12 포맷 플로피 디스켓을 위한 내용들

		JMP		entry
		DB		0x90
		DB		"HARIBOTE"		; 부트섹터 이름. 마음대로해도 ok
		DW		512				; 1섹터 크기(바이트 단위, 512)
		DB		1				; 클러스터 크기(1로 해야됨)
		DW		1				; 예약된 섹터수 
		DB		2				; 디스크 FAT 테이블 수
		DW		224				; 루트 디렉토리 엔트리 수 (보통 224엔트리)
		DW		2880			; 디스크 총섹터수
		DB		0xf0			; 미디어 타입
		DW		9				; 하나의 FAT 테이블 섹터 수
		DW		18				; 1트랙에 몇 색터가있는지
		DW		2				; 헤드의 수
		DD		0				; 파티션 없으므로 0
		DD		2880			; 드라이브 크기 한번더씀
		DB		0,0,0x29		; 필요하다고함
		DD		0xffffffff		; 볼륨 시리얼 번호
		DB		"HARIBOTEOS "	; 디스크 이름
		DB		"FAT12   "		; 포멧이름
		RESB	18				; 18바이트 남김

; 프로그램 본체

entry:
		MOV		AX,0			; 레지스터 초기화
		MOV		SS,AX
		MOV		SP,0x7c00
		MOV		DS,AX

; 디스크 읽기

		MOV		AX,0x0820
		MOV		ES,AX
		MOV		CH,0			; 실린더 0
		MOV		DH,0			; 헤드 0
		MOV		CL,2			; 섹터 2 
readloop:
		MOV		SI,0			; 실패 횟수를 세는 레지스터
		
retry:
		MOV		AH,0x02			; AH=0x02 : 디스크 읽기
		MOV		AL,1			; 1 섹터
		MOV		BX,0
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 디스크 바이오스 호출
		JNC		next			; 에러가 없으면 next로
		ADD		SI,1			; SI에 1더하기
		CMP		SI,5			; SI와 5비교
		JAE		error			; SI >= 5 이면 에러로
		MOV		AH,0x00
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 드라이브 리셋
		JMP		retry
next:
		MOV		AX,ES			; 어드레스를 0x200 더함
		ADD		AX,0x0020
		MOV		ES,AX			; ADD ES,0x020이 없어서 이렇게 함
		ADD		CL,1			; CL에 1 더함
		CMP		CL,18			; CL과 18 비교
		JBE		readloop		; CL <= 18 readloop로
		MOV		CL,1
		ADD		DH,1
		CMP		DH,2
		JB		readloop		; DH < 2 read loop로
		MOV		DH,0
		ADD		CH,1
		CMP		CH,CYLS
		JB		readloop		; CH < CYLS read loop로

; 0xc200번지(hribote.sys)로 점프. 10실린더까지 다 읽어 로드되면 본프로그램 점프

		JMP		0xc200

error:
		MOV		SI,msg

putloop:
		MOV		AL,[SI]
		ADD		SI,1			; SI에 1 더함
		CMP		AL,0
		JE		fin
		MOV		AH,0x0e			; 한 문자 표시 기능
		MOV		BX,15			; 컬러 코드
		INT		0x10			; 비디오 BIOS 호출
		JMP		putloop

fin:
		HLT						; CPU 정지 시킴
		JMP		fin				; 무한 루프

msg:
		DB		0x0a, 0x0a		; 줄바꿈 문자 2개
		DB		"load error"
		DB		0x0a			; 줄바꿈
		DB		0

		RESB	0x7dfe-$		; 나머지칸 0채우기

		DB		0x55, 0xaa
; haribote-os
; TAB=4

		ORG		0xc200			; harybote.sys가 로딩되는 메모리 주소

		MOV		AL,0x10			; VGA 그래픽스, 320x200x8bit 컬러
		MOV		AH,0x00
		INT		0x10
fin:
		HLT
		JMP		fin

 

 

현황

- 부트 섹터 완성

- 본 프로그램 실행하도록 수정

- 목표 : 실제 화면을 띄어 동작하는지 확인해보자

 

 

화면 모드로 전환하기

- 화면모드로 전환 : 비디오 BIOS의 AH = 0x00으로 할 수 있음

- 현재 설정에 따라 320x200x8bit 모드로 부팅됨

 

비디오 모드

- AH = 0x00

- AL = 모드

       0x03 : 16색 텍스트, 80x25

       0x12 : VGA 그래픽스, 640x480x4bit 컬러, 독자 영역 액세스

       0x13 : VGA 그래픽스, 320x200x8bit 컬러, 팩드 픽셀

       0x6a : 확장 VGA 그래픽스, 800x600x4bit 컬러 독자  영역 액세스(비디오카드에 의해 지원 x)

- 리턴값 : x

* AX = 누산기 레지스터

 

 

 

실행결과

- make run 한 결과 화면 모드로 전환되어 커서가 사라짐

 

300x250
728x90
; haribote-ipl
; TAB=4

CYLS	EQU		10				; CYLS를 10으로 정의

		ORG		0x7c00			; 메모리 안에서 로딩되는 곳

; 아래는 표준 FAT12 포맷 플로피 디스켓을 위한 내용들

		JMP		entry
		DB		0x90
		DB		"HARIBOTE"		; 부트섹터 이름. 마음대로해도 ok
		DW		512				; 1섹터 크기(바이트 단위, 512)
		DB		1				; 클러스터 크기(1로 해야됨)
		DW		1				; 예약된 섹터수 
		DB		2				; 디스크 FAT 테이블 수
		DW		224				; 루트 디렉토리 엔트리 수 (보통 224엔트리)
		DW		2880			; 디스크 총섹터수
		DB		0xf0			; 미디어 타입
		DW		9				; 하나의 FAT 테이블 섹터 수
		DW		18				; 1트랙에 몇 색터가있는지
		DW		2				; 헤드의 수
		DD		0				; 파티션 없으므로 0
		DD		2880			; 드라이브 크기 한번더씀
		DB		0,0,0x29		; 필요하다고함
		DD		0xffffffff		; 볼륨 시리얼 번호
		DB		"HARIBOTEOS "	; 디스크 이름
		DB		"FAT12   "		; 포멧이름
		RESB	18				; 18바이트 남김

; 프로그램 본체

entry:
		MOV		AX,0			; 레지스터 초기화
		MOV		SS,AX
		MOV		SP,0x7c00
		MOV		DS,AX

; 디스크 읽기

		MOV		AX,0x0820
		MOV		ES,AX
		MOV		CH,0			; 실린더 0
		MOV		DH,0			; 헤드 0
		MOV		CL,2			; 섹터 2 
readloop:
		MOV		SI,0			; 실패 횟수를 세는 레지스터
		
retry:
		MOV		AH,0x02			; AH=0x02 : 디스크 읽기
		MOV		AL,1			; 1 섹터
		MOV		BX,0
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 디스크 바이오스 호출
		JNC		next			; 에러가 없으면 next로
		ADD		SI,1			; SI에 1더하기
		CMP		SI,5			; SI와 5비교
		JAE		error			; SI >= 5 이면 에러로
		MOV		AH,0x00
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 드라이브 리셋
		JMP		retry
next:
		MOV		AX,ES			; 어드레스를 0x200 더함
		ADD		AX,0x0020
		MOV		ES,AX			; ADD ES,0x020이 없어서 이렇게 함
		ADD		CL,1			; CL에 1 더함
		CMP		CL,18			; CL과 18 비교
		JBE		readloop		; CL <= 18 readloop로
		MOV		CL,1
		ADD		DH,1
		CMP		DH,2
		JB		readloop		; DH < 2 read loop로
		MOV		DH,0
		ADD		CH,1
		CMP		CH,CYLS
		JB		readloop		; CH < CYLS read loop로

; 0xc200번지(hribote.sys)로 점프. 10실린더까지 다 읽어 로드되면 본프로그램 점프

		JMP		0xc200

fin:
		HLT						; CPU 정지 시킴
		JMP		fin				; 무한 루프

error:
		MOV		SI,msg

putloop:
		MOV		AL,[SI]
		ADD		SI,1			; SI에 1 더함
		CMP		AL,0
		JE		fin
		MOV		AH,0x0e			; 한 문자 표시 기능
		MOV		BX,15			; 컬러 코드
		INT		0x10			; 비디오 BIOS 호출
		JMP		putloop

msg:
		DB		0x0a, 0x0a		; 줄바꿈 문자 2개
		DB		"load error"
		DB		0x0a			; 줄바꿈
		DB		0

		RESB	0x7dfe-$		; 나머지칸 0채우기

		DB		0x55, 0xaa

복습

- 이전에 버퍼 세그먼트가 ES = 0x0820, BX =0으로 설정되어 데이터가 로드되는 지점이 0x8200 ~ 0x83ff번지가 됨

- 여기서 0x8000 ~ 0x81ff는 512바이트의 부트섹터 내용이 들어감

 

 

부트섹터에서 OS 본 프로그램 실행하기

- 부트 섹터 맨 앞이 0x8000 번지에 로드되도록 하여 읽어들인 상태

- 디스크를 메모리에 읽어들인 상태로 img의 0x4200(본체 어드레스)는 pc 메모리의 0x8000 + 0x4200 = 0xc200에 위치

 

 

ORG 명령

- 기계어가 실행시 PC 메모리의 어디에 로드 되어야 하는지를 nask에게 알림

- 이 프로그램들을 메모리의 어느 번지에 로드하도록 요청

 

 

부트섹터 완료 후 OS 본 프로그램으로 넘어가기

- ipl.nas 처리 후 next의 맨 아래에 0xc200으로 점프

- haribote.sys의 첫번째 데이터로 넘어감(바이너리 데이터로 haribote.sys의 실제 내용이 어디있는지확인함)

 

본 프로그램 동작

- ipl.nas에서 JMP 0xc200으로 현재 sys파일로 넘어옴

- org 0xc200을 만나 이제 0xc200 지점에서부터 로드하는걸로 설정

; haribote-os
; TAB=4

		ORG		0xc200			; 이 프로그램이 로딩되는 위치?
fin:
		HLT
		JMP		fin

 

make run

- make run 하면 부팅은 되는데 동작하는지는 잘모르겠다.

300x250
728x90

os 본프로그램(본체?) 만들기

- 이전에 만든 어셈블리코드는 부트섹터

- 부트섹터를 제외한 실제 프로그램을 구현해보자

=> HLT하는 단순 프로그램

- 이름은 haribote.nas => nask로 어셈블하여 haribote.sys 만들기

TOOLPATH = ../z_tools/
MAKE     = $(TOOLPATH)make.exe -r
NASK     = $(TOOLPATH)nask.exe
EDIMG    = $(TOOLPATH)edimg.exe
IMGTOL   = $(TOOLPATH)imgtol.com
COPY     = cp
DEL      = rm


default :
	$(MAKE) img


ipl.bin : ipl.nas Makefile
	$(NASK) ipl.nas ipl.bin ipl.lst

haribote.sys : haribote.nas Makefile
	$(NASK) haribote.nas haribote.sys haribote.lst

haribote.img : ipl.bin haribote.sys Makefile
	$(EDIMG)   imgin:../z_tools/fdimg0at.tek \
		wbinimg src:ipl.bin len:512 from:0 to:0 \
		copy from:haribote.sys to:@: \
		imgout:haribote.img


img :
	$(MAKE) haribote.img

run :
	$(MAKE) img
	$(COPY) haribote.img ..\z_tools\qemu\fdimage0.bin
	$(MAKE) -C ../z_tools/qemu

install :
	$(MAKE) img
	$(IMGTOL) w a: haribote.img

clean :
	-$(DEL) ipl.bin
	-$(DEL) ipl.lst
	-$(DEL) haribote.sys
	-$(DEL) haribote.lst

src_only :
	$(MAKE) clean
	-$(DEL) haribote.img

메이크파일코드

- 부트섹터는 ipl.nas, 본 프로그램은 haribote.sys 로 출력

- 처음 512바이트는 ipl.bin으로 이후 영역에 haribote.sys 추가

- 출력 프로그램은 ipl.bin + haribote.sys = haribote.img

- make img 명령으로 파일 작성 완료

 

바이너리 에디터로 보기(어셈블리 코드와 매칭해서 보기)

- 맨 첫 두바이트는 매직 코드

- 다음 바이트는 DB 0x90

- 다음 바이트들은 "HARIBOTE"

- 다음 워드 DW 512 => 0x0200 => 표기는 00 02(리틀엔디언 방식)

...

 

본 프로그램은 어디에 있을까

- haribote.img에서 본 프로그램 haribote.sys 파일명은 0x002600 부근에서 보임

- 파일 내용은 0x004200이후에 나오는듯

 

본프로그램 동작 방법

1. 부트 섹터 로드

2. 부트섹터가 본프로그램 haribote.sys를 실행하면 됨

 

 

300x250
728x90

2020년의 7월이 지나고

 

공부가 하기 싫은 텀 동안

 

내가 한것들을 정리해봤다.

 

 

 

7월에 내가 한것들은

--- 초---

1. 파이썬 로보틱스

2. FastSLAM

3. GraphSLAM

--- 중순---

4. 공업수학

5. 선형대수

6. 최적화

7. IoT 보안

-----말----

8. 컴퓨터 비전

9. openmp 병렬프로그래밍

10. 해킹, os만들기 일부

 

으로 정리할수 있을것 같다.

 

 

6월달

- 확률 로봇공학, 용어정리, 알고리즘, 이산수학, 소형무인비행체

- 위 과목들을 한것보다 상당히 많은 분야를 다룬것 같다.

 

 

 

8월간 할일

1. os만들기

2. 패턴 인식

3. 네트워크, 시스템 해킹

4. 정보 통신 기사

5. VR

6. 차량 보안

7. IoT 프로토타이핑

8. 음성 합성

등을 생각하고 있다.

 

 

정리

 7월 중순경 공업수학, 선형대수, 최적화 이론을 다루고 나서 다른 응용분야 과목들의 이해도가 많이 좋아진 만큼

8월도 목표한 내용들을 잘 따라갈수 있기를 희망한다.

300x250

'미분류' 카테고리의 다른 글

omar  (0) 2020.08.05
2020-08-02  (0) 2020.08.02
2020-08-02  (0) 2020.08.02
카이스트 vr-ar  (0) 2020.08.01
2020-07-31  (0) 2020.07.31

+ Recent posts