Eu entendo que o espaço de endereço usado de PCs de 64 bits é [0,2^48)
, mas posso usar mmap para mapear um arquivo para um endereço acima de 2 48 ?
Eu escrevi o seguinte código, mas descobri que o endereço mapeado ainda estava dentro [0,2^48)
.
int
main(void) {
const char* name = "/tmp/file";
int fd = open(name, O_RDONLY);
if (fd < 0) {
perror("open");
exit(-1);
}
int pageSize = sysconf(_SC_PAGE_SIZE);
void* targetAddr = (void*)(0UL - pageSize);
char* str = mmap(targetAddr, pageSize, PROT_READ, MAP_SHARED, fd, 0);
if (str == MAP_FAILED) {
perror("mmap");
exit(-1);
}
printf("addr: %p\n", str);
return 0;
}
Saída de amostra:addr: 0x7fc761f6f000
É possível mapear algum arquivo para o endereço acima de 2 48 com mmap
?
Se não, como posso usar o bit48-bit63 "não usado"?
Estou curioso para saber como usar os bits mais altos do endereço.
SO: Ubuntu16.04
Tamanho da memória: 4 GB
Você só pode mapear qualquer coisa acima de 2 48 se tiver habilitado tabelas de página de cinco níveis, o que oferece 56 bits de espaço de endereço virtual, ou se estiver no kernel (que usa a metade superior do espaço de endereço).
Observe que os bits acima dos bits “usados” não são usados, eles são reservados e devem ser iguais ao bit mais usado. x86-64 define uma forma canônica , onde o espaço do usuário tem endereços começando com todos os bits zero, e o espaço do kernel tem endereços começando com todos os bits. Veja também o mapa de memória do kernel .