ARM 아키텍처의 동작 시작

- 전원 인가시 리셋 벡터 메모리 주소 0x00000000의 명령 실행

 

 

시작점 만들기

- boot 폴더에 Entry.S 파일 만들고 다음과 같이 작성

- .text는 .end까지 텍스트 섹션을 의미

- .code는 명령어 크기가 32비트를 의미

- .global은 C언어의 extern 역활 => vector_start, vector_end 주소를 외부에서 읽기 가능

- MOV R0, R1 : R1을 R0에 담고

- .space 1024, 0 : 해당 위치부터 1024바이트를 0으로 채우기

 

* hexdump 데이터를 16진수로 표현

컴파일 및 핵스 덤프보기

- arm-none-eabi-as : 어셈블리어 소스 파일 컴파일

- armv7 아키텍처 coretex-a8 코어 cpu(RealViewPB)로 Entry.S의 목적파일을 만듬

- 목적파일에는 심벌 정보를 포함하여 objcopy로 바이너리만 추출 -> hexdump로 바이너리 확인

- 0001 e1a0는 MOV R0, R1

 

 

실행파일 ELF 만들기

- 실행 파일을 만들려면 목적 파일과 링커 필요, 링커에 정보를 전달하는 링커 스크립트 필요

*  운영체제는 링커스크립트제공하나 펌웨어 개발시에는 펌웨어 동작 HW에 맞게 펌웨어 섹션 배치 필요

 

링커 스크립트

- ENTRY 지시어 : 심벌 지정, 1번 줄에선 vector_start 심벌 지정

- SECTION 지시어 : 섹션 배치 설정 정보

- .=0x0 : 첫섹션이 메모리 0x00000000에 위치

- .text : 텍스트 섹션 베치 순서 정보, vector_start 심벌이 나온 후 .text 섹션 배치

- 그 뒤 data 섹션과 bss 섹션 메모리에 배치

 

실행파일 만들기

- arm-none-eabi-ld에 -n 옵션(섹션 자동정렬 no), -T(링커 스트립트 지정), -nostdlib(표준라이브러리 링킹x)

  -> 링킹 결과 navilos.axf 생선

- arm-none-eabi-objdump -D로 디스어셈블 한 결과

 ->  vector_start가 0x00000000에서 시작하며, mov r0, r1 명령어(기계어로 e1a0 0001)가 잘 들어가 있음

 

 

 

QEMU에서 실행하기

-M으로 realview-pb-a8 기계 지정

-kernel로 실행할 elf 지정

-S는 실행하자마자 정지

-gdb tcp::1234,ipv4는 gdb와 연결하도록 소켓 포트 지정

* gdb로 동작하는지 메모리확인하기 위함

 

 

gdb 사용하기

arm-none-eabi-gdb가 안보여서 그냥 gdb-multiarch를 사용했다.

첫 바이트에 0xe1a00001이 나오고 그 뒤에는 0x00000000이 쭉 나오니 잘 올라갔다.

 

 

빌드 자동화 Makefile 작성폴더의 

- 11번 줄 : boot폴더의 *.S 파일들 모두 ASM_SRCS에 담기

- 12번줄 : boot 폴더의 *.S 파일들을 .o로 바꾸고 디렉터리도 build로 변경 + 기존의 ASM_SRCS들

- 33 ~ 35번줄 : navilos.axf, navilos.bin 생성

- 37 ~ 39번줄 : *.S를 *.o로 컴파일

 

빌드 및 실행하기

- 빌드한 결과 build 폴더에 목적 파일과 실행파일이 위치

- make debug로 qemu 실행하며 디버깅 준비

 

+ Recent posts