함수가 포함된 메모리 페이지의 시작 부분을 가져오고 싶습니다.
제 경우에는 페이지 시작 부분에 메인 기능을 구현해 보았습니다. 그 중 0x400a80
메모리의 코드 부분에 위치해 있는 것 같아요. 이것이 사실인지 확인해 주시면 감사하겠습니다.
내가 아는 바로는 주소가 0x400a80
페이지에 있습니다.
프로세스의 메모리 세그먼트 표시를 사용하면 pmap
8K 크기로 시작하는 세그먼트 와 4K 크기로 시작하는 0x400000
다음 세그먼트가 표시됩니다.0x601000
0x400000
함수의 주소가 있기 때문에 주소를 얻고 싶습니다 main()
. 페이지에 주소가 있는 경우 페이지의 시작 주소를 어떻게 알 수 있나요? 이 작업을 수행하기 위해 Linux에 내장된 방법이 있습니까?
답변1
Unix 및 Linux StackExchange에 오신 것을 환영합니다!
이 질문에 대한 답변이 더 나을 수도 있습니다스택 오버플로, 프로그래밍 문제 해결을 전담하는 StackExchange 사이트입니다. 하지만 어쨌든...
x86 아키텍처에서 표준 메모리 페이지는 4KiB, 즉 0x1000바이트입니다. 메모리 페이지는 주소 0에서 시작하며 중복되지 않고 연속적으로 할당됩니다.
메모리 페이지의 시작 주소를 찾으세요:
beginning of page = memory address AND (NOT page size - 1)
따라서 주소가 0x400a80이면 페이지 시작 = 0x400a80 AND (0x000fff 아님) = 0x400a80 AND 0xfff000 = 0x400000입니다.
답변2
메모리 위치가 포함된 페이지의 시작 부분을 찾고 있다면 다음을 사용할 수 있습니다.sysconf(_SC_PAGE_SIZE)
반올림된 시스템의 페이지 크기를 검색합니다.
void *alloc;
long pagesz;
pagesz = sysconf(_SC_PAGESIZE);
printf("Default page size: %ld\n", pagesz);
alloc = malloc(512 * 1024 * 1024);
printf("512MiB allocated at %zx\n", alloc);
printf("The corresponding page starts at %zx\n", (((off_t) alloc) / pagesz) * pagesz);
페이지 크기가 다른 경우 오해의 소지가 있을 수 있습니다.예를 들어Linux에서 거대한 매핑을 사용할 때.
메모리 위치가 포함된 주소 공간 할당의 시작을 찾고 있다면 이를 수행할 수 있는 이식 가능한 방법을 모르겠습니다. Linux에서 매핑 정보를 검색하기 위한 인터페이스예 /proc/self/maps
이므로 열어서 구문 분석해야 합니다.