[yummyHitOS] 2 day (2017.07.01)

3 분 소요

책의 4장은 기본 디렉터리 구조 및 부트로더를 만들어 qemu를 이용한 부팅을 실행해 보는 것!!

먼저 이클립스에서 프로젝트를 생성하는데, 책과 달리 자신만의 이름으로 하는 것이 개성적일 것이라고 생각한다.

(그래서 필자는 yummyHitOS 이름으로 프로젝트 생성!)

그리고 프로젝트 내부에 기본 디렉터리를 구조적으로 생성하는데, 이 구조는 저자와 동일하게 가는게 좋을 것 같다! 왜냐하면.. 처음부터 전부 개성있게 하기에는 점점 머리가 아프다는... 나중에 막 다른거 잔뜩있고 ㅜㅜ


뭔가 쓸데없는 말이 길었던 것 같은.. 아리마셍..

Makefile

이 책에서 makefile을 만드는 것은 정말 인상적이었다!! 평소에 리눅스를 사용하던 나는 Makefile이 있어야 make 명령어를 이용할 수 있다는 것 외에 Makefile을 살펴볼 용기가 나지 않았는데, 이를 직접 만지다니 쉬우면서도 재밌는 것!!!


makefile의 규칙으로는 python과 비슷한 느낌이 들었다.

첫째로 규칙(makefile에서는 Target이라고 부른다)을 정의하고, 둘째로 들여쓰기를 통해 규칙에 따른 수행할 코드(수행할 명령)를 구현한다. 예를 들면,



위와 같이 규칙을 만들어 makefile을 저장하고, make 명령을 수행하면 main.c 파일(기본 printf("Hello World!\n"); 함수가 있는 C언어 파일을 만드는 것이 테스트용으로는 딱!!)을 먼저 object파일(.o 확장자 파일)로 변환한 후, exe파일로 만들어준다!!


여기서 gcc 명령 대신 make 명령 및 cp 등의 리눅스 기본 명령어를 이용해 어셈블리어를 바이너리 파일로 변환시키고, 바이너리 파일을 디스크 이미지에 write 한 후 이를 읽어 OS 이미지를 보이게 하도록 makefile을 제작하는 것이 우리의 OS 개발에 필요한 것!!


이렇게 말하면 뭔가 대단하고 멋진것 같지만.. 실제로 하면 뭔가 없다.. 허전허전 ㅜㅠㅜ

모든 소스파일은 좌측 하단의 필자 github Page에 yummyHitOS Repository로 올려두었다!! 사실 저작권은 둘째 치고 이거 전부 복사해서 붙이면 모양새 빠지고.. 그렇다고 캡쳐하기엔 좀 길어서 일처리가 귀찮....헿ㅎ헤헤


BootLoader

BootLoader.asm 어셈블리어 파일을 보면 START레이블이 0x07C0부터이며 16비트 모드를 시작으로 스택을 생성하기 때문에 SS 레지스터를 0x0000으로 설정하여 0x10000(64KB)만큼의 크기를 스택 영역으로 지정한다.

그리고 디스크의 내용을 메모리로 복사할 ES:BX 영역을 0x10000으로 설정하기위해 SI 레지스터(인덱스 레지스터로써 Source Index의 약자이고, 여기서는 인덱스 주소지정을 위해 사용된다)에 0x1000 값을 넣고, 이를 다시 ES 레지스터(메모리 주소지정을 다루는 SI, DI레지스터와 함께 사용된다)에 대입한다.

이 후 bx 레지스터(주소지정 확장을 위해 인덱스로 사용될 수 있는 레지스터)에 0x0000값을 넣어 ES:BX 영역의 값이 0x1000:0000이 되어 0x10000(64KB)크기로 설정!!


이 부분이 머리로 이해가 잘 되지 않아 정말 열심히 찾아보았다.. 왜 0x1000:0000의 범위가 갑자기 0x10000이 되는지.. 왜 꼭 SI 레지스터를 거쳐 ES 레지스터로 가야하는지...

리버싱 공부를 한 지 2개월이 되었지만 아직도 잘 모르는 레지스터의 향연.. 아직 나는 정말 멀었구나 생각이 다시 한 번 들었다.

자책은 여기까지!! 이 부분을 이해하려면 역시 그림이지!!

라고 생각하고 구글링으로 열심히.. 열심히.. 이미지파일을 찾고.. 찾아도 왜 안나오닝 나 뭐 잘못했닝 내가 그렇게 구글링을 못하닝 ㅜㅠㅜ마상.. 맴찢 ㅠㅜㅠ 그리하여 역시 갓승훈 선생님의 책에 나온 그림을 찰칵! 이거 도촬아님! 일걸요?.. 헤헿 봐주세용 ㅠㅜㅠ



