WinXP 32 비트 용 DDK (상당히 오래된 버전 : 3590)에 문제가 있습니다. 내 드라이버에는 일부 정적 변수가 포함되어 있습니다 (일부는 .bss 섹션에 할당해야합니다). 일부 기능은 페이징 가능한 코드 섹션 (#pragma alloc_page (PAGE, func)으로 표시)에 있습니다. 페이징 가능한 코드는 별도의 오브젝트 파일에 수집됩니다. 나는 링커가 statics와 페이징 가능한 코드를 커널 주소 공간의 같은 페이지에 할당하는 것으로 보인다. (즉, 변수는 0xEFFCB0A0이고 함수는 0xEFFCB600이다 - windbg로 검증 됨). 정적 변수는 인터럽트 환경에서 사용되므로 페이지가 메모리에 잠겨 있어야합니다. 그러나 동일한 페이지에 스왑 가능 코드가 포함되어 있으면 변수가 갑자기 사라질 수 있습니다. 링커의지도는 페이지 가능 코드가 다른 섹션 ("PAGE")에 있지만 오프셋 ("Rva + Base")이 통계를 포함하는 페이지의 중간에 있음을 올바르게보고합니다.#pragma alloc_text (PAGE) 코드가 페이지 정렬되지 않음
링커/로더가 페이지 가능 코드에 별도의 페이지를 할당하도록하려면 어떻게해야합니까? 일부 "#pragma"가 섹션 정렬을 강제 실행합니까? 내가 뭔가 잘못하고 있는거야?
추 신 : 드라이버 로더는 페이징 된 풀에서 변수와 코드를 모두 포함하는 페이지를 넣을만큼 똑똑하지만 페이지에 변수가 있으므로 쓰기 가능해야합니다. 나는 실행 코드가 읽기 전용 페이지에 있었으면 좋겠다. 커널 모드에서의 잘못된 배열 접근은 아직 디버그하기가 어렵습니다 ...
PPS : 내 함수 전후에 4096 "nop"을 추가했습니다. 좋습니다. 제안 할만한 것이 없습니다.
우와, 그 질문은 여기에 오랫동안 매달려있었습니다. 드라이버 실행 코드가 일반적으로 읽기 전용입니까? 결국 코드를 읽기 전용으로 만드는 것은 오히려 최근의 "추세"인 것처럼 보입니다. – Ilya