簡體   English   中英

為什么mmap在32位armv7l上的4GB文件成功了?

[英]Why mmap a 4GB file on 32-bit armv7l succeeded?

我從mmap(2)手冊頁和搜索結果中得到的印象是, mmap僅限於系統的可用地址空間,減去系統保留的地址空間。 所以在32位armv7l上,我認為它大約是3GB =(4GB - 1GB)。

但似乎我實際上可以毫無問題地mmap 5 GB文件:

int main(int argc, char** argv) {
        // stats
        char * path = argv[1];
        struct stat sb; 
        stat(path, &sb);
        std::cout << "File size: " << sb.st_size << std::endl;  

        // open
        int fd = open(path, O_RDONLY, S_IRWXU);
        std::cout << "File descriptor: " << fd << std::endl;
        int i;
        for (i =0; i<10; ++i){
                void *pa = mmap(
                        nullptr, sb.st_size, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, fd, 0);
                std::cout << "PA: " << pa  
                        << ", MAP_FAILED: " 
                        << (pa == MAP_FAILED) << ", Status: " 
                        << strerror(errno) << std::endl;
        }   
}

使用-D_FILE_OFFSET_BITS=64標志進行編譯:

g++  -D_FILE_OFFSET_BITS=64 test.cc

結果產生:

File size: 5045966585
File descriptor: 3
PA: 0x89f80000, MAP_FAILED: 0, Status: Success
PA: 0x5d34a000, MAP_FAILED: 0, Status: Success
PA: 0x30714000, MAP_FAILED: 0, Status: Success
PA: 0x3ade000, MAP_FAILED: 0, Status: Success
PA: 0xffffffff, MAP_FAILED: 1, Status: Cannot allocate memory
PA: 0xffffffff, MAP_FAILED: 1, Status: Cannot allocate memory
PA: 0xffffffff, MAP_FAILED: 1, Status: Cannot allocate memory
PA: 0xffffffff, MAP_FAILED: 1, Status: Cannot allocate memory
PA: 0xffffffff, MAP_FAILED: 1, Status: Cannot allocate memory
PA: 0xffffffff, MAP_FAILED: 1, Status: Cannot allocate memory

從結果來看,mmap成功了4次才真正陷入困境。 但它不應該成功,因為文件大約是5GB。

我的問題是:

  1. 這種行為是否適用於mmap
  2. 如果沒有,我哪里做錯了?

編輯:

使用物理地址擴展(PAE),32位系統可以添加超過2 ^ 32個字節(如果可用)。

此CPU沒有PAE支持

$> cat /proc/cpuinfo

Processor       : ARMv7 Processor rev 4 (v7l)
processor       : 0
BogoMIPS        : 1436.46

processor       : 1
BogoMIPS        : 1436.46

Features        : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt 
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xc07
CPU revision    : 4

Hardware        : sun7i
Revision        : 0000
Serial          : 09c11b9d52544848804857831651664b

PAE無關緊要。 這不是關於訪問大量物理內存。

問題是您的mmap函數采用32位值作為映射的大小。 因此,您的64位大小會被截斷,實際上您實際分配的虛擬內存不到1 GB。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM