상세 컨텐츠

본문 제목

1차 중간평가

청강컴정/시스템프로그래밍

by luckey 2009. 4. 30. 21:01

본문

1. 용어설명
  1) 디바이스 드라이버
      하드웨어를 구동하는 소프트웨어
  2) 디바이스 스택
      하나의 추상(논리)적인 디바이스를 구성하고 있는 복수개 각각의 전문화된 디바이스들의 모임.
      이것은 윈도우 운영체제애에서 보다 효과적인 디바이스 관리를 위해 전문화된 여러 종류의 드라이버들이 저마다
      필터드라이버, 서비스 드라이버, 버스드라이버 형식으로 하나의 디바이스 구동에 참여하도록 지원된다.
  3) IRQL
      0부터 31까지의 대수학적인 값을 가지는 CPU가로채기 요청 레벨을 의미한다.
      보다 높은 레벨의 IRQL을 가진 루틴은 낮은 레벨의 IRQL을 가진 루틴으로부터 CPU를 선점할 수 있다.
  4) IDLE스케쥴러
      Primary스케쥴러와 구분되며, 운영체제 내에서 더 이상 구동시킬 Thread가 없을 때 CPU를 잠시 정지(HALT)시키는
      역할을 수행하며, 이후 깨어난 Thread로 다시 CPU에 참여하는 스케쥴러를 의미한다.
      IDLE스케쥴러가 CPU를 가지는 시기가 많은 경우 결과적으로 CPU 사용량이 무척 작다는 것을 의미한다.
  5) IRP
      IO Manager 가 Device Stack을 구성하고 있는 각각의 드라이버들을 비동기적으로 다루기 위해서 사용하는
      명령어 패킷
  6) INF File
      Device Driver를 설치하는데 사용되는 설치정보를 담고 있는 파일
  7) PNPID
      윈도우 운영체제 내에서 서로 다른 하드웨어 장치를 구분하여 Device Driver를 설치하도록 지원하는 ID
  8) Device Object
      Device Driver가 Device Stack에 포함되기 위해서 갖추는 자료구조.
      추상적인 개념의 Device 가 된다. Device Driver는 Device Object를 만들어서 Device Stack에 포함시켜야 IRP명령을 
      받을 수 있다.

2. SIMPLE드라이버를 제작하기 위해서 필요한 파일들은 최소한 3가지가 있다.
이것들은 다음과 같다.
SIMPLE.C
SOURCES
MAKEFILE
이들 파일의 역할을 설명한다.

SIMPLE.C : Device Driver 소스파일
SOURCES : DDK가 제공하는 공용 MAKEFILE을 사용하여 Driver를 Build하는 경우에 요구되는 필드정보파일
MAKEFILE : Device Driver를 Build하는 방법을 서술하는 기본 빌드 정보파일


3. AAA드라이버가 버스 드라이버이다.
BBB드라이버가 주 서비스 드라이버이다.
CCC드라이버가 클래스 하위 필터 드라이버이다.
DDD드라이버가 장치상위필터 드라이버이다.
EEE드라이버가 클래스 상위 필터 드라이버이다.
FFF드라이버가 장치 하위 필터 드라이버이다.
그렇다면 이들이 모두 같이 구성되어지는 디바이스스택(드라이버스택)의 모습을 그린다.

 EEE 클래스 상위 필터(Fido)
 DDD 장치 상위 필터(Fido)
 BBB 주 서비스 드라이버(FDO) 
 CCC 장치 하위 필터(Fido)
 FFF 클래스 하위 필터(Fido)
 AAA 버스드라이버(PDO)



4. 장치관리자다이알로그 박스에서 장치 종류별보기와 장치 연결별보기의 의미에 대해서 설명한다.
   종류별 보기 : 장치의 사용목적 및 유형별로 나열
   연결별 보기 : 장치가 컴퓨터에서 인식되는 순서대로 나열

5. 가상메모리 0x00000000부터 0x7FFFFFFF 까지의 영역과 가상 메모리 0x80000000부터 0xFFFFFFFF까지의 영역은 서로
   사용되는 의미에 있어서 다른점을 가지고 있다. 이런 특징을 비교하여 설명한다.
0x00000000 ~ 0x7FFFFFFF : 사용자 레벨의 특권을 가진 프로그램들을 위해 존재하는 공간
                                       (일반적인 응용프로그램을 위한 공간)
0x80000000 ~ 0xFFFFFFFF : 커널 레벨의 특권을 가진 프로그램들만 접근이 가능한 공간
                                       (디바이스 드라이버를 위한 공간)


6. 멀티 CPU를 사용하는 환경에서 발생할 수 있는 동기화 문제에 대해서 논한다.
   1) 동일한 메모리 내에 존재하는 동일한 코드가 여러 CPU에 의해서 동시에 실행될 수 있다.
   2) 서로 다른 메모리내에 존재하는 서로 관련된 코드가 여러 CPU에 의해서 각각 동시에 실행될 수 있다.
   이와 같은 특징으로 인해 전역메모리사용과 하드웨어 접근코드를 작성시에 동기화 문제가 발생 될 수 있다.

