디바이스 접근
Linux의 디바이스 드라이버는 장치별 동작을 커널과 연결한다. 사용자 프로그램은 장치에 따라 파일 디스크립터, ioctl, 소켓, mmap 등의 인터페이스를 사용한다. 모든 장치를 같은 방식으로 직접 읽고 쓰는 것은 아니다.
장치 파일의 종류 확인하기
Linux에서 다음 두 장치를 확인한다.
ls -l /dev/null /dev/zero
권한 문자열 앞의 c는 문자 장치를 뜻한다. 주요·부 번호는 커널이 어떤 장치와 연결할지 식별하는 데 사용한다. /dev/null과 /dev/zero처럼 실제 하드웨어가 아닌 장치도 있다.
head -c 8 /dev/zero | od -An -t x1
8바이트만 읽어 16진수로 표시하면 0으로 채워진 데이터를 확인할 수 있다. 끝없이 데이터를 제공하는 장치를 읽을 때는 이처럼 범위를 제한한다. 블록 장치 파일에 임의로 쓰는 것은 파일 시스템을 거치지 않고 데이터를 손상시킬 수 있다.
혼동하기 쉬운 용어
메모리 매핑 I/O(MMIO)는 장치 레지스터 등을 주소 공간으로 접근하는 방식이다. DMA는 장치가 메모리와 데이터를 전송하는 메커니즘이고, 인터럽트는 처리할 사건을 알리는 수단이다. 서로 배타적인 세 가지 선택지는 아니다.
파일의 O_DIRECT I/O는 주로 페이지 캐시를 우회하는 파일 I/O 옵션을 뜻한다. “CPU가 직접 장치의 모든 전송을 수행한다”는 뜻이 아니며 버퍼 정렬 등의 조건도 확인해야 한다.
장치 접근 실패를 조사할 때는 드라이버 로드 여부, 장치 파일 존재, 파일 권한·그룹, 컨테이너의 장치 접근 정책을 구분한다.