Moon OS Project를 진행하면서 여러 가지 업무로 인해 빠른 진행을 하지 못했다.
앞으로 상황도 크게 달라질것 같진 않으며.. Linux Kernel v5.14.16 분석을 병행하며 진행하다보니 속도가 조금 더 느려질 것 같다.
Moon OS Project를 reminder하는 관점에서 다시 되돌아보면
기존에 boot, GPIO, interrupt를 진행하고 있었고 interrupt를 진행하던 중 IRQ를 어떻게 임의로 설정할 수 있을지에 대한 의문을 가지게 되었었다.
IRQ에 관련된 부분은 Device Tree를 통해 미리 define된다는 것을 확인할 수 있었고 해당 Device Tree는 bootloader에서 부팅 초반과정에서 dtb binary파일로 만들어 x0 register에 등록하고 사용하는 것을 LInux kernel 분석과정을 진행하면서 알 수 있었다.
하지만 위 과정을 진행하면서 추가적인 의문이 들었다.
PC가 처음 부팅될 때 Power on -> Bootloader -> kernel image load와 같이 동작되는데 여기서 kernel이란 무엇이고 OS란 무엇일까 kernel load가 곧 os load를 말하는 것일까? 아니면 kernel load후 다시 os를 load하는 것일까?
또 어디까지가 boot loader의 역할이고 어디까지가 kernel의 역할인가 하는 의문이 들었다.
관련해서 고민하고 조사해본 결과 아래와 같은 결론을 얻었다.
Boot Loader가 실행되고 기본적인 exception, device tree 등의 설정을 진행한다. 과정에서 virtual memory, MMU과정도 진행하는 것 같다 왜냐하면 kernel image를 vmlloc영역으로 할당해서 저장하는 것으로보아 MMU까지의 모든 메모리 설정 작업이 끝난 뒤 kernel load를 진행하는 것 같다.
그리고 kernel load가 곧 OS load를 의미한다. kernel의 역할이 OS의 일부분을 load하여 동작하는 것이기 때문에 kernel이 곧 OS 그자체를 의미하는 것으로 해석하면 될 것 같다. OS는 엄청난 크기의 바이너리이기 때문에 한 번에 메모리에 모두 올릴 수 없다. 때문에 메모리 커널영역에 OS를 일부 사용할 때마다 해당 영역을 load하고 사용하는 것이다.
이렇게까지 정리하고 나니 Moon OS Project진행에 대한 의문이 한 가지 더 생겼다. 나는 부트로더 코드를 작성한적도 device tree를 작성한적도 없는데 어떻게 QMEU를 통해 실행을하면 IRQ와 같은 셋팅이 모두 되어있을까?
실제 H/W라면 SoC로 H/W만 set up되어있고 부트로더나 이런건 없을텐데 과연 Raspi 3 H/W에서 내가 만든 img파일을 로드하면 같은 동작을 얻을 수 없어야 하지 않을까?
정답이다..! 내가 만든 것은 부트로더나 이런것이 아니다. kernel image를 만든 것 뿐이다.
즉 Rasberry pi 3에서 정상동작하기 위해서는 u-boot이나 다른 부트로더가 존재해야 하고 내 kernel image를 올려주도록 해야하는 것이다.
이를 위해 https://wiki.osdev.org/Raspberry_Pi_Bare_Bones 의 raspi 3 에서 bare bone kernel image를 로드하는 방법을 확인한 결과 먼저 raspi os를 다운 받아서 DTB, BootLoader등을 모두 다운 받고 kernel image만 교체 해줌으로써
내가 만든 OS를 실제 raspi 3에 로드할 수 있었다.
여기서 32bit의 경우 kernel7.img, 64bit의경우 kernel8.img로 로드해줘야 한다고 한다.
마지막으로 덤을 붙이면 Raspi 3는 os즉 kernel image load를 SD카드를 통해서 진행한다. 때문에 SD에 내가 만든 kernel image를 기존 kernel image와 교체해주면 된다.
앞으로 Moon OS Project는 OS만들기라는 처음 목표에 맞추어 부트로더 및 DTB등의 작업은 기존 파일을 사용하고 kernel image작성에 집중해서 진행할 예정이다.
해당 프로젝트를 성공하고 차후에 기회가 된다면 boot loader까지 개발해보고 싶다.
'OS > Firmware Project' 카테고리의 다른 글
[MOON OS] Moon OS Project (4) - GPIO(2) (0) | 2022.09.28 |
---|---|
[MOON OS] Moon OS Project (3) - Interrupt 1 (0) | 2021.09.26 |
[MOON OS] Moon OS Project (2) - GPIO (0) | 2021.09.20 |
[MOON OS] Moon OS Project (1) - Barebone code (0) | 2021.08.21 |
[OS] Firmware Project (8) - Event (0) | 2021.08.02 |