쓰기로 보호 된 가상 페이지, Catch Write
-
03-07-2019 - |
문제
쓰기로 작성된 페이지에 쓰기를 잡을 수있는 방법이 있습니까?
나는 당신이 그것을 인스턴스화하기 위해 객체를 복사하는 자체와 같은 객체 시스템을 계획하고 있습니다. (나머지와 비교할 때 간단하고 컴팩트 한 것으로 들리기 때문에) 분명히이 목적을 위해 생성 된 객체는 어떤 식 으로든 쓰기로 보호되어야합니다. 엘프의 프로그램 헤더에서 쓰기로 보호 된 무언가를 표시하는 방법이 있음을 알았습니다. (RE, RWE, RW -FLAGS)
이것이 쓰기 보호를 전혀 제공합니까? 나는 그것이 segfault를 키워야한다는 것을 기억합니다. 이것이 사실입니까? 쓰기를 쓰기로 보호하는 페이지로 작성하는 방법. 이것이 내가 원하는 것을 구현하는 좋은 방법이며 더 좋은 방법이 있습니까?
해결책
예, 사용할 수 있습니다 mprotect.
그렇습니다. 보호 된 메모리에 쓰면 segfault가 발생합니다. C ++에 핸들러를 설치할 수 있습니다.
std::signal(SIGSEGV, my_segv_handler_func);
이것은 당신이 원하는 것을 수행하는 그럴듯한 방법이지만, 당신은 그것을 작동시키기 위해 많은 추가 관리 goo를 추가해야합니다. 예를 들어, 이러한 종류의 쓰기 감지는 하드웨어에서 수행되며 X86 아키텍처에서는 페이지 크기가 4K입니다. 따라서 한 번에 4K를 보호하고 4K 경계에 정렬 될 수 있습니다. 일반적인 "주소 X에서 시작하고 N 바이트를 시작하십시오". 나는 당신이 필요하다고 믿습니다
- 페이지에 객체를 매핑하여 페이지에 쓰기가 특정 보호 객체에 쓰기인지 또는
- 항상 4K 경계에 할당되는 자신의 malloc을 굴려서 최소 Alloc'd 블록 크기 4K를 사용하도록합니다.
더 나은 방법이 있다면 내 머리 꼭대기를 알지 못하지만 놀리는 것이 재미있게 들립니다. :)