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 실행하며 디버깅 준비
'컴퓨터과학 > os' 카테고리의 다른 글
navilos - 6. 익셉션 핸들러 구현2, 메인함수 진입 (0) | 2022.08.18 |
---|---|
navilos - 5. 익셉션 핸들러 구현 1 (0) | 2022.08.17 |
navilos - 4. 어셈블리어 공부하며 본 초기코드 (0) | 2022.08.17 |
navilos - 3. 메모리맵 (0) | 2022.08.17 |
navilos - 1. 개요와 개발환경 구축 (0) | 2022.07.17 |