6

私は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;
}
4

5 に答える 5

12

ポインタは 64 ビット幅ですが、ほとんどのプロセッサは実際には完全な 64 ビットを使用する仮想アドレスをサポートしていません。プロセッサがサポートする仮想アドレスのサイズを確認するには、調べてください/proc/cpuinfo(48 ビットが一般的です)。

grep "address sizes" /proc/cpuinfo

さらに、仮想アドレス空間の半分はカーネルによって使用され、ユーザー空間では使用できません。現在の Linux 実装には 47 ビットが残されています。

ただし、これを考慮しても、20GB のファイルを保存する十分なスペースがあります。理論上の 47 ビットは、128 TB の仮想アドレス空間を意味します。

于 2010-01-29T02:54:53.873 に答える
5

mmap(2)マニュアルページから:

   void *mmap(void *addr, size_t length, int prot, int flags,
              int fd, off_t offset);

lengthは でsize_t、64 ビット マシンでは長さが 64 ビットです。したがって、理論上は 20GB のファイルをマップできます。

于 2010-01-29T02:21:08.570 に答える
1

(この回答は、もともとOPによって質問に編集されました)

サイズがわずか 50MB のファイルに 20GB のマップを要求しました。

mmap のマニュアル ページで説明されているようにmmap、要求した長さが大きすぎる場合は成功しますが、基になるファイルの末尾を超えて実際に読み取ろうとすると、結果が返されますSIGBUSSIGSEGV

于 2014-12-25T21:23:24.103 に答える
1

64 ビット アドレスでは、20 GB を超える何桁もの容量を使用できます。

于 2010-01-29T02:19:30.350 に答える