애플리케이션에서 메모리 페이지 제출을 명시적으로 제어할 수 있습니까? 몇 년 전, 저는 Windows 애플리케이션에서 임의의 매달린 참조/힙 손상 오류를 찾는 데 도움이 되는 "경고 시스템" 힙 관리자를 작성했습니다. 넓은 가상 메모리 영역을 예약하고 원하는 대로 페이지를 커밋/커밋 해제할 수 있습니다. 아이디어는 커밋되지 않은 페이지와 하나 이상의 커밋된 페이지(요청을 충족하기에 충분함)를 포함하는 컬렉션을 만들고 마지막으로 커밋되지 않은 또 다른 페이지를 사용하여 호출자에게 반환된 포인터가 위치에 있는지 여부를 제어하는 것입니다. 커밋된 영역의 시작 또는 끝(각각 인수 또는 덮어쓰기 시 즉시 예외가 트리거됨) Windows는 메모리 영역을 예약하고 페이지를 커밋하기 위한 API를 제공합니다. 내가 작성 중인 Linux 프로그램에는 이러한 북엔드 버퍼에 대한 또 다른 용도가 있는데, 커널이 동일한 유형의 기능을 제공하는지 궁금합니다.
답변1
내 생각엔 당신이 말하는 것 같아요VirtualAlloc
그리고친구. 내가 아는 한 Linux에는 직접적으로 동등한 기능이 없지만 여러 가지 방법으로 동일한 효과를 얻을 수 있습니다. 메모리를 예약하려면 다음을 사용할 수 있습니다.mmap(2)
;커밋하려면 작성해야 하며 언로드하려면 다음을 사용할 수 있습니다.madvise(2)
의 MADV_DONTNEED
.
보호된 페이지를 구현하려면 다음을 찾을 수 있습니다.mprotect(2)
핸들러와 함께 가는 것이 더 나은 선택이 됩니다 SIGSEGV
. 또한 컴파일러가 제공하는 오버플로 방지( -fstack-protector
그리고 무엇보다도 다양한 -fsanitize
옵션)를 살펴볼 수도 있습니다.
답변2
복잡한 메모리 관리자를 구현하는 대신 자신의 프로그램을 디버그하고 싶다면 다음과 같은 것을 사용하는 것이 좋습니다.월그린드메모리 누수 및 매달린 포인터를 감지합니다.