본문 바로가기
Project/Embedded

[QEMU] 임베디드 리눅스 시스템 구축 프로젝트 - OpenSBI overview

by FastBench 2024. 6. 11.

이전글

https://microelectronics.tistory.com/68

https://microelectronics.tistory.com/69

https://microelectronics.tistory.com/70

 

원본 게시글

docs : https://quard-star-tutorial.readthedocs.io/zh-cn/latest/

github : https://github.com/QQxiaoming/quard_star_tutorial

 

Bootloader

Bootloader 는 궁극적으로는 OS 를 SoC 에 로드하는 것이 목표인 프로그램이다.

OS 위에서 돌아가는 프로그램이 아니므로, Firmware 의 한 종류이기도 하며, baremetal 로 동작한다.

그 과정에서 IC 내부의 장치를 초기화 (메모리 컨트롤러 ..)하고, OS 를 로드하기 전에 OS 가 필요한 정보를 준비했다가 인자로 담아서 전달해주는 역할도 한다.

 

Bootchain (Multi Stage Bootloader)

현대의 임베디드 시스템은 SOC(System on Chip) 방식으로 발전해왔다. SOC는 단일 CPU 코어뿐만 아니라 다양한 IP(Intellectual Property) 블록들을 포함하는 복잡한 구조를 가지고 있다. 이에 따라 상위 소프트웨어도 기능 영역, 작업 영역, 보안 영역 등으로 나뉘어야 하며, 이를 지원하기 위해 부트 단계도 여러 단계로 확장되었다.

다단계 부트로더는 이러한 복잡한 요구 사항을 처리하기 위해 설계된 것이다. 기본적으로 첫 번째 부트로더를 BL0, 두 번째 부트로더를 BL1, 그 다음을 BL2 등으로 명명한다. 각 단계는 특정한 초기화 작업과 설정을 담당하며, 다음 단계의 부트로더나 운영 체제를 로드하고 실행한다.

  • BL0 (BootLoader 0): 시스템 초기화의 첫 번째 단계로, 기본 하드웨어 초기화와 최소한의 설정을 수행한다.
  • BL1 (BootLoader 1): 보다 정교한 하드웨어 초기화와 시스템 설정을 담당하며, 주로 메모리 초기화와 기본적인 주변 장치 설정을 포함한다.
  • BL2 (BootLoader 2): 운영 체제를 로드하고 실행하기 위한 준비를 마무리한다. 일반적으로 이 단계에서는 파일 시스템을 마운트하고 커널 이미지를 로드한다.

다단계 부트로더를 사용하면 시스템의 복잡성을 줄이고, 각 단계별로 구체적인 작업을 수행할 수 있어 유연하고 안정적인 부팅 과정을 제공할 수 있다.

 

OpenSBI

RISC-V 아키텍처는 다양한 시스템 환경에서 일관된 설계를 지원하기 위해 표준화된 SBI(Supervisor Binary Interface) 규격을 제안하였다. SBI는 시스템의 M 모드(머신 모드)에서 직접 실행되며, 상위 운영 체제에 통일된 시스템 호출 환경을 제공한다. 이는 하드웨어에 직접 접근할 수 있는 최상위 권한을 가지며, 운영 체제가 하드웨어를 제어하고 관리하는데 필요한 인터페이스를 제공한다.

OpenSBI는 이러한 SBI 규격을 구현한 개방형 소프트웨어 프로젝트이다. OpenSBI는 RISC-V 시스템에서 부팅 시 필요한 초기화와 환경 설정을 담당하며, 부트로더와 운영 체제 간의 인터페이스를 제공하여 운영 체제가 하드웨어에 독립적으로 동작할 수 있도록 한다.

  • SBI (Supervisor Binary Interface): 운영 체제와 펌웨어 사이의 인터페이스로, 운영 체제가 시스템 리소스에 접근하고 제어할 수 있도록 지원한다.
  • M 모드 (Machine Mode): RISC-V 시스템에서 가장 높은 권한을 가진 모드로, 모든 하드웨어 자원에 접근할 수 있다.
  • S 모드 (Supervisor Mode): 운영 체제 커널과 같은 고급 소프트웨어가 실행되는 모드로, 일반 애플리케이션은 이 모드에서 실행되지 않는다.

