본문 바로가기

My Study/Programming&Theory

커널 데이터 버퍼

정리차원에서 간략히 올립니다.

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에 정의되어 있다. 

#define CTL_CODE( DeviceType, Function, Method, Access ) (                 \
    ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
)
저기서 Method 라고 된 부분이 처리하고자 하는 I/O 요청을 위해 제공된 데이터 버퍼를 설명하기 위해 사용된다.

다시 말해 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