전달할 데이터와 수명을 먼저 적습니다
새 통로를 만들기 전에 기존 서브시스템이 제공하는 ABI를 확인합니다. 구조화된 장치 제어에는 ioctl, 객체 속성에는 sysfs, 메시지·상태 덤프·이벤트에는 해당 Netlink family, 버퍼 접근에는 mmap이 사용될 수 있습니다. 이 목록은 속도 순위도, 서로 배타적인 선택지도 아닙니다.
제어 계약: 명령·권한·오류·호환성
데이터 계약: 버퍼 크기·소유권·완료 시점
수명 계약: 취소·프로세스 종료·장치 제거
명령과 비동기 이벤트를 구분합니다
ioctl은 명령 번호와 인수 형식도 ABI입니다. 고정 폭 자료형, 구조체 배치, 예약 필드, 32/64비트 호환성을 검토합니다. Netlink는 요청·응답, dump, multicast 알림을 지원할 수 있으므로 “항상 비동기”라고 부르지 않습니다. 사용할 family의 정책과 sequence·오류 처리를 확인해야 합니다.
mmap만으로 제어와 동기화가 해결되지는 않습니다
V4L2 MMAP streaming은 ioctl로 버퍼를 요청·조회·queue하고 mmap으로 데이터에 접근합니다. QBUF 뒤 드라이버가 관리하는 동안 애플리케이션이 내용을 마음대로 읽거나 쓰면 안 됩니다. DQBUF 완료를 확인하고 처리한 뒤 재사용하도록 돌려줍니다. 매핑에 성공했다고 해서 전 경로 무복사, 동기화, 장치를 제거할 때의 안전성이 자동으로 보장되지는 않습니다.
진단 파일과 안정 ABI를 혼동하지 않습니다
sysfs 속성은 간단한 텍스트 값과 객체 관계를 표현하는 데 맞춥니다. debugfs는 안정된 사용자 ABI를 보장하는 제품 인터페이스가 아닙니다. copy_to_user·copy_from_user는 커널 구현에서 사용자 메모리에 접근하는 helper이지 ioctl·Netlink와 나란한 별도의 다섯 번째 ABI가 아닙니다. 사용자 포인터를 받는 구현은 길이·권한·복사 결과와 동시 변경을 검토해야 합니다.