본문 바로가기

Firmware/RTOS

임베디드 OS 개발 프로젝트 1

http://www.yes24.com/Product/Goods/84909414

임베디드 OS 개발 프로젝트  무작정 따라하기(저자:이만우) 책 구매후 시작..

 

책에서 쓰는 QEMU는 ARM64 리눅스 분석에 사용한적 이 있음

 

다만 여기선 QEMU-SYSTEM-AARCH64 -> QEMU-SYSTEM-ARM 으로 사용함.

 

RTOS를 만들기 위해 처음으로 제작하는 파일은 ENTRY.S 파일이다.

 

WHY??

 

ARM 코어에 전원이 들어가면 리셋 벡터에 있는 명령을 실행한다.

0x00000000 주소 시작한다.

 

현재 작성된 Entry.S 코드

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
32
33
.text
        .code 32  
 
        .global vector_start
        .global vector_end
 
        vector_start:
        LDR R0, =0x10000000
        LDR R1, [R0]
        vector_end:
        .space 1024,0x11
.end
 
/* R0 에 0x10000000 메모리 주소를 읽어 오는 이유는 realviewPB 데이터시트에 0x10000000 = ID Register 이기 때문에다.
 
아래 그림은 SYS_ID REGISTER 구조이다                    
 
|31   28|27      16|15     12|11      8|7      0|
-------------------------------------------------
|  REV  |   HBI    |  BUILD  |  ARCH   |  FPGA  |
-------------------------------------------------
 
REV: 보드 버전 
HBI: 보드 번호
BUILD: 보드 빌드 변형
ARCH: 버스 아키텍처
FPGA: FPGA 빌드
 
모두 읽기 전용 비트이다.
 
 
*/
~        
cs

.global 은 c언어 지시어인 extern을 뜻한다.

.code에 32는 32bit 이며 명령어의 길이를 나타낸다..dd

.space 1024,0 은 해당 위치부터 1024byte를 0으로 채우라는 뜻이다.

 

따라서 위 코드를 실행하였을 때

 

실제 메모리는 다음과 같다.

 

앞서 코딩한 2개의 명령어가 Vector_start에 들어가 있으며 .code로 32bit를 즉, 4byte 이므로 8byte 를 잡고 있고

나머지 1024byte(0x400)이 0x11로 초기화 되어 있다.(실제 사용한 메모리는 Vector_start(0x08) + Vector_end(0x400) = 0x408)

 

 

명령어를 아래와 같이 추가한다면.

 

        vector_start:
        LDR R0, =0x10000000
        LDR R1, [R0]
        LDR R2, [R0]
        MOV R3, R2
        vector_end:
        .space 1024,0x11

 

Vector_start 가 늘었으므로 메모리 역시 그만큼 늘어난다.