Search

'CLKH64 OS/07장'에 해당되는 글 4건

  1. 2013.01.07 7장 대략적인 설명 2

7장 대략적인 설명

CLKH64 OS/07장 2013. 1. 7. 00:12 Posted by 알 수 없는 사용자

1. 7장에서 도대체 무얼 하는건가?

수원 성대 카페베네에서 1-5장 스터디

7장에서 목표로 하는 바는 딱 두가지임.

- C언어를 사용할 수 있게 만들기

- 파일 사이즈에 따라 BootLoader.asm 에 있는  TOTAL_SECTOR 숫자를 알아서 바꾸게 하기.

2. C언어를 쓰자.

C언어를 쓰려면, 일단 컴파일러가 있어야 함.

근데 우리는 2장에서 이미 GCC를 깔았으니까..패스하고

 

7장 첫부분에 나오는 그림을 잘 보면

어셈블리 코드를 어셈블러로(NASM) 컴파일하면, Object(.o)파일이 나옴

C코드를 C컴파일러로 컴파일하면, Obejct(.o)파일이 나옴.

 

따라서 이 파일들로 바이너리(보통 바이너리라고 말하면 운영체제 위해서 돌아가는 실행파일을 말함.)을 만들기 위해

링크, 우리는 GCC를 쓰니까 LD를 이용해서 링킹을 해야함.

 

근데, 여기서 주의해야 할 점이. 어셈블리어에서 C코드로 넘어가기때문에

C코드의 시작주소를 0x10200로 셋팅 해 주어야 하므로,

기본적인 링커 스크립트를 사용해서 디폴트 링킹이 아니라

사용자 정의 링킹을 수행하기 위해 링커 스크립트를 고쳐 주어야 함.

(섹션 재배치도 해야함.)

 

그리고 ObjCopy를 이용해 사용할 섹션만 뽑아내므로

우리가 사용할 bss, text, rodata, data등은 제일 앞에 위치 해야함.

왜냐하면 뒤에있으면 메모리 주소가 가운데 껴있는 거 만큼 올라가는데,

실제 중간부분을 뽑아내 버리면, 나중에 메모리 올라갈때는 중간부분만큼 값을

뺀 값이 실제 메모리 값이 되기 때문(말로하니까 존나복잡한데 그냥 그림그려서 생각하삼)

 

따라서 뽑아낼 섹션을 연속적으로, 가장 앞에 위치 하지 않도록 하면

메모리 오프셋이 링커때 결정된것과 실제 올라간것이 달라져서 오류가 남.

 

자, 이제 링킹을 끝내면 Kernel32.elf 라는 elf 포맷이 생기는데..

스터디에서도 누차 언급했지만, elf는 리눅스에서 쓰는 바이너리 포맷임. 다시 말해서 리눅스 운영체제나

elf를 해석할 수 있는 무언가가 탑재되어야만 굴릴 수 있음 따라서 이를 위한 (우리에겐)쓸데 없는 정보도 있으므로

코드와 데이터 영역만 뽑아내기 위해 ObjCopy를 시전!

 

그러면 결과로 Kernel32.elf.bin 이라는 기계어 바이너리(운영체제 없이도 CPU가 이해할수 있는)가 만들어짐.

그리고, 이 기계어 바이너리를 BootLoader.asm 으로 만든 BootLoader.bin 기계어 바이너리 뒷부분에 붙임으로써

Disk.img를 만들 수 있다.

 

3. ImageMaker.exe 는 뭘 하는건가?

책에도 나오지만 BootLaoder.bin이 하는 일은 자신의 사이즈(TOTALSECTORNUMBER?)로 지정된

섹터만큼을 자신의 이미지에서 읽어서 메모리에 올리는데,

이 값이 지정된 상수값이라서 파일 크기가 매번 커질때마다 이 값을 수정해 줘야함.

 

따라서 이걸 자동화 하기 위해 ImageMaker.exe 는 파일의 이부분을 찾아서 적절한 파일 사이즈로

값을 변경 해 준 후

 

BootLoader.bin 과 Kernel32.bin 를 합쳐줌.

 

 

ImagerMaker가 C파일이라 이해가 안될텐데

이 파이썬 파일을 보면 더 이해가 쉬움.

파이썬 언어랑 상관없이 그냥 주석이랑 변수 이름으로 해석하셈.

 

http://64bitos.tistory.com/14

 

 

 

 

'CLKH64 OS > 07장' 카테고리의 다른 글

파이썬으로 만든 ImageMaker  (0) 2013.01.02
Makefile  (1) 2013.01.01
링커스크립트  (0) 2013.01.01