어댑터 RAM을 프로세스 주소 공간 데이터를 매핑하는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 189327 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

많은 양의 어댑터가 메모리 매핑할 때 다음과 같은 현상 중 하나가 나타날 수 있습니다.
  • 사용할 수 있는 시스템 PTE (NO_MORE_SYSTEM_PTES) 없는.
  • 연속적인 프로세스 주소 공간이 부족합니다.
이 문서에서는 설명합니다.
  • 이러한 문제가 발생하는 이유는
  • 주위에 작동 방법
  • 어댑터 메모리 프로세스 주소 공간으로 매핑할 수 있는 두 가지 방법

추가 정보

페이지 테이블 항목 (PTE) 소개

Windows NT 시스템에서 실행되는 모든 프로세스에는 4GB의 가상 주소를 사용 0xFFFFFFFF에서 0x00000000 이르기까지 있습니다. 이 시스템에서 실행 중인 모든 프로세스 0xFFFFFFFF로 에서 0x8000000 사이의 2GB의 주소 상한 일반적입니다. 그리고 커널 또는 시스템 주소 공간이 호출됩니다. 사용자 주소 공간이 0x7FFFFFFF 할 것을 0x00000000 이르기까지 낮은 지역이 호출됩니다.

프로세스 측면에서 가상 주소의 각 요소는 개념적으로 실제 메모리의 바이트 수 참조합니다. 책임 중 가상 메모리 관리자 (VMM) 와 함께 프로세서 메모리 관리자가 단위 (MMU) 번역 또는 각 가상 주소를 해당 실제 주소로 매핑할 수 있습니다. VMM 매핑의 RAM을 고정 크기의 페이지 프레임으로 나누어 수행하는 이러한 페이지 프레임에 대한 정보를 저장하기 위해 페이지 테이블 만들기 및 이를 매핑. 각 PTE 페이지 프레임을 나타내며 VMM에 대한 페이지를 찾는 데 필요한 정보가 들어 있습니다.

4 KB 페이지 크기를 사용하는 x 86 기반 시스템에서 PTE 2 GB의 주소 공간 매핑하는 데 필요한 최대 524,288 (2 GB/4 KB) 입니다. 일반적인 시스템에서 이 공간은 다음과 같이 사용됩니다.
  • 최대 50,000 PTE (약 195 MB 주소 공간) 의 일반적인 용도로 예약되어 있습니다.
  • 나머지 시스템 캐시, 하이퍼스페이스, 페이징된 풀, 비페이징된 풀, 크래시 덤프 영역 등을 매핑하는 데 사용됩니다.
이 PTE 풀 크기는 시스템에서 실제 메모리 양에 따라 시스템 시작 시 자동으로 결정됩니다. 이 풀은 페이징된 풀 또한 뿐만 아니라 시스템 실제 메모리 양이 증가함에 따라 비페이징된 풀 사이에 들어가야.

시스템, 장치 드라이버 (및 그 DLL), I/O 전송 또는 호출자가 MmMapIoSpace/MmMapLockedPages/MmGetSystemAddressForMdl/MmAllocateNonCachedMemory 및 기타 목적으로 다른 시스템 가상 주소 공간을 매핑하는 로드할 커널 스레드 스택을 만드는 이러한 PTE를 사용합니다. 이 시스템 PTE 풀이 많이 사용할 수 있으며 심하게 조각화된 될 수 있습니다. 전체 주소 공간 내의 여전히 남아 있지만 드라이버 연속 가상 주소 공간이 부족하여 시스템 PTE 풀이 주어진 시간에 가져오려면 못할 수 있습니다 이 즉 충분히 클 수 있습니다.

시스템 PTE 풀이 완전히 드라이버를 사용하는 경우 시스템의 다른 부분에, 심지어 일부 드라이버는 할당할-시스템 메모리 MustSucceed 매개 변수 집합 사용하여 호출하는 때문에), 시스템 주차칸 및 완전히 버그 검사를 스레드가 생성되지 않으며 결과 저하됩니다 있다는 것을 의미합니다.

이 풀 전용 맵을 사용할 때는 매우 주의해야 합니다. 어댑터 시스템 실제로 필요한 RAM 부분을 모든 프로세스 컨텍스트에서 액세스 및 필요한 양만 매핑할 사용. 실제로 모든 시스템 모드에서 액세스할 필요가 없는 경우 전체 어댑터 범위가 매핑되지 않습니다.

중요: 오른쪽 프로세스 컨텍스트에서 끝나면 즉시 메모리 매핑 해제. 그렇지 않으면, 시스템 PTE 벗어났습니다 실행하고 확인란 버그 됩니다. 총 시스템 메모리 - 최대 값은 까지 (늘려야 등호 페이지 수에) 숫자를 추가하여 시 레지스트리에 기반으로 PTE 계산된 기본 수를 늘릴 수 있습니다:
   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
   \Memory Management\SystemPages
				
사용하면 현재 사용 가능한 "자유 시스템 페이지 테이블 성능 모니터를 사용하여 항목" 모니터링할 수도 있습니다.

참고: 어댑터 메모리 페이지를 페이지 대체 사용됩니다. 프로세스가 유휴 또는 out 완전히 바뀐 경우에도 해당 프로세스의 주소 공간에 매핑된 남아 있습니다.

다음은 가장 일반적인 두 가지 어댑터 메모리 매핑할 수 있습니다. 첫 번째 방법은 직접 프로세스의 사용자-공간으로 메모리가 매핑되고 두 번째 방법은 프로세스의 시스템 - 공간으로 및 선택적으로 사용자 공간에 매핑됩니다. 두 이 방법 모두 인접해야 실제 메모리가 필요합니다. PTE 제한 때문에 사용하면 많은 양의 시스템 공간에 메모리 매핑할 수 없습니다. 그러나 사용자가 이를 않은 조각난 또는 사용되는 경우 사용자 공간으로 매핑할 수 있습니다.

