2013-10-07 3 views
3

: 커널 모드에서 실행커널 모드의 드라이버가 사용자 공간에서 직접 주소를 읽거나 쓸 때 매우주의해야하는 이유는 무엇입니까? MSDN에서

드라이버는 직접 에서 읽거나 사용자 공간에서 주소를 작성하는 방법에 대한 매우주의해야합니다. 이 시나리오 은 그 이유를 설명합니다.

  1. 사용자 모드 프로그램은 장치에서 일부 데이터를 읽는 요청을 시작합니다. 프로그램은 데이터를 수신하는 에 버퍼의 시작 주소를 제공합니다.
  2. 커널 모드에서 실행중인 장치 드라이버 루틴은 읽기 작업을 시작하고 해당 호출자에게 제어를 반환합니다.
  3. 나중에 장치는 읽기 작업이 완료되었다고 말하기 위해 현재 실행중인 스레드를 인터럽트합니다. 이 임의의 스레드에서 실행중인 커널 모드 드라이버 루틴은 이 임의의 프로세스에 속하므로 인터럽트를 처리합니다.
  4. 이 시점에서 드라이버는 1 단계에서 제공 한 사용자 모드 프로그램의 시작 주소에 데이터를 쓰지 않아야합니다.이 주소는 요청을 시작한 프로세스의 가상 주소 공간에있는 이며 현재 프로세스와 같지 않을 가능성이 있습니다.

누구나 이것을 다른 말로 설명 할 수 있습니까? 포인트 2, 3, 4는 명확하지 않습니다. 감사합니다. .

답변

0

각 프로세스에는 가상 주소에서 실제 주소로 변환하는 데 사용되는 데이터 구조 (페이지 테이블)가 포함 된 자체 "실행 컨텍스트"가 있습니다.

가상 주소와 실제 주소 매핑은 그 시점에서 현재 실행중인 프로세스에 따라 달라집니다.

다음과 같은 경우를 보자

  1. 사용자 모드 프로그램 (예를 들어 단일 스레드 "프로세스-A")는 읽기 요청을 시작하고 사용자 공간 버퍼 주소를 전달합니다.

  2. 이 읽기 ​​요청은 커널 모드에서 실행중인 장치 드라이버 루틴에 도달합니다. 이제는 Device 하드웨어의 실제 읽기 작업이 완료되는 데 약간의 시간이 걸릴 가능성이 큽니다. 이 경우 Driver 루틴은 작업 완료를 기다리지 않을 수 있습니다. 대신, 그것은 장치에서 읽기 작업을 시작하고 immedietly로 돌아갑니다. 이 액티비티에서 운영 체제는 읽기 연산이 시작되었지만 아직 완료되지 않았다는 통지를받습니다. OS는 프로세스 A를 대기 상태로두고 다른 프로세스 (스레드)의 실행을 예약합니다.

  3. 나중에 장치가 읽기 작업을 완료하면이를 알리기 위해 인터럽트가 발생합니다. 이 시점에서 임의의 프로세스 (예 : "프로세스 -B")가 실행 중입니다. 즉, 페이지 테이블은 프로세스 -B에 대한 가상 주소와 실제 주소 공간 매핑을 반영합니다. 이 인터럽트를 서비스하기 위해 호출 된 드라이버 루틴은 프로세스 B의 컨텍스트에서 실행됩니다.

  4. 이 시점에서 단계 -1에서 사용자 모드 프로그램이 제공 한 가상 주소에 액세스하면 프로세스 -A의 가상 주소가 아닌 프로세스 -B에 해당하는 가상 주소에 액세스합니다.

는 커널 모드 루틴에서 사용자 공간에 데이터를 전송하기 위해 다른 approches의 "Methods for Accessing Data Buffers"를 참조하십시오.