페이지의 시작 주소 얻기

페이지의 시작 주소 얻기

함수가 포함된 메모리 페이지의 시작 부분을 가져오고 싶습니다.

제 경우에는 페이지 시작 부분에 메인 기능을 구현해 보았습니다. 그 중 0x400a80메모리의 코드 부분에 위치해 있는 것 같아요. 이것이 사실인지 확인해 주시면 감사하겠습니다.

내가 아는 바로는 주소가 0x400a80페이지에 있습니다.

프로세스의 메모리 세그먼트 표시를 사용하면 pmap8K 크기로 시작하는 세그먼트 와 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이므로 열어서 구문 분석해야 합니다.

관련 정보