부팅, 커널, 장치 드라이버와 Android 프레임워크가 만나는 부분을 설명합니다. 적용 버전과 예제의 전제를 확인하시고, 관련된 기존 코드 분석으로 이어서 보실 수 있습니다.
Android 부팅·서비스
Android의 boot·vendor_boot·init_boot를 구분합니다
커널이 시작하기 전의 이미지 구성부터 first-stage init이 파티션을 마운트하는 과정까지 연결합니다.
AOSP 공식 문서 · 출시 버전과 업그레이드 기기 구분Binder 호출에서 커널이 실제로 전달하는 것
함수처럼 보이는 원격 호출을 프로세스·스레드·버퍼·handle로 나누어 봅니다.
AOSP Binder·AIDL 문서 · Linux 6.18.37 driver 경로Android HAL과 property를 연결할 때 확인할 것
인터페이스 정의, 서비스 등록, 드라이버 접근, property와 SELinux를 하나의 동작 경로로 봅니다.
AOSP AIDL HAL·VINTF·property 문서GKI module의 KMI와 드라이버 적재 시점
커널 module을 어디에 넣는지와 어떤 kernel interface를 사용할 수 있는지를 나누어 봅니다.
AOSP GKI·KMI 문서 · 제품의 ACK branch 확인 필요Android 화면 버퍼: 전달, 합성, 완료를 구분합니다
BufferQueue에서 버퍼를 받았다는 사실과 GPU가 쓰기를 끝냈다는 사실은 다릅니다.
AOSP graphics · Linux 6.18 dma-buf
CPU 시작·보안 펌웨어
RISC-V에서 보조 CPU가 시작할 때 받는 값
SBI 호출의 인자와 새 hart의 레지스터를 구분하고, Linux가 task와 stack을 준비하는 코드를 읽습니다.
Linux v6.18.37 · SBI v3.0의 HSM 규약 · RV64 S-mode, 비-XIP 예CPU를 시작시키는 요청과 IPI는 무엇이 다릅니까?
ARM·RISC-V·x86에서 CPU 시작 주소를 전달하는 방법과, 실행 중인 CPU에 일을 알리는 방법을 비교합니다.
Linux 6.18 계열 · x86 INIT/SIPI는 전통적인 AP 시작 경로 예Secure Boot·TEE·RPMB는 서로 다른 문제를 해결합니다
부팅 이미지의 검증, 실행 중의 격리, 저장 데이터의 기밀성·무결성·재전송 방지를 구분합니다.
OP-TEE 4.10.0 · AOSP AVB · TF-A와 TF-M 구성 구분어셈블·링크 때 정하는 값과 실행할 때 바뀌는 값
지시어, relocation, ELF의 적재 주소와 실행 주소를 나누어 부팅 코드를 읽습니다.
GNU binutils 문서 · ELF 개념 · bare-metal 예와 Linux loader 구분Linux 보조 CPU와 DSP·MCU 시작은 어떻게 다릅니까
remoteproc의 펌웨어 시작과 rpmsg의 메시지 전달을 분리해서 읽습니다.
Linux 6.18 remoteproc·rpmsg · 플랫폼별 지원 범위 확인
가상화·인터럽트
게스트의 시스템 호출은 어디로 갑니까?
ARM64의 SVC, Stage-2 fault, KVM_RUN 반환을 레지스터와 주소의 변화로 구분합니다.
Linux v6.18.37 · AArch64 KVM · 일반 VM과 사용자 공간 장치 모델SMMU는 누구의 주소를 변환합니까?
SID·PASID로 변환 표를 고르는 과정과 실제 주소 변환을 구분하고, SVA의 page fault와 DMA 종료 조건을 살펴봅니다.
Linux v6.18.37 · Arm SMMUv3 · IHI 0070C.a의 해당 규칙 별도 명시GIC 인터럽트의 번호와 처리 완료를 따라가 봅니다
SGI 대상 CPU를 지정하는 비트, DT·INTID·Linux IRQ 번호, acknowledge와 처리 완료를 실제 값의 예로 연결합니다.
Linux v6.18.37 · AArch64 GICv3 · Non-secure Group 1 · 일반 IRQ 예
장치·버퍼·저장장치
DMA 버퍼는 누가 읽고 쓰고 있습니까?
가상 주소·물리 주소·DMA 주소를 나누고, 버퍼를 CPU와 장치 사이에 넘기는 순서를 따라갑니다.
Linux 6.18 문서 · 6.18.37 커널과 대조V4L2 카메라에서 프레임과 버퍼가 이동하는 과정
sensor·CSI receiver·video node의 역할과 QBUF·DQBUF로 바뀌는 버퍼 사용 상태를 연결합니다.
Linux 6.18 media 문서 · MMAP capture 예Device Tree 노드는 언제 동작하는 장치가 됩니까?
compatible 매칭 이후에 필요한 clock·regulator·IRQ와 probe defer를 설명합니다.
Linux 6.18 · DT 기반 platform device 예I²C·SPI·USB·PCIe: 연결과 전송을 구분해서 읽습니다
버스마다 다른 주소·전송·완료의 의미를 비교하고 driver가 지켜야 할 수명을 살펴봅니다.
Linux 6.18 driver API · 각 장치 규격과 binding 확인 필요MTD·UBI·UBIFS와 eMMC 파일 시스템을 구분합니다
raw flash의 erase block과 블록 장치의 sector가 다른 이유부터 이미지 형식까지 살펴봅니다.
Linux 6.18 UBIFS 문서 · 장치 geometry는 실제 하드웨어 기준ALSA·ASoC: PCM 버퍼에서 오디오 핀까지
frame·period·DMA·DAI clock을 연결하고 소리가 나지 않는 구간을 나누어 찾습니다.
Linux 6.18 ASoC 문서 · ALSA PCM interface
동시성·네트워크·메모리
wait queue와 completion: 기다림보다 먼저 정할 것
깨우는 신호, 기다리는 조건, 결과 데이터, 객체 수명을 분리해 비동기 코드를 읽습니다.
Linux 6.18 completion·wait queue APIinterrupt 뒤의 작업은 어디에서 실행됩니까?
hard IRQ·threaded IRQ·softirq·workqueue를 실행 문맥과 객체 수명으로 비교합니다.
Linux 6.18 · 일반 커널 기준, PREEMPT_RT와 WQ_BH 차이 명시네트워크 수신은 패킷마다 interrupt 한 번일까요?
NIC의 DMA ring, interrupt, NAPI poll, socket 수신을 다른 단계로 나눕니다.
Linux 6.18 NAPI 문서 · 일반적인 NIC 수신 예메모리가 남아 보이는데도 할당이 실패하는 이유
가상 주소, 물리 메모리, 연속 공간, cgroup 제한과 Android lmkd를 구분합니다.
Linux 6.18 memory·cgroup v2 · AOSP lmkd 문서RCU: 포인터를 바꾸는 시점과 객체를 해제하는 시점
새 객체를 공개한 뒤에도 예전 객체를 읽는 CPU가 있을 수 있습니다. 두 객체의 수명을 시간 순서로 살펴봅니다.
Linux 6.18 RCU 문서 · 기존 v6.18.37 rcu_init 분석과 연결reserved-memory와 CMA: 예약한 RAM은 누가 사용합니까?
DTS의 메모리 범위, CMA 할당, 장치가 쓰는 DMA 주소를 분리해 확인합니다.
Linux v6.18.37 구현 · dt-schema 공식 정의메모리 배리어: 다른 CPU와 장치는 무엇을 보게 됩니까?
READ_ONCE, release·acquire, DMA와 MMIO, cache와 TLB를 구체적인 값의 변화에 연결합니다.
Linux v6.18.37 소스 · Linux 4.18 문서와 API 차이 확인ARM64 주소 폭과 비정렬 접근을 구분해서 읽습니다
64비트 레지스터, 48·52비트 주소, 페이지 크기는 서로 다른 값입니다. 커널이 실제 주소 폭을 정하는 과정과 LDR이 읽는 바이트를 예제로 살펴봅니다.
Linux v6.18.37 · AArch64 · 일반 데이터 접근과 부팅 시 주소 폭 선택
빌드·디버깅
Yocto에서 recipe가 이미지 안의 파일이 되기까지
소스 빌드, 패키지 생성, rootfs 구성, Wic 디스크 이미지 생성을 다른 단계로 읽습니다.
Yocto Project 5.0 Scarthgap 문서 기준빌드는 됐는데 실행되지 않을 때: ABI와 loader
CPU 아키텍처, sysroot, ELF interpreter, 공유 라이브러리를 차례로 확인합니다.
Linux ELF · GNU toolchain · CMake cross-compiling 문서커널 오류 로그에서 원인과 결과를 구분합니다
KASAN 보고, fault 주소, stack trace와 ftrace의 시간을 서로 다른 증거로 읽습니다.
Linux 6.18 KASAN·ftrace 문서