c–Ubuntu 10.04,MAP_HUGETLB与MAP_SHARED一起使用时出错

c–Ubuntu 10.04,MAP_HUGETLB与MAP_SHARED一起使用时出错,第1张

概述以下是我用于使用hugepages在ubuntu中对文件进行mmaping的代码,但是这个调用失败并出现错误“invalid argument”.但是,当我通过时MAP_ANON标志在mmap中没有文件描述符参数,然后它可以工作.我无法理解这背后可能的原因.其次,我无法理解为什么MAP_PRIVATE允许文件mmaping,此标志本身意味着不会将更改写回文件

以下是我用于使用hugepages在ubuntu中对文件进行mmaPing的代码,但是这个调用失败并出现错误“invalID argument”.但是,当我通过时
MAP_ANON标志在mmap中没有文件描述符参数,然后它可以工作.我无法理解这背后可能的原因.

其次,我无法理解为什么MAP_PRIVATE允许文件mmaPing,此标志本身意味着不会将更改写回文件.这总是可以使用MAP_ANON来完成,还是我缺少一些东西?

有人可以帮我这些吗?

int32_t main(int32_t argc,char** argv) {int32_t map_length = 16*1024*1024; // 16 MB,huge page size is 2 MBint32_t protection = PROT_READ | PROT_WRITE;int32_t flags = MAP_SHARED | MAP_HUGETLB;int32_t file__ = open("test",O_RDWR|O_CREAT | O_LARGEfile,s_IRWXU | S_IRGRP | S_IROTH);if(file__ < 0 ) {    std::cerr << "Unable to open file\n";    return -1;}if (ftruncate(file__,map_length) < 0) {    std::cerr    << "main :: unable to truncate the file\n"    << "main :: " << strerror(errno) << "\n"    << "main :: error number is " << errno << "\n";    return -1;}voID *addr= mmap(NulL,map_length,protection,flags,file__,0);if (addr == MAP_Failed) {    perror("mmap");    return -1;}const char* msg = "Hello World\n";int32_t len = strlen(msg);memcpy(addr,msg,len);munmap(addr,map_length);close(file__);return 0;}
最佳答案你的问题都归结为同一点:使用mmap()可以获得两种映射:匿名内存和文件.

匿名内存(如手册页中所述)不受文件系统中任何文件的支持.相反,从MAP_ANON调用mmap()返回的内存是纯系统内存.该接口的主要用户是C库,它使用它来获取malloc / free的后备存储.因此,使用MAP_ANON明确表示您不想映射文件.

文件支持的内存类型将文件(或其部分)混合到应用程序的地址空间中.在这种情况下,内存内容实际上由文件的内容支持.将MAP_PRIVATE标志视为首先为文件分配内存,然后将内容复制到此内存中.事实上,这不是内核正在做的事情,但让我们假装.

HUGE_TLB是内核为匿名内存提供的功能(请参阅mmap()手册页中引用的documentation / vm / hugetlb-page.txt).这应该是在将HUGETLB用于文件时mmap()调用失败的原因. *编辑:不完全正确.有一个RAM文件系统(hugetlbfs)支持大页面.但是,huge_tlb映射不适用于任意文件,因为我理解文档.*

有关如何使用HUGE_TLB和相应的内存文件系统(hugetlbfs)的详细信息,您可能需要考虑LWN上的以下文章:

> Huge Pages,Part 1(简介)
> Huge Pages,Part 2(接口)
> Huge Pages,Part 3(行政)
> Huge Pages,Part 4(基准测试)
> Huge Pages,Part 5(TLB费用) 总结

以上是内存溢出为你收集整理的c – Ubuntu 10.04,MAP_HUGETLB与MAP_SHARED一起使用时出错全部内容,希望文章能够帮你解决c – Ubuntu 10.04,MAP_HUGETLB与MAP_SHARED一起使用时出错所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1048608.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存