TL;DR

  • WinSpd는 커널 모드 코드를 작성하지 않고 사용자 모드에서 SCSI 디스크를 만들고 제공해, Windows 저장소 스택에 실제 디스크처럼 추가하는 도구임.
  • 저장 장치는 연속된 64비트 논리 블록 주소(LBA) 공간에서 데이터를 읽고 쓰며, 캐시 비우기와 블록 해제 작업도 지원함.
  • 핵심 구성 요소는 StorPort 가상 미니포트 커널 드라이버와 사용자 모드 저장 장치가 드라이버와 통신하는 DLL임.
  • 실행기 서비스는 사용자 모드 저장 장치를 실행하고 제어하며, 셸 확장은 Windows 탐색기와 셸의 마운트·꺼내기 기능을 구현함.
  • 프로젝트에는 드라이버·DLL·실행기·도구·예제의 소스 코드가 포함되며, GPLv3 및 오픈 소스 소프트웨어 대상 특별 예외와 상용 라이선스를 제공함.

WinSpd 소개

  • WinSpd는 커널 모드 코드를 작성하지 않고 사용자 모드에서 저장 장치(“SCSI 디스크”)를 만들 수 있게 함.
  • 사용자 모드 프로세스인 저장 장치가 저장 장치를 생성하고 제공하며, 해당 장치는 Windows 운영 체제의 저장소 스택에 추가됨.
  • Windows에서는 실제 디스크처럼 표시되며, NTFS와 같은 파일 시스템으로 포맷하고 접근할 수 있음.

사용자 모드 저장 장치

  • 사용자 모드 저장 장치는 저장 장치를 생성하고 제공하는 사용자 모드 프로세스임.
  • 저장 장치는 SCSI SBC 표준에서 정의하는 SCSI “직접 접근 블록 장치”이며, 일반적으로 “SCSI 디스크”라고 부름.
  • 데이터는 논리 블록에 저장되며 각 블록은 같은 크기인 블록 길이(Block Length)를 가짐.
  • 각 블록에는 하나의 연속된 주소 공간에서 사용하는 64비트 논리 블록 주소(LBA)가 있음.
  • WinSpd와 SCSI 표준은 블록 배치에 기존의 실린더·헤드·섹터(CHS) 구조를 전제하지 않음.
  • 저장 장치의 기본 작업은 다음과 같음.
  • 읽기(Read): 지정된 LBA의 블록 읽기.
  • 쓰기(Write): 지정된 LBA에 블록 쓰기.
  • 보조 작업은 다음과 같음.
  • 플러시(Flush): 지정된 LBA의 캐시된 블록 데이터 비우기.
  • 매핑 해제(Unmap): 지정된 LBA의 블록 매핑 해제 및 할당 해제. 널리 알려진 TRIM 명령과 유사함.
  • 사용자 모드 저장 장치 생성에 관한 전체 안내서는 튜토리얼에서 제공함.

설계

  • WinSpd는 각기 다른 책임을 지닌 여러 소프트웨어 구성 요소로 이루어짐.
  • 핵심 구성 요소는 StorPort 가상 미니포트로 구현된 커널 드라이버와 사용자 모드 DLL임.
  • 사용자 모드 저장 장치는 특수 IOCTL을 통해 DLL과 드라이버 사이에서 통신함.
  • 실행기 서비스는 사용자 모드 저장 장치를 실행하고 제어함.
  • 셸 확장은 Windows 탐색기와 셸에서 사용할 수 있는 마운트 및 꺼내기 기능을 구현함.
  • WinSpd 가상 미니포트가 구현하는 SCSI 명령은 다음과 같음.
  • REPORT LUNS
  • TEST UNIT READY
  • INQUIRY: 표준, 지원 페이지 VPD, 일련 번호 VPD, 장치 식별자 VPD, 블록 제한 VPD, 논리 블록 프로비저닝 VPD
  • MODE SENSE(6), MODE SENSE(10): 모든 페이지, 모드 캐싱 페이지
  • READ CAPACITY(10), READ CAPACITY(16)
  • READ(6), READ(10), READ(12), READ(16)
  • WRITE(6), WRITE(10), WRITE(12), WRITE(16)
  • SYNCHRONIZE CACHE(10), SYNCHRONIZE CACHE(16)
  • UNMAP

프로젝트 구성

  • build/VStudio: WinSpd 솔루션 및 프로젝트 파일.
  • ext: 외부 의존성.
  • ext/tlib: secfs(Secure Cloud File System) 프로젝트에서 가져온 소형 테스트 라이브러리.
  • inc: 공개 헤더.
  • inc/winspd: WinSpd API 공개 헤더.
  • src: WinSpd 소스 코드.
  • src/devsetup: 시스템에서 WinSpd 장치 드라이버를 추가하거나 제거하는 devsetup 유틸리티의 소스 코드.
  • src/dll: 사용자 모드 저장 장치가 WinSpd 장치 드라이버와 통신하는 데 사용하는 WinSpd DLL의 소스 코드.
  • src/dotnet: .NET 계층의 소스 코드.
  • src/launcher: 실행기 서비스와 launchctl 유틸리티의 소스 코드. 실행기 서비스는 사용자 모드 저장 장치를 실행하고 제어함.
  • src/scsitool: scsitool 명령줄 유틸리티의 소스 코드.
  • src/shellex: WinSpd 셸 확장의 소스 코드. Windows 탐색기와 셸에서 마운트 및 꺼내기 기능을 구현함.
  • src/stgtest: 저장소 테스트 도구 stgtest의 소스 코드.
  • src/sys: WinSpd 커널 드라이버의 소스 코드.
  • tst: 사용자 모드 저장 장치 예제와 테스트 도구의 소스 코드.
  • tools: WinSpd 빌드 및 테스트를 위한 여러 도구.

라이선스

  • WinSpd는 자유·오픈 소스 소프트웨어를 위한 특별 예외가 적용되는 GPLv3 라이선스로 제공됨.
  • 상용 라이선스도 제공함. 자세한 내용은 Bill Zissimopoulos(billziss at navimatics.com)에게 문의하면 됨.