ARM 아키텍처

QEMU(arm64) 임베디드 리눅스 타깃 만들기 (6) — 커널 모듈, gdb 원격 디버깅, NFS 루트

4편까지 오면 타깃은 완성됐다. 남은 것은 이 타깃을 실제 개발에 쓰는 방법이다. 실물 보드에서 하던 일 — 드라이버를 고쳐 올리고, 부팅이 이상하면 붙잡아 들여다보고, 빌드 결과를 매번 굽지 않고 바로…

Continue ReadingQEMU(arm64) 임베디드 리눅스 타깃 만들기 (6) — 커널 모듈, gdb 원격 디버깅, NFS 루트

QEMU(arm64) 임베디드 리눅스 타깃 만들기 (5) — Yocto로 타깃 이미지 빌드

1편부터 4편까지는 디스크 이미지를 자르고, U-Boot을 빌드하고, 커널을 컴파일하고, 루트 파일 시스템을 손으로 채웠다. 제품용 타깃이라면 이 과정을 재현 가능하게 자동화해야 하는데, 그 자리에 쓰는 것이 Yocto다. 레시피와 설정 파일에서…

Continue ReadingQEMU(arm64) 임베디드 리눅스 타깃 만들기 (5) — Yocto로 타깃 이미지 빌드

QEMU(arm64) 임베디드 리눅스 타깃 만들기 (4) — 루트 파일 시스템과 패키지 설치

3편에서 커널이 ext4 루트를 마운트하는 데까지 갔지만 그 안이 mkfs 직후 상태라 No working init found로 멈췄다. 이제 그 빈 파티션을 채운다. 두 단계로 간다. 먼저 BusyBox 하나로 셸이 뜨는…

Continue ReadingQEMU(arm64) 임베디드 리눅스 타깃 만들기 (4) — 루트 파일 시스템과 패키지 설치

QEMU(arm64) 임베디드 리눅스 타깃 만들기 (3) — 커널 크로스 컴파일과 부팅

2편까지 오면 타깃에 부트로더가 올라가 디스크에서 파일을 읽어 실행하는 데까지 된다. 이제 그 자리에 올릴 커널이 필요하다. 실물 보드라면 벤더가 준 커널 소스를 받아 크로스 컴파일하고 SD 카드에 복사하는 단계인데,…

Continue ReadingQEMU(arm64) 임베디드 리눅스 타깃 만들기 (3) — 커널 크로스 컴파일과 부팅

QEMU(arm64) 임베디드 리눅스 타깃 만들기 (2) — U-Boot 올리기

1편에서 만든 디스크 이미지는 아직 아무도 읽어주지 않는다. virt 머신에는 x86의 BIOS/UEFI 같은 내장 펌웨어가 없어서, 전원을 넣어도 실행할 코드가 없으면 한 글자도 나오지 않기 때문이다. 실물 보드라면 SoC의 부트…

Continue ReadingQEMU(arm64) 임베디드 리눅스 타깃 만들기 (2) — U-Boot 올리기

QEMU(arm64) 임베디드 리눅스 타깃 만들기 (1) — 타깃 디스크 이미지와 virt 보드 구성

임베디드 리눅스 개발은 보드가 손에 있어야 시작되는 일이 많다. 부트로더를 잘못 덮어써 보드를 못 쓰게 만들거나, SD 카드를 다시 굽느라 시간을 흘려보내거나, 사람 수보다 보드가 적어 순서를 기다리는 상황이 반복된다.…

Continue ReadingQEMU(arm64) 임베디드 리눅스 타깃 만들기 (1) — 타깃 디스크 이미지와 virt 보드 구성

리눅스 커널의 시스템 콜 처리 경로 — arm64 예외 벡터부터 핸들러까지

x86-64에서는 syscall 명령이 MSR_LSTAR에 적힌 주소로 곧장 점프한다. 시스템 콜 전용 진입점이 레지스터 하나에 박혀 있는 구조다. arm64에는 그런 전용 레지스터가 없다. svc 명령이 만드는 것은 "동기 예외" 하나일 뿐이고,…

Continue Reading리눅스 커널의 시스템 콜 처리 경로 — arm64 예외 벡터부터 핸들러까지

Arm GIC v3와 Pseudo-NMI에 대한 이해

x86에는 IRQ 마스크와 무관하게 항상 들어오는 진짜 NMI(Non-Maskable Interrupt) 핀이 있지만, ARM에는 그런 하드웨어가 없다. 그런데 PMU(성능 카운터) 오버플로우 인터럽트처럼 "일반 IRQ가 막혀 있는 구간에서도 반드시 들어와야" 정확한 프로파일링이 되는…

Continue ReadingArm GIC v3와 Pseudo-NMI에 대한 이해

[ARM] arch_has_hw_pte_young() 이해

MGLRU(Multi-Gen LRU) 페이지 에이징이나 fork() 이후 CoW(Copy-on-Write) 처리처럼, 커널이 "이 페이지가 최근에 접근됐는가"를 알아야 하는 곳이 많다. 이걸 알아내는 방법은 두 가지다 — 오래된 PTE에 접근할 때마다 일부러 페이지 폴트를…

Continue Reading[ARM] arch_has_hw_pte_young() 이해