2009-04-28 3 views

답변

8

는 따라 다릅니다. 페이지되지 않은 풀은 RAM에 남아 있어야하는 메모리를 위해 예약되어야합니다. 따라서 디스크 작업에서 메모리 페이지의 영향을받는 중요한 작업을 수행하는 경우 비 페이징을 사용하십시오.

자세한 내용은 here을 참조하십시오.

this (비록 C와는 달리 C++에 대해 설명하고 있지만) 기본적으로 전역 변수는 #pragma 중 하나에 위치 할 수 있습니다. 또한 012234의 p22에 우리는 이것을하는 방법을 보았습니다. 마지막으로 this discuss 여기서는 데이터 세그먼트가 기본적으로 페이지가 지정 가능하지 않아야한다는 것을 알 수 있습니다.

+0

No.my 질문은 내가 장치 드라이버에서 전역 변수를 선언하는 경우와 같은 뭔가를해야만, 어떤 메모리, 즉 페이징 풀 메모리 또는 비 페이징 풀 메모리? (로컬 사용될 것입니다 변수는 비 페이징 풀 메모리를 사용합니다). – Navaneeth

+0

그것은 의존하지 않을 것입니다. 페이징 된 풀이나 페이징되지 않은 풀 중 하나입니다. – Navaneeth

+2

#pragma data_seg ("PAGE") int foo; #pragma data_seg ("NONPAGE") int bar; - foo는 페이징 가능하고 bar는 페이징되지 않습니다. pragma를 지정하지 않으면 기본값이 페이징되지 않습니다. – SecurityMatt

2

커널 모드 드라이버의 전역 변수는 NonPagedPool에서 할당됩니다.

IoCreateDevice를 호출 할 때 장치 확장을 사용할 수도 있습니다.이 장치 확장은 항상 NonPaged 메모리에서 할당됩니다.

나는이, 마틴 도움이되기를 바랍니다

+1

사실이 아닙니다. Windows의 커널 드라이버는 여러 섹션이있는 PE 파일이며 일반 사용자 모드 프로그램과 달리 KM 드라이버는 일반적으로 페이징 된 페이징과 페이징되지 않는 페이징 중 하나 (* KM 드라이버가 초기화되었습니다). 코드에서 alloc (또는 실제로 함수)이 alloc pragma의 사용을 통해 페이지되거나 페이징되지 않는지 여부를 선택할 수 있습니다. – SecurityMatt