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

https://wiki.osdev.org/Expanded_Main_Page

+ Recent posts