일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- Djikstra
- 프로그래머스
- 응용 계층
- dp
- Database
- 자료구조
- 백준
- ps
- leetcode
- 임베디드
- Transport layer
- Network
- BHS
- 릿코드
- boot sequence
- BST
- 관계형 모델
- 데이터베이스
- Embedded
- Application Layer
- 부트시퀀스
- 전송 계층
- 다익스트라
- swea
- C++
- 문제풀이
- STL
- DB
- baekjoon
- 네트워크
- Today
- Total
BOBO's Note
Bare Metal 본문
Bare Metal
Bare Metal은 운영체제가 설치되어 있지 않은 컴퓨터 하드웨어를 의미한다. Bare Metal Programming은 운영체제 없이 바로 하드웨어를 제어하는 형태의 프로그래밍이다.
임베디드 시스템에서는 운영체제를 구동하는 것 자체도 오버헤드가 큰 작업일 수 있다. 또는 특정 하드웨어를 오직 한 애플리케이션에서만 제어하기 때문에 굳이 OS로 자원을 관리해줄 필요가 없는 경우도 있다. 이런 경우, 베어 메탈 프로그래밍을 통해 하드웨어를 제어하는 것이 더 좋다.
베어 메탈 프로그램을 이미지로 만들어서 하드웨어에 포팅한다. 부팅 단계에서 커널 이미지 대신에 우리가 개발한 이미지로 실행되도록 한다(이런 관점에서 커널도 일종의 베어 메탈 프로그램이라 볼 수 있다).
예제 코드
베어 메탈 프로그래밍에서 C 프로그램을 개발하더라도, main() 함수를 실행시킬 수 있도록 전처리를 직접 해주어야 한다. 원래는 운영체제가 이러한 기능을 대신 해주었지만, 베어 메탈에서는 운영체제가 없기 때문에 개발자가 직접 어셈블리를 이용해 개발해주어야 한다. 기본적으로 두가지를 처리해주어야 한다.
- C 프로그램이 사용할 스택 세그먼트의 주소로 sp를 지정해주어 한다.
- main 함수로 jump 한다.
코드로 표현하면 다음과 같다. ARM 아키텍처를 사용하는 라즈베리파이 3B+를 기준으로 한다.
.global _start
_start:
mov sp, #64*1024*1024
bl my_main
hang:
b hang
우선 startup 코드에 해당하는 _start 레이블을 해당 파일의 외부에서도 찾을 수 있게 .global 키워드를 붙여준다. sp에 64MB 주소를 저장하고, c_main() 함수로 jump했다가 끝나면 다시 돌아온다. 그리고 hang 레이블에서 무한루프를 돈다. 무한루프를 도는 이유는 임베디드 시스템이기 때문이다.
'Embedded System' 카테고리의 다른 글
Linux에서의 전력 관리 (0) | 2020.06.17 |
---|---|
GPIO (0) | 2020.06.04 |
Interrupt Handler (0) | 2020.06.03 |
Kernel Module과 Device Driver (0) | 2020.05.29 |
Android Boot Sequence (0) | 2020.05.26 |