I/O를 요청하는 스레드나 프로세스의 데이터 버퍼에 대한 정보는 IRP 구조체에 저장되어 있다.
드라이버에 I/O 요청과 관련된 스레드나 프로세스의 데이터 버퍼를 설명하기 위한 세가지 서로 다른 방법을 제공
MDL(Memory Descriptor List) 메모리 기술자 리스트
MDL은 가상 메모리 정보외에 가상메모리가 어떤 물리메모리와
연결되어 있는지를 보여주는 기능을 한다. 또한 하나의 MDL은 복수 개의 불연속적인 가상 메모리들을 모두 서술하는 부가적인 기능을 가지고 있다.
Direct I/O : MDL(Memory Descriptor List)
MDL 이라 불리는 구조체를 사용하여 I/O를 요청한 스레드의 물리 주소 공간에 위치한 데이터 영역을 가리키는 방식
MDL(구조체) 사용 -----------> I/O를 요청한 스레드의 물리 주소 공간에 위치한 데이터 영역
Buffered I/O :
버퍼에 저장된 데이터가 I/O를 요청한 스레드의 주소 공간에 시스템 주소 공간에 있는 임시 영역으로 복사되고, 드라이버는 복사된 데이터의 버퍼 포인터를 사용하는 방식
버퍼 -----> I/O을 요청한 스레드 주소공간 -----> 시스템주소공간에 임시 영역 -------> 복사된 데이터의 버퍼 포인터를 사용
Neither I/O:
드라이버는 버퍼에 해당하는 I/O를 요청한 스레드의 가상 주소를 제공하는 방식
드라이버는 I/O 관리자가 어떤 물리 장치에 전달되는 모든 IRP_MJ_READ/IRP_MJ_WRITE 요청이 어떤 방식으로 데이터를 주소받는지 알수 있도록 한 가지 방식을 선택해야 한다.
디바이스 오브젝트가 생성됐을때 필요한 정보를 초기화하는 과정에서 디바이스 오브젝트에 있는 Flag 필드에 있는 특정 정보를 설정함으로써 가능
DeviceObject->Flag |= DO_BUFFERED_IO; //Buffered I/O
DeviceObject->Flag |= 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 인자는 DeviceloControl()함수 호출 시 제공 되는 두 개의 데이터 버퍼(입력 버퍼, 출력 버퍼 ) 에 대한 정보를 드라이버에 알린다.
I/O 컨트롤 코드에서 제공하는 데이터 버퍼를 설명하기 위한 서로 다른 세가지 방식에 대해 알아보자.
METHOD_BUFFERED : DeviceControl()함수에서 제공하는 입력 버퍼와 출력 버퍼를 Buffered I/O
방식으로 처리
METHOD_IN_DIRECT & METHOD_OUT_DIRECT : DeviceloControl()함수에서 제공되는 입력 버퍼를
Buffered I/O 방식으로 처리하고 출력 버퍼를 Direct I/O 방식으로 처리
METHOD_NEITHER : DeviceloControl() 함수에서 제공되는 입력 버퍼와 출력 버퍼를 Neither I/O
방식으로 처리
Direct I/O | Buffered I/O | Neither I/O | |
데이터 버퍼 위치 | MDL 구조체 | 시스템 영역에 있는 인터미디어트 버퍼 |
I/O를 요청한 스레드의 가상 주소 |
데이터 보호 | I/O 관리자가 데이터 보호 |
데이터 보호 하지 않음 | 데이터 보호하지 않음 |
IRP 내의 데이터 저장 필드 |
lrp->MdlAddress | Irp->Associatedlrp | lrp->UserBuffer |
페이징 I/O | 불가능 | 가능 | 가능 |
컨텍스트 | 임의의 스레드 컨텍스트 | 임의의 스레드 컨텍스트 | 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 인자는 DeviceloControl()함수 호출 시 제공 되는 두 개의 데이터 버퍼(입력 버퍼, 출력 버퍼 ) 에 대한 정보를 드라이버에 알린다.
I/O 컨트롤 코드에서 제공하는 데이터 버퍼를 설명하기 위한 서로 다른 세가지 방식에 대해 알아보자.
METHOD_BUFFERED : DeviceControl()함수에서 제공하는 입력 버퍼와 출력 버퍼를 Buffered I/O
방식으로 처리
METHOD_IN_DIRECT & METHOD_OUT_DIRECT : DeviceloControl()함수에서 제공되는 입력 버퍼를
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 : DeviceloControl() 함수에서 제공되는 입력 버퍼와 출력 버퍼를 Neither I/O
방식으로 처리
'Soft Ware > Windows System' 카테고리의 다른 글
파일 시스템 드라이버 (0) | 2011.11.08 |
---|---|
스레드 컨텍스트 (0) | 2011.11.06 |
파일 시스템 드라이버의 특징 (0) | 2011.11.06 |
HAL 이란??(hardware abstraction layer) 하드웨어 추상화 계층 (0) | 2011.11.05 |
0~3 까지의 특권 레벨 , Context switching (0) | 2011.11.05 |