정리차원에서 간략히 올립니다.
I/O를 요청한 스레드나 프로세스의 데이터 버퍼에 대한 정보는 IRP 구조체에 저장되어 있다.
드라이버에 I/O 요청과 관련된 스레드나 프로세스의 데이터 버퍼를 설명하기 위한 세 가지 서로 다른 방법을 제공
Direct I/O : MDL(Memory Descriptor List)이라 불리는 구조체를 사용하여 I/O를 요청한
스레드의 물리 주소 공간에 위치한 데이터 영역을 가리키는 방식
Buffered I/O : 버퍼에 저장된 데이터가 I/O를 요청한 스레드의 주소 공간에서 시스템 주소 공간에
있는 임시 영역으로 복사되고, 드라이버는 복사된 데이터의 버퍼 포인터를 사용하는 방식
Neither I/O : 드라이버는 버퍼에 해당하는 I/O를 요청한 스레드의 가상 주소를 제공하는 방식
드라이버는 I/O 관리자가 어떤 물리 장치에 전달하는 모든 IRP_MJ_READ/IRP_MJ_WRITE 요청이 어떤 방식으로 데이터를 주소받는지 알수 있도록 한 가지 방식을 선택해야 한다.
디바이스 오브젝트가 생성됐을 때 필요한 정보를 초기화하는 과정에서 디바이스 오브젝트 구조체 내에 있는 Flags 필드에 있는 특정 정보를 설정함으로써 가능
DeviceObject->Flags |= DO_BUFFERED_IO; // Buffered I/O
DeviceObject->Flags |= DO_DIRECT_IO; // Direct I/O
아무 설정도 하지 않으면 디폴트로 Neither I/O 방식
이번엔 디바이스 I/O 컨트롤 코드에서 사용하는 버퍼 방식에 대해 알아보겠다.
위 그림은 IOCTL 코드인데 IOCTL코드를 만드는 매크로가 winioctl.h에 정의되어 있다.
다시 말해 Method 인자는 DeviceIoControl() 함수 호출 시 제공되는 두 개의 데이터 버퍼(입력버퍼, 출력 버퍼)에
대한 정보를 드라이버에 알린다.
I/O 컨트롤 코드에서 제공하는 데이터 버퍼를 설명하기 위한 서로 다른 세가지 방식에 대해서 알아보자.
METHOD_BUFFERED : DeviceIoControl() 함수에서 제공하는 입력 버퍼와 출력 버퍼를 Buffered I/O 방식으로 처리
METHOD_IN_DIRECT & METHOD_OUT_DIRECT : DeviceIoControl() 함수에서 제공되는 입력 버퍼를 Buffered I/O 방식으로 처리하고 출력 버퍼를 Direct I/O 방식으로 처리
여기서 IN과 OUT의 유일한 차이점
I/O 관리자가 처리하는 출력 버퍼에 대한 액세스 권한 조사.
METHOD_IN_DIRECT - I/O 관리자는 I/O를 요청한 스레드가 출력 버퍼에 대한 읽기 권한을 가지고 있는지 조사한다.
이 경우 출력 버퍼는 드라이버에 대한 입력 값으로 사용한다.
METHOD_OUT_DIRECT - I/O 관리자는 I/O를 요청한 스레드가 출력 버퍼에 대한 쓰기 권한을 가지고 있는지 조사한다.
METHOD_NEITHER : DeviceIoControl() 함수에서 제공되는 입력 버퍼와 출력 버퍼를 Neither I/O 방식으로 처리
IOCTL 코드에서 사용되는 버퍼링 방법에 대해 간단히 요약한 표
'My Study > Programming&Theory' 카테고리의 다른 글
Prefix list in executive component (0) | 2011.09.02 |
---|---|
API Listbox에서 가로 스크롤 넣기 (1) | 2011.08.10 |
Data Read/Write in Cache (0) | 2011.07.12 |
Windows Cache (2) | 2011.05.31 |
Share Memory & Share Moudle (0) | 2011.05.26 |