구역 개체 메서드

해당 Windows NT 4.0이 이 매핑을 수행하는 방법을 보여 주는 DDK를 있는 (사용 가능한 MSDN Professional 구성원을 통해) 샘플 (MAPMEM) 입니다. 개요를 기술은 다음과 같습니다.

  1. 어댑터 메모리 번역된 실제 주소 가져오기 (HalTranslateBusAddress).
  2. 실제 메모리 장치 \Device\PhysicalMemory 섹션을 핸들을 (ZwOpenSection)을 엽니다.
  3. 개체 핸들을 (ObReferenceObjectByHandle)을 사용하여 삭제되지 않도록 참조하십시오.
  4. (ZwMapViewOfSection) 메모리를 매핑하십시오.
ZwMapViewOfSection에서 가져올 가상 주소가 이가 매핑된 프로세스의 컨텍스트에서 유효하지 않습니다. 사용자 드라이버 지연된 프로시저 호출 (DPC) 메모리 액세스 또는 임의의 프로세스 컨텍스트에서 실행되는 서비스 루틴 (ISR), 인터럽트 원하는 경우 다음 방법으로 사용) 시스템 주소 공간에서 메모리를 매핑할 수도 합니다. 전에 매핑된 프로세스 컨텍스트 (ZwUnMapViewOfSection) 동일한 메모리 매핑 해제 종료됩니다.

참고: 일반적으로 것은 위험한 실제 페이지 이미 소유하고 않으면 \Device\PhysicalMemory 사용하여 ZwMapViewOfSection 사용할 수 있습니다. 페이지 소유자가 페이지 특성을 변경할 수 있으므로 이를 거의 항상 원인이 메모리 손상이 소유하고 있지 않은 것을 매핑하는 드라이버 페이지, 약속 및 다른 변경 작업을. 드라이브 자신이 소유한 메모리를 매핑 합니다. 또한 엄격하게 잘못된 실제 주소가 서로 다른 두 특성이 함께 동시에 매핑할 수 있습니다 (즉, 캐시된 vs noncached 및 writecombined). 이렇게 하면 프로세서 TLB 손상 및 예기치 않은 결과가 발생합니다.

드라이버가 충돌하는 특성 동시에 같은 실제 주소로 매핑할 경우 WindowsXP에 대한 ZwMapViewOfSection 함수를 STATUS_CONFLICTING_ADDRESSES 오류를 반환합니다.

MmMapIoSpace 메서드

이 메서드는 시스템 프로세스 주소 공간 및 프로세스 사용자 주소 공간이 메모리 매핑하는 방법을 보여 줍니다.
  1. 어댑터 메모리 (HalTranslateBusAddress) 의 번역된 실제 주소를 가져옵니다.
  2. 다음과 같이 메모리가 비페이징된 시스템 주소 공간에 매핑하는:
          SystemVirtualAddress = MmMapIoSpace(PhysicalAddress, SizeofMemory,
             CacheEnable);
    					
  3. 할당하지 않은 Mdl:
          Mdl = IoAllocateMdl(SystemVirtualAddress, SizeOfMemory, FALSE, FALSE,
             NULL);
  4. 메모리 페이지를 설명하는 MDL 빌드:
          MmBuildMdlForNonPagedPool(Mdl);
  5. 프로세스에 메모리를 매핑할 사용자 공간이 MmMapLockedPages 사용하는 것입니다. 있기 때문에 일관성이 Windows NT의 이전 SP4 및 SP4 릴리스 사이에 이 함수의 반환 값이 있는 다음 문을 사용하여 이 코드는 모든 버전의 Windows NT에서 호환되도록:
          UserVirtualAddress = (PVOID)(((ULONG)PAGE_ALIGN(MmMapLockedPages(Mdl,
             Mode))) + MmGetMdlByteOffset(Mdl));
    					
자세한 내용은 아래 문서 번호를 눌러 Microsoft 기술 자료에 있는 문서를 클릭하십시오.
199311정보: SP4에서 실제 가상 주소 MmMapLockedPages가 반환합니다.
이 방법의 장점은 DPC 및 ISR) 와 같은 모든 프로세스 컨텍스트에서 사용할 수 있는 SystemVirtualAddress 및 해당 컨텍스트에서 매핑된 사용자 모드 응용 프로그램에서 사용할 수 있는 UserVirtualAddress 가져오는 것입니다.

매핑 시스템 주소 공간에 매핑하는 경우 사용자가 다음과 같은 해제 합니다:
MmUnmapIoSpace(SystemVirtualAddress, SizeofMemory);
				
매핑 사용자 주소 공간으로 매핑할 경우 사용자가 다음과 같은 메모리 매핑된 프로세스의 컨텍스트에서 실행되는 동안 해제 합니다:
MmUnmapLockedPages(UserVirtualAddress, Mdl); 

Finally, free the MDL by calling:

IoFreeMdl(Mdl);
				

참조

자세한 내용은 Windows NT 4.0 DDK를 설명서 또는 "내부 Windows NT에서" 김소희 Custer (Microsoft Press 1993)을 참조하십시오.

속성

기술 자료: 189327 - 마지막 검토: 2005년 3월 7일 월요일 - 수정: 1.2
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Win32 Device Driver Kit for Windows NT 4.0
키워드:?
kbmt kbhowto kbkmode KB189327 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.
더 이상 지원되지 않는 제품의 KB 내용에 대한 고지 사항
이 문서에서는 Microsoft에서 더 이상 지원하지 않는 제품에 대해 설명합니다. 따라서 이 문서는 "있는 그대로" 제공되며 업데이트되지 않습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com