color

그리고 Message를 출력하는 함수를 call하기 전 push하는 부분이 있는데, Message 출력 함수를 조금 조정하여 (출력 문자를 받아 출력시켜주는 byte [ es:di ], cl 부분에서 di에 1만큼 증가시키면 색을 조정할 수 있다!!


0x00(검정색) / 0x01(남색) / 0x02(초록색) / 0x03(청록색) / 0x04(버건디색)

0x05(자주색) / 0x06(갈색) / 0x07(회색) / 0x08(쥐색)

0x09(연한 파란색) / 0x0A(밝은 초록색) / 0x0B(파란색)

0x0C(빨간색) / 0x0D(분홍색) / 0x0E(노란색) / 0x0F(흰색)


더 많은 색이 있을까.. 직접 값을 대입하는 방법 외에 어디에 정의되어있는가.. 전혀 찾지 못하겠다.. 2비트 부분은 바탕을 의미하고 1비트 부분은 글자를 의미하므로 책에 기본적으로 0x0F 로 되어있는 흰색 부분을 임의적으로 0xE5 와 같이 바탕과 글자를 같이 설정할 수도 있으니 참고하면 좋을 것 같다!!우리는 개성공단에서 온 개성있는 개성파 OS개발자들 이니깐...데헷-☆

(참고로 저기에 적힌 색은 필자가 임의로 이름 붙인 색... 추후 헤더파일을 만들다 보면 Bright Yellow, Dark Green 등의 색 이름이 나온다. 그게 진짜 이름이겠지?)


그게 아니라.. 책에 적혀있는 nasm.us/doc 페이지에 게재되어있는 문서들을 읽기도 어려울 뿐더러ㅜㅜ 색깔 찾는것은 검색조차 되지 않아서 포기.. 필자는 purple or violet 색을 무지 좋아하는데, 필자가 좋아하는 색이 전혀 보이지 않는다!!

또한, % 문자로 시작하는 전처리문 외 조건문 등이 게재되어 있으니 필요하다면 직접 찾아서 보기를...!!(되게 보여주기 귀찮아 보이고 성의 없어 보이지만.. 사실 필요하지 않아서 직접 찾아보지 않은 1ㅅ)


pcString

이렇게 메시지를 출력할 수 있는 부분을 C언어를 통해 함수 구현만 해둔 곳이 책에 있는데, 이름하야 pcString()함수!! 이 함수를 기준으로 스택의 상태 변화는 다음과 같따!



이렇게 기본적인 부트로더를 완성시킨 후, 이클립스상 좌측 상단 2번째 메뉴바의 3번째 버튼(곡괭이 모양)을 클릭하면 Build만 실행할 수 있다!

Build를 수행한 후 qemu 배치파일을 실행하면 우리가 만든 것이..ㅠㅜㅠ 드디어..ㅠㅜ 아 이 맛을 위해 내가 OS개발을 시작했구나ㅜㅠ 라고 느낄 수 있을 것이다!!



필자는 yummyHitOS 답게 알록달록...☆ 너무 이쁜 것 같아 뿌듯하다!!

이렇게 책의 5장까지 나가보았다.

(5장에서 플로피 디스크를 활용하는 VirtualOS.asm 이라는 파일을 생성하여 1024바이트 크기만큼의 숫자를 출력하는 disk.img를 쓴 후 이것을 읽어 띄워주는데, 추후 필요하지 않은 작업이라 생략~~ 필자가 너무 생략을 좋아하는 것 같지만 스스로는 모든 작업을 삽질해보며 공부하였기에, 직접 만져보고, 삽질해보며 시간을 들인다면 뜻깊은 OS를 만들 수 있을 것이라 확신한다! 화이팅!)


이렇게 화이팅! 이라고 말해두고 끝나면 뭔가 이사람 되게 대충 포스팅하네..성의도 없고 이사람 믿을 수 있을지몰라~ 이거 그냥 책에 있는거 그대로 막 끄적이는거 아니야? 저작권침해? 신고해버려? 싶을까봐 책이 없는 분들을 위해 간단한 떡밥용 캡처파일을 투척해야할 것 같다.



이 그림을 보고 가상 OS 이미지 소스코드를 어셈블리어로 짜시는 분은 제게 가르침을 주시옵소서.. 저는 기계가 되고싶은 사람 yummyHit입니다!! 요로시쿠 오네가이시마쓰☆ 이쁘게 봐주세요 데헷-☆존경합니다 배우고 싶습니다 사랑합니다 갓느님..


Check out the yummyhit’s website for more info on who am i. If you have questions, you can ask them on E-mail.

카테고리:

업데이트:

댓글남기기