본문 바로가기

My Study/Programming&Theory

Data Read/Write in Cache

프로젝트 때문에 파일 시스템 필터 드라이버를 만들어봐야되는데 파일 시스템 필터 드라이버 같은 경우는 캐시 개념이 빠질수가 없습니다. 그래서 책 공부하다가 중요한 내용이 나와 정리 차원에서 올려봅니다.
====================================================================================================
데이터의 처리와 관련된 부분은 데이터 읽기와 쓰기 과정에서 거의 처리된다. 그리고 나머지 부분은 캐시 관리자가 제공하는 함수들의 사용법만 이해하면 된다.

데이터 읽기 동작

<출처 : 드라이버 개발자를 위한 윈도우 파일 시스템 - 데이터 읽기 동작>

항상 애플리케이션에서 전달되는 모든 동작은 I/O 관리자를 거쳐 파일 시스템 드라이버에 전달된다.
이제 각 번호를 설명하겠다.

1.  애플리케이션이 ReadFile() Win32 API 함수를 사용하여 데이터 읽기 동작을 요청하고, 제어는 커널에 있는 I/O 관리자에 전달된다.

2.  I/O 관리자는 애플리케이션에서 전달된 데이터 읽기 동작에 대한 IRP를 생성한 뒤 이를 직접 적절한 파일 시스템 드라이버에 전달한다.

 애플리케이션과 데이터를 주고받기 위해 사용되는 메모리 관리 기법에는 세 가지 방식이 있다. 첫째는 사용자가 유저 모드에서 할당된 메모리의 내용을 커널 모드의 시스템 가상 주소 공간으로 복사하는 Buffered 방식이다. 둘째는 입출력 관리자가 사용자 버퍼를 가리키는 MDL(Memory Descriptor List)을 할당하고 MDL과 관련된 페이지를 보호하는 방식을 택함으로써 데이터의 복사 과정 없이 직접 유저 모드에서 할당된 메모리와 데이터를 주고받는 DMA 방식이다. 마지막은 유저 모드에서 할당된 가상 주소를 I/O 관리자가 수정하지 않은 상태로 파일 시스템 드라이버에 전달하는 Neither 방식이다. 일반적으로 대부분의 파일 시스템 드라이버와 통신을 하기 위해 사용되는 방식은 MDL이며, 가끔 Neither 방식을 사용하는 경우도 있다. 단, Neither 방식을 선택한 경우에는 항상 스레드 컨텍스트가 유저 모드 컨텍스트와 일치해야 한다.


3. 파일 시스템 드라이버가 데이터 읽기 요청을 받고 Buffered 액세스를 위해 오픈된 파일에 직접 데이터 읽기 동작을 지시한다. 이 경우 데이터 읽기 동작을 실행하고자 하는 파일이 캐싱되지 않았다면 (FileObject->PrivateCachedMap == NULL) 파일 시스템 드라이버가 캐시 관리자를 호출하여 파일에 대한 캐싱을 초기화하고, 캐시 관리자는 VMM(Virtual Memory Manager)에 캐시된 파일을 위해 파일 매핑(섹션 오브젝트)을 생성하도록 지시한다.

4. 파일 시스템 드라이버는 캐시 관리자에서 제공하는 CcCopyRead() 함수를 사용하여 데이터 읽기 요청을 캐시 관리자에게 전달한다. 캐시 관리자는 이 요청을 받은 후 사용자 버퍼에 데이터를 전달하기 위해 필요한 모든 단계를 담당한다. 이후 데이터를 캐싱하기 위한 단계는 전적으로 캐시 관리자가 담당한다.

5. 캐시 관리자는 파일의 데이터 구조를 검사하고, 사용자가 요청한 데이터 영역의 값에 대한 매핑된 뷰가 있는지 결정한다. 이때 매핑된 뷰가 없으면 캐시 관리자는 매핑된 뷰를 생성한다.

6. 캐시 관리자는 매핑된 뷰에서 사용자 버퍼로 메모리 복사를 수행한다. 

7. 파일의 매핑된 뷰가 실제 요구된 데이터를 포함하는 물리 페이지와 연결되어 있지 않으면 페이지 오류가 발생하고, 페이지 오류를 해결하기 위한 필요한 동작을 수행하도록 가상 메모리 관리자에 제어를 넘긴다. 

8. VMM은 물리 페이지를 할당하고 I/O 관리자를 통해 파일 시스템 드라이버에 물리 디스크에서 데이터를 읽기 위한 I/O(Non-cached Paging I/O Read) 요청을 전달한다. 

9. Non-cached 데이터 읽기 요청을 받은 파일 시스템 드라이버는 하드 디스크와 같은 보조 저장 장치에 있는 데이터를 얻기 위한 I/O 요청을 생성한다. 그리고 새로 생성된 I/O 요청을 디스크 드라이버나 SCSI 드라이버와 같은 실제 보조 저장 장치를 관리하는 하위 레벨 드라이버에 전달한다.

