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 가 늘었으므로 메모리 역시 그만큼 늘어난다.
'Firmware > RTOS' 카테고리의 다른 글
임베디드 OS 개발 프로젝트 5 (0) | 2020.01.26 |
---|---|
임베디드 OS 개발 프로젝트 A-1 (2) | 2020.01.25 |
임베디드 OS 개발 프로젝트 4 (0) | 2020.01.25 |
임베디드 OS 개발 프로젝트 3 (0) | 2020.01.18 |
임베디드 OS 개발 프로젝트 2 (0) | 2020.01.18 |