본문 바로가기

window driver

Buffered I/O vs Direct I/O

커널모드와 유저모드가 데이터를 교환 하는 방식에는 세가지가 있다.

 

  • BUFFERED I/O : User Application의 버퍼와 크기가 같은 NonPaged SystemBuffer를 만들어서 복사하고, 커널 드라이버에서는 이 버퍼에 접근하여 Access 한다.
  • DIRECT I/O : User Application의 버퍼를 MDL을 이용하여 전달받아 Kernel 드라이버에서 접근하는 방삭이다. 엑세스 하는동안 메모리가 잠기게된다.
  • NEITHER I/O : UserApplication의 가상메모리의 시작주소를 Kernel드라이버에게 전달하여 접근하게 된다. 윈도우에서는 페이징 기법이 사용되므로 다른 메모리를 참조할 가능 성이 있기때문에 쓰지 않는것을 권장한다.

 

어떤 방식을 사용할지는 사용하는 Device Stack의 Top Layer Driver's device object 의 flags 값에 따라 결정된다. 

세팅하는 방법은 

MyDeviceObject->flags |= DO_BUFFERED_IO;

이런식으로 OR 연산으로 세팅을 해주면 된다.

 

가장 많이 사용되는 Buffered I/O 전략에 대해 알아보자.

 

Buffered I/O

- 느린 장치를 서비스 하는 드라이버, 한번에 적은 양의 데이터를 주고 받는 드라이버가 사용할 수 있다.

- Direct I/O 방식에 비해 물리적인 페이지를 잠글 필요가 없기때문에 메모리 사용 효율이 좋다.

- 비디오, 키보드, 마우스 등 장치가 이러한 방식을 사용한다.

 

Buffered I/O Mechanism

 

 

 

 

 

 

 

실제로 Buffered I/O 전략을 이용해 userApplication 에서 WriteFile() apI로 커널 모드와 대화하는 방식을 자세히 살펴보자.

1. WriteFile()에서 버퍼로 준 부분(두번째 파라미터)은 I/O Manager 에 의해 SystemBuffer에 공간을 할당한 후 UserBuffer 값을 복사한다.

 

 

2. 할당된 SystemBuffer의 주소는 IRP->AssociatedIrp.SystemBuffer에 저장되고 , UserIoStatementBlock 의 주소값은 IRP->pUserIoSb에 저장된다. 마지막으로, WriteFile의 네번째 파라미터인 사이즈 값은 IRP의 IoStack의 Parameters.Write.Length에 저장된다.

 

3. 2번에서의 설명처럼 IPR_MJ_WRITE dispatchRoutin 에서는 IRP -> Associated.SystemBuffer 의 값과 Iostack->Parametr.Write.Length 의 값을 루틴 내 변수에 저장한 후 통상적으로 아래와 같은 코드를 작성하여 몇바이트를 수행했는지 알려주고 종료처리요청을 하게된다.

Irp->IoStats.Status = Status_SUCCESS;
Irp->IoStatus.Information = //size// ;
IoCompleteRequest(Irp, IO_NO_INCREMENT);

이후 I/O Manager에 의해서 위 사진처럼 

IRP->pUserIosb->Status = IRP->IoStatus.Stats;

IRP->pUserLosb->Information = IRP->IoStatus.Information;

와 같은 일이 수행된다.!

 

4. 마지막으로 Writefile()의 네번째 파라미터인 &Ret에 UserIoSb->Information 의 값이 들어가게되고 ,

제어가 WriteFile(); 을 수행한 다음 Statement로 돌아오게된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[참고]

lucidmaj7.tistory.com/77

richong.tistory.com/284?category=711194

www.youtube.com/watch?v=MS4st9UmoEM&list=PLbXk0UYjHOuG_-h2sEkOTXGAGVtOGXBN5&index=7

'window driver' 카테고리의 다른 글

Device Object와 Device Stack 형성 과정  (0) 2020.11.24