임베디드 OS 개발 프로젝트

개발에 들어가기에 앞서

"임베디드 OS 개발 프로젝트" 책 내용을 따라가며 베로그 포스팅을 진행할 예정이다. OS를 직접 코딩해 타겟보드에 올림으로 운영체제와 시스템의 전반적인 내용을 배우고 실습하는 내용의 책이다.

개발환경은 리눅스시스템이어야 하는데

컴린이 본인은 ubuntu16.04를 올린 aws ec2를 putty와 연결하여 작업했다.

또한, 실제 보드를 구매하기가 어렵기 때문에 QEMU를 다운받아 가상보드에 작업했다.

Entry.S

  • 파워가 들어오면 코어는 가장 먼저 0x00000000 주소의 커맨드를 실행한다. Entry.S로 가장 먼저 실행되어야 할 코드를 짠다.

Entry.S 어셈블리 코드 파일과 navilos.ld 링커스크립트를 만들고 컴파일하여 QEMU로 올려보는 작업을 진행한다.

Entry.S 소스코드


.text

   .code 32


   global vector_start

   .global vector_end
 
  
   vector_start:

      MOVR0, R1

  vector_end:

   .space 1024, 0

.end


  • .text 는 .end 가 나올 때 까지 모든 코드가 text섹션이라는 의미이다.

  • .code 32 means size of command is 32bits.

  • .globle 는 vector_start 와 vector_end의 주소정보를 외부파일에서 symbol로 읽을 수 있게 한다.

  • .space 1024, 0 은 해당 위치부터 1024바이트를 0으로 채우는 명령.

(현재 Entry.S는 딱히 의미있는 소스코드는 아니다. 일단 링커스크립트와 컴파일해서 QEMU에 올려보고 gdb로 컴파일 하는 단계가 제대로 되는지 보는 과정이다.)

실행파일 만들기

QEMU에서 펌웨어 파일을 읽어 부팅하려면 바이너리 파일이 ELF형식이어야 한다. Linker를 통해 ELF파일 형식을 정할 수 있다.

Linker는 여러 오브젝트 파일을 묶어서 하나의 실행파일로 만드는 프로그램이다.

링커스트립트를 먼저 만들어야 한다.

ENTRY(vector_start)
SECTIONS
{
	. = 0x0;


	.text :
	{
		*(vector_start)
		*(.text .rodata)
	}
	.data :
	{
		*(.data)
	}
	.bss :
	{
		*(.bss)		
	}
}
. = 0x0; 

은 첫 번째 section이의 메모리 주소를 0x00000000 으로 정하는 명령이다.

그 이후에 나오는 코드는 section의 배치 순서를 알려준다.

text

data

bss

순서로 메모리에 위치한다. text 괄호 안에서 vector_start 를 가장 먼저 배치했으므로 0x00000000에는 vector_start가 위치한다.

좋은 웹페이지 즐겨찾기