, Shique 분할 FALT의 동작을 읽기 및 쓰기 발생 이상한 문제에 메모리 블록을 할당 malloc에.

시작 현상 : 메모리의 malloc에 ​​조각, 분할 FALT 때 읽기 및 쓰기 작업을 발생합니다. 일반적으로, malloc에 ​​실패 할 경우 우리는 읽을 수 있습니다 또한 malloc을 모두 사용할 수 있어야 포인터를 반환 그래서 한 후, 예외를 던져해야합니다. 그래서 그것은 매우 이상한 만남이 문제를 느낀다.

현상을 계속 : 인쇄 된 주소가 있는지 주소가 조작 앞에 주소가 후. 설명 주소는 보호 지역의 시스템에 있지 않습니다.

현상을 계속 : 메모리의 세그먼트는 문제 만 나타내는 여러 싼가 액세스 할 수의 앞의 주소로 주소로 싼를 찾을 수 있습니다. 메모리는 의심의 여지 일부 코드 세그먼트를 변조한다.

플래시백 : 다시이 메모리에 munmap을 1835008보다 크고 핵심 앤드류스 될 것입니다.

测试代码:
{
INT의 test_size = 1,835,008;
표준 : : cout과 << "test_size :"<< test_size << 표준 : : endl의;
* CHAR ABC = (숯 *)의 malloc (test_size);
ABC [1] = "A";
표준 : COUT << (긴 길이) ABC << 표준 : ENDL;
표준 : COUT << ABC [1] << 표준 : ENDL;
표준 : COUT << munmap은 (ABC test_size) << 표준 : ENDL;
표준 : COUT << ABC [1] << 표준 : ENDL;
무료 (ABC);
ABC = (숯 *)의 malloc (test_size);
표준 : COUT << (긴 길이) ABC << 표준 : ENDL;
표준 : COUT << ABC [1] << 표준 : ENDL;
}

{
INT의 test_size = 1,835,009;
표준 : : cout과 << "test_size :"<< test_size << 표준 : : endl의;
* CHAR ABC = (숯 *)의 malloc (test_size);
ABC [1] = "A";
표준 : COUT << (긴 길이) ABC << 표준 : ENDL;
표준 : COUT << ABC [1] << 표준 : ENDL;
표준 : COUT << munmap은 (ABC test_size) << 표준 : ENDL;
표준 : COUT << ABC [1] << ENDL 표준 : //即使没有这句,下一句打印仍然会코어的
무료 (ABC);
ABC = (숯 *)의 malloc (test_size);
표준 : COUT << (긴 길이) ABC << 표준 : ENDL;
표준 : COUT << ABC [1] << 표준 : ENDL;
}

: 결과
test_size : 1,835,008
506 508 402 240 -1 506 508 401 344



test_size : 1,835,009
506,510,442,496 0 분할 오류


메모리에 어플리케이션의 전면이 상기 메모리는, 상기 사용 가능한 상태이다 506,508,402,240 나중에 다시 적용 할 때 때 액세스된다.

 

결론 : 느낌 mmap에 의해 할당되는 방식으로 메모리에 이상 1,835,008 앤드류이 경우의 메모리 블록이 될 수있다. (긴 수명하거나 특히 큰 ptmalloc이라 구현을 갖 mmap를 메모리에 할당하여, 정의에 의해 제한 될 GLIBC) 맵핑 해제는 해제되지만 맵핑 해제 오프 후에, 메모리 블록 분할 오류를 야기한다. 이 경우, munmap에서 지침을 언급했다. 호출시 (munmap은 프로세스 주소 공간에 매핑 리프트에 대한 호출, ADDR 어드레스이고, LEN은 맵핑 된 영역의 크기이다. 매핑 관계가 해제되면 원래의 어드레스 맵핑에 대한 액세스는 세그먼트 오류가 발생 발생할의 mmap () 리턴. )

munmap을 추측은 메모리의 메커니즘의 작동을-지도 재 수없는 갈등 관리의 혼란을 주도의 glibc glibc는 작동을 운영하고 있습니다.

추천

출처www.cnblogs.com/dongzhiquan/p/11939391.html