7. Class GUID와 Interface GUID를 구분하여 설명한다.
   Class GUID : Device Driver를 설치하는데 사용되는 유형별 구분 코드
   Interface GUID : Device Driver가 어떤 서비스를 제공하는지를 설명하는 구분코드로써 응용프로그램은 이 코드를
                          사용하여 Device Driver와 연결을 시도한다.

8. 응용프로그램이 디바이스드라이버를 호출하는 목적으로 사용하는 KERNEL32.DLL이 제공하는 API함수를 모두 나열한다.
    CreateFile(), ReadFile(), WriteFile(), DrviceIoControl(), CloseHandle(), CancelIo(), SetFilePointer()등

9. 중첩파일입출력핸들을 사용하는 경우와 비중첩파일입출력핸들을 사용하는 경우의 차이점에 대해서 설명한다.
   중첩파일입출력핸들
   - 동일한 파일 핸들을 사용하는 복수개의 파일 입출력 요청은 모두 드라이버 측으로 전달된다.
   비중첩파일입출력핸들
   - 먼저 진입한 파일입출력요청이 종료되지 않으면 나머지 요청들은 모두 대기(시리얼라이징)한다.

10. 디바이스스택을 구성하는 드라이버내에서 IRP를 다룰 때 사용되는 비동기를 위한 중단점함수의 필요성에 대해서 설명한다.
   CPU보다 Hardware가 반응시간이 느리다는 성격으로 인해, DeviceStack은 응용프로그램의 특정요청에 대한 수행결과를
   일정시간 기다리게 되는데, 이때 기다리는 시간 동안 응용프로그램이 다른 작업을 진행할 수 있도록 지원하기 위하여 
   DeviceStack내의 드라이버들은 비동기적인 방식으로 IRP를 다루게 된다.
   이때, IRP가 종료되는 시기에 IRP종료과정에 참여하기를 원하는 드라이버들은 중단점함수를 설정하여 개입한다.
   그렇지 않으면 그 어떤 방법으로도 IRP가 종료되는 시기를 비동기적으로 인식할 수 없다.

11. 응용프로그램의 버퍼를 드라이버에게 소개하는 방법중에서 시스템버퍼를 사용하는 방법과 MDL을 사용하는 방법에 대해서
   비교 설명한다.
   응용프로그램이 드라이버에게 전달하는 버퍼전달방식중 시스템버퍼를 사용하는 방식은 운영체제로 하여금 비동기적으로
   접근이 가능한 커널레벨의 가상메모리(시스템버퍼)를 임시로 할당하도록 하여 DeviceDriver는 SystemBuffer를 마치 
   ApplicationBuffer처럼 여기고 사용하는 환경을 제공한다.
   MDL을 사용하는 방식은, 사용자의 버퍼를 설명하는 일종의 설명자(MDL)을 운영체제가 작성하여 DeviceDriver에게 제공하는
   방식으로 DeviceDriver는 MDL을 사용해서 필요시 얼마든지 시스템버퍼를 매핑해서 사용할 수 있는 방법을 제공하고 있다.

12. 사용자특권에서 컨러특권으로 이동하는데 사용되는 INT 0x2E 명령어와 SYSENTER명령어에 대해서 비교 설명한다.
    INT 0x2E명령어는 윈도우 2000까지 사용되던 사용자 레벨에서 커널 레벨로 진입하는데 사용되는 명령어 이다.
    이 명령어는 비교적 CPU클럭 사용이 많다는 단점을 가지고 있지만, CPU가 자동으로 링트랜젝션(스택교환작업)을 수행한다는
    이점을 가진다.
    SYSENTER명령어는 윈도우 XP부터 사용되던 사용자 레벨부터 커널 레벨로 진입하는데 사용되는 명령어 이다.
    이 명령어는 빠른 시간안에 레벨 변환이 이루어진다는 장점을 가지고 있어서, 윈도우 내에 빈번하게 발생하는 사용자레벨과
    커널 레벨간의 레벨 변환에 유리하다는 특징을 가진다.
    하지만, 기존에 사용되던 INT 0x2E 명령어가 해주던 스택교환작업을 CPU가 더이상 하지 않기 때문에 윈도우 커널은
    스택교환작업을 대신 수행해 주어야 한다.

13. IoSkipCurrentIrpStackLocation() 함수와 IoCopyCurrentIrpStackLocationToNext() 함수의 차이점을 설명한다.
     IoSkopCurrentIrpStackLocation()
     DeviceStack내의 상위층의 드라이버가 하위층의 드라이버들이 어떻게 IRP를 종료하는지에 대해서 더 이상 관여하고 싶지
     않을때 사용하는 IRP Stack Parameter 전달방식에 사용된다.
     
     IoCopyCurrentIrpStackLocationToNext()
     상위층의 드라이버 입장에서 하위층의 드라이버들이 IRP를 종료하는 시기에 개입하는 것을 허락하여 비동기적인
     IRP처리방식을 지원하는데 사용되는 IRP Stack Parameter 전달 방식에 사용된다.

관련글 더보기

댓글 영역