QEMU(arm64) 임베디드 리눅스 타깃 만들기 (6) — 커널 모듈, gdb 원격 디버깅, NFS 루트
4편까지 오면 타깃은 완성됐다. 남은 것은 이 타깃을 실제 개발에 쓰는 방법이다. 실물 보드에서 하던 일 — 드라이버를 고쳐 올리고, 부팅이 이상하면 붙잡아 들여다보고, 빌드 결과를 매번 굽지 않고 바로…
4편까지 오면 타깃은 완성됐다. 남은 것은 이 타깃을 실제 개발에 쓰는 방법이다. 실물 보드에서 하던 일 — 드라이버를 고쳐 올리고, 부팅이 이상하면 붙잡아 들여다보고, 빌드 결과를 매번 굽지 않고 바로…
1편부터 4편까지는 디스크 이미지를 자르고, U-Boot을 빌드하고, 커널을 컴파일하고, 루트 파일 시스템을 손으로 채웠다. 제품용 타깃이라면 이 과정을 재현 가능하게 자동화해야 하는데, 그 자리에 쓰는 것이 Yocto다. 레시피와 설정 파일에서…
라즈베리파이 4용으로 뭔가를 고칠 때마다 보드에 SD 카드를 꽂았다 뺐다 하는 건 번거롭고, 보드가 손에 없으면 아예 막힌다. QEMU는 8.2까지 라즈베리파이 3B(raspi3b)가 최신이었는데 9.0부터 raspi4b 머신이 들어왔다. 다만 Pi 4는…
3편에서 커널이 ext4 루트를 마운트하는 데까지 갔지만 그 안이 mkfs 직후 상태라 No working init found로 멈췄다. 이제 그 빈 파티션을 채운다. 두 단계로 간다. 먼저 BusyBox 하나로 셸이 뜨는…
2편까지 오면 타깃에 부트로더가 올라가 디스크에서 파일을 읽어 실행하는 데까지 된다. 이제 그 자리에 올릴 커널이 필요하다. 실물 보드라면 벤더가 준 커널 소스를 받아 크로스 컴파일하고 SD 카드에 복사하는 단계인데,…
1편에서 만든 디스크 이미지는 아직 아무도 읽어주지 않는다. virt 머신에는 x86의 BIOS/UEFI 같은 내장 펌웨어가 없어서, 전원을 넣어도 실행할 코드가 없으면 한 글자도 나오지 않기 때문이다. 실물 보드라면 SoC의 부트…
임베디드 리눅스 개발은 보드가 손에 있어야 시작되는 일이 많다. 부트로더를 잘못 덮어써 보드를 못 쓰게 만들거나, SD 카드를 다시 굽느라 시간을 흘려보내거나, 사람 수보다 보드가 적어 순서를 기다리는 상황이 반복된다.…
커널을 Clang으로 빌드하면 GCC 빌드와 메모리 사용량이 달라질까. 컴파일러가 바뀌면 인라이닝과 코드 생성이 달라지니 커널이 잡는 슬랩(slab) 메모리도 따라 달라질 것 같지만, 실제로 재보면 어느 쪽이 얼마나 다른지 숫자로 답한…
라즈베리파이 OS의 설정을 조금 바꿔볼 때마다 SD 카드를 굽고 보드에 꽂고 전원을 넣는 건 느리다. 보드가 아직 손에 없거나, 망가뜨려도 되는 환경이 필요할 때도 있다. QEMU의 raspi3b 머신은 배포된 이미지를…
arm64 타깃 코드를 손볼 때마다 보드를 꺼내 플래싱하고 시리얼을 연결하는 건 번거롭고, 아직 하드웨어가 없는 단계라면 아예 불가능하다. QEMU는 이 문제를 성격이 다른 두 방식으로 풀어준다. 바이너리 하나만 호스트에서 그대로…