티스토리 뷰

Assembly로 작성된 EntryPoint.s에서 C로 작성된 kernel로 어떻게 넘어갈까?


[ 그림1. C로 만들어진 kernel의 배치 ]


Enty point의 코드는 0x10200 전까지만 채워져 있다. 그리고 Entry point의 마지막 명령어가 jmp $이기 때문에 무한 루프를 돌고 있다.

C로 만들어진 kernel을 주소 0x10200에 올리고 Entry point의 마지막 명령어를 jmp dword 0x08: 0x10200으로 수정하면 kernel이 작동할 수 있을 것이다.


하지만 이러한 계획에는 3가지 제약조건이 있다.

1) C라이브러리 호출 불가

2) 0x10200 위치에 kernel코드 배치

3) kernel 코드는 순수한 바이너리 파일


1)번의 제약조건은 컴파일할 때, gcc에 옵션으로 -ffreestanding을 추가해주면 된다. 물론 라이브러리를 사용하면 안되겠지?

2)번 제약조건은 위에서 이미 설명했는데, EntryPoint.s 파일에서 마지막 명령어를 jmp dword 0x08: 0x10200으로 수정해준다.

3)번 제약조건의 설명은 살펴볼 것이 조금 더 많다.


아래 그림은 목적파일(*.o)들이 섹션통합될 때의 모습이다.


[ 그림2. 섹션 통합 ]


목적파일들은 많은 섹션들을 갖고 있다. 하지만 우리에게 필요한 것은 .text, .data, .bss, .rodata 이것 뿐이다. 이 섹션들만 필요하기 때문에 이 섹션들을 통합파일의 가장 위에 배치할 것이다. 그리고 순서는  .text -> .data -> .bss -> .rodata 순서로 배치할 것이다.

그런데 이러한 배치를 어떻게 할것인가? 이러한 배치를 해주는 놈을 링커(linker)라고 한다. 링커(linker)한테 우리가 원하는 데로 배치해달라고 해야하는데, 이러한 명령들을 링커스크립트(linker script)라고 한다. 그러니 링커(linker)는 링커스크립트(linker script)를 보고 목적 파일의 센션을 배치하는 것이다. 링커는 기본 링커스크립트를 가지고 있다. 이것을 리눅스에서 확인할 수 있는데, 시스템 환경마다 다를 수 있으니 find 명령을 이용해보자. 디폴트링커스크립터의 이름은 elf_i386.x이다. sudo find / -name 'elf_i386.x'로 검색하면, /usr/lib/ldscripts/ 디렉토리 아래에 있다. 이것을 복사해서 사용한다. 그리고 이 스크립트를 책의 203페이지처럼 수정했다. 필요한 섹션을 앞으로 옮기면 된다.


링커(ld)로 생성된 실행파일은 우리에게 필요없는 섹션과 내용도 포함하고 있다. 


[ 그림3. 보호 모드 커널 이미지 생성 과정 ]

이 파일이 그림 3의 Kernel32.elf에 해당한다. 이 파일을 우리가 원하는 섹션(.text, .data, .bss, .rodata)만 추출하기 위해서 GNU의 OBJCOPY라는 프로그램을 이용한다. gcc에 포함된 프로그램으로 설치할 필요는 없다. objcopy -j .text -j .data -j .rodata -j .bss -S -O binary Kernel32.lef Kernel32.bin 로 명령을 내리면 된다. 이후에 EntyPoint.bin과 파일을 합치면 된다. 당연히 EntryPoint.bin파일이 앞에 와야한다.


EntryPoint.bin 파일과 Kernel32.elf.bin 파일을 합치는 방법으로 cat을 이용할 수 있다. cat EntryPoint.bin Kernel32.elf.bin > Kernel32.bin 로 명령을 내릴 수 있다. 책에서는 이런식으로 만들어서 Qemu로 돌리면 오류가 뜬다고 하는데, 문제없이 잘 돌아간다.

하지만, Kernel32.bin가 섹터 단위로 맞춰지지 않아 메모리 주소를 정확히 알기 어렵기 때문에, 섹터단위로 맞추는게 좋을 것같다. 이 방법은 책에 자세히 설명되어있다. ^^

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함