QEMU(arm64) 임베디드 리눅스 타깃 만들기 (6) — 커널 모듈, gdb 원격 디버깅, NFS 루트
4편까지 오면 타깃은 완성됐다. 남은 것은 이 타깃을 실제 개발에 쓰는 방법이다. 실물 보드에서 하던 일 — 드라이버를 고쳐 올리고, 부팅이 이상하면 붙잡아 들여다보고, 빌드 결과를 매번 굽지 않고 바로…
4편까지 오면 타깃은 완성됐다. 남은 것은 이 타깃을 실제 개발에 쓰는 방법이다. 실물 보드에서 하던 일 — 드라이버를 고쳐 올리고, 부팅이 이상하면 붙잡아 들여다보고, 빌드 결과를 매번 굽지 않고 바로…
1편부터 4편까지는 디스크 이미지를 자르고, U-Boot을 빌드하고, 커널을 컴파일하고, 루트 파일 시스템을 손으로 채웠다. 제품용 타깃이라면 이 과정을 재현 가능하게 자동화해야 하는데, 그 자리에 쓰는 것이 Yocto다. 레시피와 설정 파일에서…
3편에서 커널이 ext4 루트를 마운트하는 데까지 갔지만 그 안이 mkfs 직후 상태라 No working init found로 멈췄다. 이제 그 빈 파티션을 채운다. 두 단계로 간다. 먼저 BusyBox 하나로 셸이 뜨는…
2편까지 오면 타깃에 부트로더가 올라가 디스크에서 파일을 읽어 실행하는 데까지 된다. 이제 그 자리에 올릴 커널이 필요하다. 실물 보드라면 벤더가 준 커널 소스를 받아 크로스 컴파일하고 SD 카드에 복사하는 단계인데,…
1편에서 만든 디스크 이미지는 아직 아무도 읽어주지 않는다. virt 머신에는 x86의 BIOS/UEFI 같은 내장 펌웨어가 없어서, 전원을 넣어도 실행할 코드가 없으면 한 글자도 나오지 않기 때문이다. 실물 보드라면 SoC의 부트…
임베디드 리눅스 개발은 보드가 손에 있어야 시작되는 일이 많다. 부트로더를 잘못 덮어써 보드를 못 쓰게 만들거나, SD 카드를 다시 굽느라 시간을 흘려보내거나, 사람 수보다 보드가 적어 순서를 기다리는 상황이 반복된다.…
라즈베리파이 OS의 설정을 조금 바꿔볼 때마다 SD 카드를 굽고 보드에 꽂고 전원을 넣는 건 느리다. 보드가 아직 손에 없거나, 망가뜨려도 되는 환경이 필요할 때도 있다. QEMU의 raspi3b 머신은 배포된 이미지를…
arm64 타깃 코드를 손볼 때마다 보드를 꺼내 플래싱하고 시리얼을 연결하는 건 번거롭고, 아직 하드웨어가 없는 단계라면 아예 불가능하다. QEMU는 이 문제를 성격이 다른 두 방식으로 풀어준다. 바이너리 하나만 호스트에서 그대로…
x86-64에서는 syscall 명령이 MSR_LSTAR에 적힌 주소로 곧장 점프한다. 시스템 콜 전용 진입점이 레지스터 하나에 박혀 있는 구조다. arm64에는 그런 전용 레지스터가 없다. svc 명령이 만드는 것은 "동기 예외" 하나일 뿐이고,…
앞선 편들에서 module! 매크로로 init/exit을 가진 모듈을 만들고 misc device까지 붙여봤다. 그런데 실제 하드웨어를 다루는 드라이버는 insmod 시점에 일을 시작하지 않는다. 모듈은 "이런 하드웨어를 담당할 수 있다"고 등록만 해두고, 그…