내가 원하는 작업은 다음과 같습니다. 64 비트 Linux 용 라이브러리가 있습니다. 그런 다음 해당 라이브러리를 연결하는 응용 프로그램을 만들었습니다. 응용 프로그램을 실행할 때 라이브러리에서 할당 된 메모리가 항상 상위 위치 (> 4GB)에 있는지 확인하려고합니다.64 비트 Linux에서 상위 주소 (> 4GB)에서 메모리 할당을 할당하십시오.
Windows에서, 테스트 목적으로 낮은 주소 이전에 높은 주소에서 할당하는 할당을 강제로 사용자가에서 VirtualAlloc를 호출 할 때 MEM_TOP_DOWN을 지정하거나 0x100000에서 다음 레지스트리 값 설정 :
HKEY_LOCAL_MACHINE \ 시스템 \ CURRENTCONTROLSET 컨트롤 \ 세션 \를 관리자 \ 메모리 관리 \ AllocationPreference
Linux에 비슷한 전략이 있는지 궁금합니다. Linux 메모리 관리가 Window와 다르다는 것을 이해하지만 mmap() 또는 링커 스크립트를 사용하는 것과 같은 단서를 발견했습니다. 그러나 나는 목표를 달성하지 못했습니다. 누구든지 더 많은 정보를 제공 할 수 있습니까?
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)
int main()
{
void *addr1=0, *addr2=0;
long sz = sysconf(_SC_PAGE_SIZE); // get page size
size_t length = sz*1000*1000; // 1,000,000 pages
int fd = -1;
printf("page size = %ld\n", sz);
// find some available address
int *p = (int*)malloc(sizeof(int));
long start = (long)p + sizeof(int);
free(p); // free it anyway
start += (sz-(start % sz)); // page alignment
printf("start = 0x%lx\n", start);
// mmap fixed
addr1 = mmap((void*)start, length, PROT_NONE,
MAP_PRIVATE|MAP_NORESERVE|MAP_ANONYMOUS|MAP_FIXED, fd, 0);
if (addr1 == MAP_FAILED)
handle_error("mmap");
printf("first map: %tx\n", addr1);
//msync(addr1, length, 0);
// another mmap
addr2 = mmap(NULL, sz*10, PROT_NONE,
MAP_ANONYMOUS|MAP_PRIVATE, fd, 0);
if (addr2 == MAP_FAILED)
handle_error("mmap");
printf("second map: 0x%tx\n", addr2);
// test whether the memory is still available
p = (int*)malloc(sizeof(int)*10);
printf("allocated address: 0x%tx\n", p);
return 0;
}
출력 : 당신이이 (처음 네 기가 바이트 일부 주소를 제공 mmap
을 피할 수) 그렇게 할 이유가 이해하지
page size = 4096
start = 0x1d77000
first map: 1d77000
second map: 0x7f5f26c2f000
allocated address: 0x1d76030
왜 하시겠습니까? 어떤 문제가 해결 될까요? – Mat
그리고 어떻게 가상 메모리 페이지가 물리적으로 어디에 있는지 알 수 있습니까? –
Mat : 포인터 잘라 내기 버그를 더 간신히 간질이라고 생각합니다! – duskwuff