OpenSBI는 PMP(Physical Memory Protection)와 같은 하드웨어 권한 관리 유닛을 제어하여, 시스템을 여러 도메인으로 나누어 상위의 다양한 보안 수준의 다중 운영 체제가 데이터를 침해하지 않고 사용할 수 있게 한다. 다음 그림은 SBI가 S 모드와 M 모드 사이에 위치하는 구조를 보여준다.

 

SBI를 사용하면 다양한 운영 체제들이 일관된 방식으로 하드웨어 리소스에 접근하고 제어할 수 있게 되며, 이를 통해 RISC-V 아키텍처의 유연성과 확장성이 크게 향상된다.

 

OpenSBI는 RISC-V 플랫폼에서의 표준 부트 및 초기화 과정을 정의하고 구현함으로써, 개발자들이 보다 쉽게 RISC-V 기반 시스템을 구축하고 운영할 수 있도록 지원한다. 즉 OpenSBI 는 RISC-V 의 SBI 인터페이스 규격을 구현한 M-mode 에서 동작하는 '펌웨어' 이고, 단순히 SBI 인터페이스만 제공 하는 것이 아닌 표준 Boot 및 초기화 과정 또한 구현되어 bootloader 의 한 부분으로 사용 된다.

 

참고 : OpenSBI Deep Dive https://archive.fosdem.org/2019/schedule/event/riscvsbi/attachments/slides/3058/export/events/attachments/riscvsbi/slides/3058/FOSDEM_RISCV_SBI_Atish.pdf

 

Target Bootloader Design

 

먼저 코드를 작성하기 전에 우리의  multi stage bootload 구조를 설계해야 한다. 사실 RISC-V 문서에는 아래와 같은 일반적인 multi stage bootload 구조를 보여주는 그림이 있다:

 

위 그림에서 볼 수 있듯이, OpenSBI는 상위 시스템의 런타임 시스템 호출을 제공한다.

현재 버전의 OpenSBI 개발자들은 특정 보드를 타겟하여 지원하는 코드(초기화 코드 등..)를 포함시키지 않기를 권장한다. 따라서 OpenSBI 자체도 디바이스 트리 파일을 로드한다.

OpenSBI는 디바이스 트리 파일을 파싱하여 SOC 내부의 하드웨어 구조를 이해하고, 이를 표준 드라이버 코드로 구성하고 사용한다. 이렇게 설계된 OpenSBI는 ARM 임베디드의 오래된 방식과는 달리 SOC 내부 자원이 충분히 넉넉한 현재 상황에서 규격과 규칙을 통해 유지 보수성을 높일 수 있다.

 

디바이스 트리 파일이 어떻게 작성되고 생성되는지 아직 잘 모른다면, 이는 후속 설명에서 다룰 것이다.

왜냐하면 후속 u-boot, 커널 모두 디바이스 트리 파일을 사용하여 드라이버를 구성하기 때문이다.

 

따라서 우리의 시스템은 이전의 maskrom(BL0)에서 시작하여 pflash의 첫 주소에 위치한 lowlevelboot(BL1) 프로그램으로 점프하여 실행된다. BL1은 DDR 메모리 초기화를 수행한 후, pflash에서 OpenSBI(BL2) 프로그램과 필요한 디바이스 트리 리소스 파일을 DDR로 로드하고 실행한다.

 

프로세스를 명확히 이해했다면, 다음 단계는 lowlevelboot 프로그램을 새로 작성하고 OpenSBI를 이식하는 것이다.

댓글