Moon OS는 라즈베리파이3 타겟으로 ARM기반 OS 공부를 위해 시작하는 프로젝트입니다.
github : https://github.com/EuiSeong-Moon/Firmware/tree/master/Moon
1. BCM2837
라즈베리파이 3에 사용되는 SoC chipset이다.
라즈베리파이는 1,2,3,4 시리즈가 존재하며 라즈베리파이3의 경우 Main SoC chipset이 BCM2837이다. 해당 chipset은 Quard core 기반이다.
2. boot.S
Boot.S는 어셈블리어파일로 가장 처음 부트로더가 OS를 올리기위해 시작하는 진입점에 위치한 파일이다.
해당 소스코드는 OS Dev 의 라즈베리파이 Bare bone코드 참조하여 작성하였습니다.
해당 소스코드를 보면 0x80000으로 셋팅된 것을 볼 수 있는데 라즈베리파이3의 경우 virtual address와 연결되는 physical base값이 0x80000이다.
이후 메모리 영역에 대한 셋팅 bss의 클리어 등의 작업을 진행하고 있다.
해당 작업들은 앞서 언급한 바와 같이 부트로더가 OS로딩을 위해 커널을 로드할 때 진입점에 해당하는 소스코드로 가장 기본적으로 메모리에 대한 부분을 set 및 clear하고 있다.
.globl _start .org 0x80000 _start: // set stack before our code ldr x5, =_start mov sp, x5 // clear bss ldr x5, =__bss_start ldr w6, =__bss_size 3: cbz w6, 4f str xzr, [x5], #8 sub w6, w6, #1 cbnz w6, 3b // jump to C code, should not return 4: bl kernel_main // for failsafe, halt this core too 1: wfe b 1b |
기본적으로 위와 같이 어셈블리어 코드를 통해 메모리 영역을 확정을 지어야만 정상적으로 c 파일을 스택 영역에 올릴 수 있다.
즉 위 작업 진행 전에는 c언어 코드를 사용할 수 없다(기본적으로 c언어는 text에 올려 stack을 통해 할당해서 사용하는 방식으로 메모리에 대한 기본 set이 우선적으로 필요하다)
3. Kernel.c
Kernel.c는 UART등 BCM2837에서 h/w에 접근하고 기능들을 사용하기 위해 미리 정의된 각 위치별 address값을 셋업하고 있다. 특히 여기서는 기본적으로 UART에 대한 부분을 정의하고 있다.
case 3: MMIO_BASE = 0x3F000000; break; // for raspi2 & 3 |
기본적으로 raspi3에서는 0x3F000000를 base로 GPIO를 구성하기 때문에 위와 같이 Base address 값 설정이 필요하다.
모든 주소 값은 밖에서볼 때는 virtual address로 셋되기 때문에 정상적으로 physical address에 접근하기 위해서는 MMIO_BASE를 정의하고 해당 값을 기준으로 아래와 같이 접근하도록 구현해야 한다.
static inline void mmio_write(uint32_t reg, uint32_t data) { *(volatile uint32_t*)(MMIO_BASE + reg) = data; } // Memory-Mapped I/O input static inline uint32_t mmio_read(uint32_t reg) { return *(volatile uint32_t*)(MMIO_BASE + reg); } |
4. Makefile
Bare bone코드에서 컴파일러는 aarch64-elf를 사용했기 때문에 해당 컴파일러를 사용하는 Makefile을 만들었다.
ARMv8부터는 64bit를 지원하며 BCM2837 Raspi3역시 64bit를 지원하기 때문에 해당 Moon OS project는 64bit기반으로 작성을 진행하고자 한다.
- Ref
'OS > Firmware Project' 카테고리의 다른 글
[MOON OS] Moon OS Project (3) - Interrupt 1 (0) | 2021.09.26 |
---|---|
[MOON OS] Moon OS Project (2) - GPIO (0) | 2021.09.20 |
[OS] Firmware Project (8) - Event (0) | 2021.08.02 |
[OS] Firmware Project (7) - Task (0) | 2021.07.25 |
[OS] Firmware Project (6) - Interrupt (0) | 2021.07.17 |