gpt4 book ai didi

linux - 64 位机器中的最大文件映射大小是多少

转载 作者:IT王子 更新时间:2023-10-29 00:47:49 26 4
gpt4 key购买 nike

我是 64 位架构的新手。你能告诉我 64 位 linux 机器中文件映射支持的最大文件大小是多少吗?我想通过文件映射打开超过20GB的文件,可以吗?

我写了一个示例代码。但是当我在 GBSIZE 偏移量中获取指针的值时,它会导致总线错误:

unsigned char* pCur = pBegin + GBSIZE;
//pBegin is the pointer returned by mmap
printf("%c",*pCur);

顺便说一句,printf("%c",*pBegin ); 工作正常。我的地址大小:38 位物理地址,48 位虚拟地址

完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>

//#define FILEPATH "smallfile"
#define FILEPATH "bigfile"
#define GBSIZE (1024L*1024L*1024L)
#define TBSIZE (1024L*GBSIZE)
#define NUMSIZE (20L * GBSIZE)
//#define NUMSIZE (10)
#define FILESIZE (NUMINTS * sizeof(int))

int main(int argc, char *argv[])
{
int i;
int fd;
unsigned char *pBegin;

fd = open(FILEPATH, O_RDONLY);
if (fd == -1) {
perror("Error opening file for reading");
exit(EXIT_FAILURE);
}

pBegin = mmap(0, NUMSIZE, PROT_READ, MAP_SHARED, fd, 0);
if (pBegin == MAP_FAILED) {
close(fd);
perror("Error mmapping the file");
exit(EXIT_FAILURE);
}

/** ERROR happens here!!! **/
unsigned char* pCur = pBegin + GBSIZE;
printf("%c",*pCur);

if (munmap(pBegin, NUMSIZE) == -1) {
perror("Error un-mmapping the file");
}
close(fd);
return 0;
}

最佳答案

虽然指针是 64 位宽,但大多数处理器实际上并不支持使用完整 64 位的虚拟地址。要查看您的处理器支持的虚拟地址大小,请查看 /proc/cpuinfo(典型值为 48 位)。

grep "address sizes" /proc/cpuinfo

此外,一半的虚拟地址空间由内核使用,用户空间不可用 - 在当前的 Linux 实现中留下 47 位。

但是,即使考虑到这一点,您仍有足够的空间来容纳 20GB 的文件。 47位理论上意味着128TB的虚拟地址空间。

关于linux - 64 位机器中的最大文件映射大小是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2159456/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com