2 Comments

  1. Choryu

    이런 임베디드 관련 글을 볼 때마다 좀 헷갈리는게 있는데요,
    uBoot, Ramdisk, SquashFS 라는게 Flash Rom에 어떻게 적재되어 정확히 어떤 일을 하는걸까요?
    검색하면서 찾아본 바로는,
    1. 일단 Flash Rom에서 가장 먼저 읽어서 실행되는 uBoot는 GRUB 같은 부트로더 역할을 하면서
    2. Ramdisk (initramfs) 라는 커널 + 부팅에 필요한 일부 프로그램 등이 들어있는 파티션을 램에 올려주고,
    3. 이에 따라 Kernel이 로드되어서 Boot 과정을 진행 하고,
    4. SquashFS 는 읽기전용으로 리눅스의 루트처럼 시스템 전체를 가지고 있기에 이를 마운트 해서 비로소 시스템 로딩이 완료
    이렇게 되는것으로 이해 하고 있는데, 이게 맞을까요?

    또, 보면 가끔 OpenWRT 펌웨어가 initramfs 랑 SquashFS 로 나뉘어 있던데, 이건 무슨 차이가 있는건가요?

    • perillamint

      우선 프로세서가 부팅되면 프로세서는 Boot ROM 에 있는 코드를 실행하게 됩니다. 이 Boot ROM 코드는 시스템의 기초적 초기화를 담당하며, 이후 지정된 매체 (이 경우는 SPI EEPROM) 에서 추가적인 초기화 바이너리(sram stage) 를 로드하게 됩니다.

      SPI EEPROM 에서 로드된 SRAM Stage 는 메모리 버스 트레이닝과 같은 추가적인 시스템 초기화를 진행합니다. 이러한 초기화 루틴을 거쳐 DRAM 이 준비되면 SRAM stage 는 다음 stage 를 DRAM 에 로드합니다. 이후 이 다음 스테이지가 실행되며, 해당 stage 에서의 초기화 루틴을 거친 뒤, U-Boot 부트로더를 메모리에 로드 후 부트로더가 실행되게 됩니다.

      부트 로더는 부트 로더 설정을 읽어들인 뒤, 리눅스 커널과 램디스크를 메모리에 로드 후 실행하게 되고, 이후 커널은 램디스크에 있는 init 을 실행한 뒤, init script 대로 부트 시퀸스를 진행하게 됩니다.

      플랫폼에 따라 단계가 더 쪼개질 수도, 덜 쪼개질 수도 있지만, 큰 틀은 해당 부트 시퀸스를 따라갈 것입니다.

      OpenWRT 의 경우, initramfs 버전은, 시스템의 모든 구성 요소가 initramfs 안에 들어있는 버전이고, SquashFS 버전은, 시스템의 구성 요소가 OverlayFS 지원을 위해 SquashFS 로 쪼개져 있는 구조입니다.

      보통 initramfs 버전은 ipTIME 과 같은, 이미지 체크섬 검증을 파일 전체 길이에 대해 하는 펌웨어를 가진 하드웨어에 OpenWRT 를 플래싱하기 위한 첫 번째 단계로 사용됩니다. ipTIME 과 같은 시스템의 순정 펌웨어 업그레이드 페이지에 SquashFS 이미지를 올리면 펌웨어 업그레이드 파일 포멧 오류가 뜨지만, initramfs 이미지를 올릴 경우, kernel+initrd 길이가 파일 길이와 같기 때문에 순정 펌웨어의 펌웨어 업그레이드 파일 포멧 검증을 통과하는 것을 볼 수 있습니다.

Leave a Reply. You MUST have a previously approved comment to bypass moderation queue, so using same ID between comments are strongly recommended.

This site uses Akismet to reduce spam. Learn how your comment data is processed.