10. 계층 구조상 파일 시스템 드라이버 아래에 위치하는 디스크 드라이버와 같은 하위 레벨 드라이버가 보조 저장 장치에서 데이터를 얻고 I/O 요청을 종료한다.

11. 파일 시스템 드라이버는 가상 메모리 관리자가 요구한 페이징 I/O 요청을 종료하고, 제어를 가상 메모리 관리자에 전달한다.

12. 페이지 오류를 발생시켰던 명령을 다시 실행한다.

13. 캐시 관리자는 파일의 매핑된 뷰에서 사용자 버퍼로 데이터 복사를 완료한다.

14. 캐시 관리자는 캐시된 데이터를 사용자 버퍼로 복사한 후, 제어를 파일 시스템 드라이버에 전달한다. 이때 데이터는 아직 캐시 관리자가 사용하기 위한 가상 주소 공간에 캐시된 상태로 남아 있다.

15. 파일 시스템 드라이버는 I/O 관리자가 처음에 전달한 IRP에 대한 처리를 종료한다.

16. I/O 관리자가 데이터 읽기 요청을 완료한다.

데이터 저장 동작

<출처 : 드라이버 개발자를 위한 윈도우 파일 시스템 - 데이터 쓰기 동작>

데이터 저장 동작은 위에서 설명한 데이터 읽기 동작과 유사하다.

1. 애플리케이션이 WriteFile() Win32 API 함수를 호출하여 데이터 저장을 요청하고, 제어는 커널에 있는 I/O 관리자로 이동한다.

2. I/O 관리자가 IRP를 생성하여 적절한 파일 시스템 드라이버에 직접 데이터 저장 요청 명령을 전달한다. 이때 사용되는 버퍼의 관리 방식은 데이터 읽기 동작과 동일하다.

3. 파일 시스템 드라이버는 Buffered 액세스를 위해 오픈된 파일에 직접 데이터 저장을 지시한다. 이때 데이터 저장을 실행하는 파일이 캐싱되지 않았다면  파일 시스템 드라이버가 캐시 관리자를 호출함으로써 파일을 캐싱할 것을 지시한다. VMM는 캐시된 파일에 대한 파일 매핑(섹션 오브젝트)을 생성한다.

4. 파일 시스템 드라이버는 캐시 관리자가 제공하는 CcCopyWrite() 함수를 사용하여 데이터 저장 요청을 캐시 관리자에 전달한다.  

5. 캐시 관리자는 데이터 구조를 검사하고, 사용자가 수정한 데이터 영역을 포함하는 파일에 대한 매핑된 뷰가 어디에 있는지 결정한다. 만약 매핑된 뷰가 없으면 캐시 관리자가 파일에 대해 매핑된 뷰를 새로 생성한다.

6. 캐시 관리자가 메모리 복사를 구현한다. 이때 메모리 복사는 사용자 버퍼에서 파일의 매핑된 뷰와 연관된 가상 주소 공간으로 이루어진다.

7. 가상 주소 영역이 물리 페이지와 연결되어 있지 않다면 페이지 오류가 발생하는데 이를 해결하기 위해 VMM로 제어가 이동한다.

8. VMM는 요청된 데이터를 저장하기 위하여 사용될 물리 페이지를 할당한다. 사용자가 전체 페이지를 덮어 씌울 경우에는 캐시 관리자나 가상 메모리 관리자가 데이터를 수정하기 전에 디스크와 분리되어 이미 물리 페이지에 있는 데이터는 읽지 않는다. 그러나 일부 페이지가 수정되었다면 페이지의 수정이 허락되기 전에 VMM는 페이지 오류를 처리하기 위해 데이터 읽기 위한 페이징 I/O(Paging I/O Read) 요청을 발생시킨다. 페이지 오류를 처리한 후 페이지 오류를 발생시켰던 명령이 다시 실행된다.

9. 캐시 관리자가 사용자 버퍼에서 파일의 매핑된 뷰와 연관된 가상 주소 영역으로 데이터의 복사를 완료한다.

10. 캐시 관리자가 제어를 파일 시스템 드라이버로 전달한다. 이때 사용자 데이터는 시스템 메모리에 있으며, 아직 보조 저장 장치에 전달하지 않은 상태이다. 실질적인 보조 저장 장치로의 저장은 캐시 관리자가 나중에 처리한다. 

11. 캐시 관리자가 데이터 저장 요청을 종료한다.

12. 파일 시스템 드라이버는 I/O 관리자가 처음에 전달한 IRP를 종료하고, IRP의 종료 메시지를 I/O 관리자에 전달한다.

13. I/O 관리자가 사용자 데이터 저장 요청을 완료한다. 

'My Study > Programming&Theory' 카테고리의 다른 글

API Listbox에서 가로 스크롤 넣기  (1) 2011.08.10
커널 데이터 버퍼  (0) 2011.07.26
Windows Cache  (2) 2011.05.31
Share Memory & Share Moudle  (0) 2011.05.26
Interrupt Descriptor Table Architecture  (0) 2011.05.18