Windows I/O 시스템 개관 — 드라이버의 무대를 이해하다
I/O 요청의 여정
앱에서 ReadFile()을 호출하면 그 요청이 실제 하드웨어에 닿기까지 여러 계층을 통과합니다:
각 단계의 드라이버들이 수직으로 쌓인 구조를 디바이스 스택(Device Stack)이라고 해요. I/O 요청은 이 스택을 따라 내려가고, 완료 후에는 반대 방향으로 올라옵니다.
I/O Manager — 중재자
I/O Manager는 이 시스템 전체의 중재자예요. 주요 역할은:
- IRP 생성 — 앱의 I/O 요청을 IRP(I/O Request Packet)라는 커널 구조체로 변환
- 라우팅 — 어떤 드라이버가 이 요청을 처리해야 하는지 찾아서 전달
- 완료 처리 — 드라이버가 IRP를 완료하면, 앱에게 결과를 돌려줌
- 취소 처리 — 앱이 I/O를 취소하면 드라이버에 취소 요청 전달
드라이버 개발자 입장에서 I/O Manager는 "항상 IRP를 들고 우리 드라이버 문을 두드리는 존재"예요. 우리는 그 IRP를 받아서 처리하고 돌려주면 됩니다.
디바이스 오브젝트 (DEVICE_OBJECT)
드라이버는 하나 이상의 디바이스 오브젝트(DEVICE_OBJECT)를 만들어요. 이 오브젝트가 I/O Manager에게 "이런 이름의 디바이스가 있고, I/O 요청을 받을 준비가 되어 있다"고 알려주는 역할을 합니다.
예를 들어, 디스크 드라이버는 \Device\HarddiskVolume1 같은 이름의 디바이스 오브젝트를 만들어요. 앱이 이 이름을 통해 파일을 열면, I/O Manager가 해당 디바이스 오브젝트를 찾아서 IRP를 보내줍니다.
IRP — I/O Request Packet
IRP는 I/O 시스템의 핵심 데이터 구조예요. 앱의 I/O 요청 하나당 IRP가 하나 만들어지고, 이 IRP가 디바이스 스택을 따라 여행하면서 처리됩니다.
IRP에는 다음 정보가 담겨있어요:
- 어떤 종류의 I/O인지 (읽기/쓰기/제어 등)
- 데이터 버퍼 위치와 크기
- 완료 후 호출할 콜백 함수 (CompletionRoutine)
- 각 드라이버 단계마다의 파라미터 (IO_STACK_LOCATION)
IRP의 자세한 구조는 12화에서 깊게 파고들 거예요. 지금은 "I/O 요청을 담는 봉투"라고 생각하면 충분합니다.
동기 I/O vs 비동기 I/O
앱에서 I/O를 요청할 때 두 가지 방식이 있어요:
| 구분 | 동기 I/O | 비동기 I/O (Overlapped) |
|---|---|---|
| 앱 동작 | I/O 완료까지 기다림 | 요청 후 다른 작업 계속 |
| 완료 통지 | 함수 리턴으로 알 수 있음 | 이벤트, IOCP, APC 등으로 알림 |
| 적합한 경우 | 간단한 I/O, 빠른 응답 | 고성능 서버, 대량 I/O |
| 드라이버 입장 | IRP 완료 시 스레드가 깨어남 | 완료 루틴이 나중에 호출됨 |
드라이버는 두 방식 모두 동일한 IRP 처리 코드로 대응해요. 동기/비동기 차이는 앱 레벨의 이야기이고, 드라이버는 "IRP 처리 → 완료"라는 흐름은 같습니다.
I/O 완료 포트 (IOCP) — 간단히 맛보기
고성능 서버 개발자에게 친숙한 IOCP(I/O Completion Port)도 이 I/O 시스템 위에 올라타는 매커니즘이에요. 드라이버가 비동기 IRP를 완료하면, 커널이 미리 등록해 둔 I/O 완료 포트에 완료 패킷을 큐잉합니다. 스레드 풀이 이 패킷을 꺼내 처리하죠.
- I/O 요청은 앱 → I/O Manager → 디바이스 스택(드라이버들) → 하드웨어 순서로 흐릅니다.
- I/O Manager가 IRP를 만들고 적절한 드라이버로 라우팅합니다.
- 드라이버는 디바이스 오브젝트를 만들어 I/O Manager에게 존재를 알려요.
- IRP는 I/O 요청을 담는 핵심 구조체로, 디바이스 스택을 따라 이동합니다.
#IOManager #IRP #디바이스스택 #WindowsIO #IOCP
'Programming > 7. Device Driver' 카테고리의 다른 글
| 드라이버 개발 핵심 - 9화 첫 번째 커널 드라이버 (0) | 2026.05.27 |
|---|---|
| Windows 아키텍처 기초 - 8화 개발 환경 구축 (0) | 2026.05.26 |
| Windows 아키텍처 기초 - 6화 프로세스와 스레드 (0) | 2026.05.23 |
| Windows 아키텍처 기초 - 5화 페이징 메커니즘 (0) | 2026.05.22 |
| Windows 아키텍처 기초 - 4화 가상 메모리와 주소 공간 (0) | 2026.05.21 |