Tag: 虚拟内存

虚拟内存或物理内存

假设我们用C编写程序并打印程序中声明的变量之一的地址,是在屏幕上打印虚拟地址或变量的物理地址的地址? 如果它是虚拟地址,为什么它仍然具有与物理内存的位范围相同的范围? 例如。 对于32位机器,如果它返回0x833CA23E。

自动/静态内存分配

也许是一个天真的问题,但…… 确认或否认: 自动和静态存储持续时间的对象/变量的内存的存在是在编译时确定的,并且由于没有足够的内存用于自动对象,程序将无法运行时运行。 当然,当自动对象的构造函数执行动态分配并且这样的分配失败时,我们认为这是动态分配的失败,而不是自动的。

为什么局部变量的地址每次都不一样?

我问Google并对StackOverflow进行了一些研究。 我的问题是,当我在C ++程序中输入main()函数并声明第一个变量时,为什么这个变量的地址会因不同的执行而有所不同? 请参阅下面的示例程序: #include int main() { int *a = new int; int *b = new int; std::cout << "address: " << a << " " << b << std::endl; std::cout << "address of locals: " << &a << " " << &b << std::endl; return 0; } 执行结果1: address: 0xa32010 0xa32030 address of […]

如何使用页面error handling程序映射页面?

我想使用struct vm_area_struct *的pagefault处理程序将物理页面映射到用户空间。 以下是我的进展方式: 我在模块初始化期间使用alloc_page(GFP_USER)全局分配页面(我尝试了各种GFP)。 我创建了一个struct vm_area_struct ,设置了一个自定义的vma处理程序,并将vma附加到current->mm 。 发生页面错误时: 我将vmf->page设置为我之前分配的页面并返回0。 结果是,在页面错误之后, vma中的每个虚拟页面都应映射到同一物理页面。 但这是我注意到的: 当我从内核模块写入页面时,它反映在我的用户空间程序中。 当我从用户空间写入页面时,我没有从内核模块中看到它。 当我在我的内核模块中使用get_user_pages来获取页面(而不是使用我的全局变量)时,我得到的物理地址与全局页面变量不同。 我使用page_to_phys(page)打印地址。 写入此页面会反映在我的用户空间程序中。 所有这些都是在页面error handling程序中完成的。 如何解释这种奇怪的行为? 要从内核空间访问页面,我使用的是kmap_atomic和kunmap_atomic 。

如何避免高内存使用率应用程序中的内存不足? C / C ++

我编写了一个转换器,它接受openstreetmap xml文件并将它们转换为二进制运行时渲染格式,通常约为原始大小的10%。 输入文件大小通常为3GB或更大。 输入文件不会一次性加载到内存中,而是在收集点和多边形时进行流式传输,然后在它们上运行bsp并输出文件。 最近在较大的文件上,它耗尽内存并死掉(有问题的一个有1400万个点和100万个多边形)。 通常我的程序在发生这种情况时使用大约1gb到1.2 gb的ram。 我已经尝试将虚拟内存从2增加到8GB(在XP上),但这种改变没有任何效果。 此外,由于此代码是开源的,我希望无论可用的ram(尽管速度较慢)都可以使用它,它可以在Windows,Linux和Mac上运行。 我可以使用哪些技术来避免内存不足? 处理较小子集中的数据,然后合并最终结果? 使用我自己的虚拟内存类型的处理程序? 还有其他想法吗?

使用`madvise`清零大内存映射

我有以下问题: 我通过mmap与MAP_ANONYMOUS分配了一大块内存(多个GiB)。 该块包含一个大的哈希映射,需要时不时地归零。 并非整个映射可以在每一轮中使用(并非每个页面都有错误),因此memset不是一个好主意 – 需要太长时间。 快速做到这一点的最佳策略是什么? 将 madvise(ptr, length, MADV_DONTNEED); 保证我任何后续访问都提供新的空页? 来自Linux man madvise页面: 此调用不会影响应用程序的语义( MADV_DONTNEED除外 ),但可能会影响其性能。 内核可以自由地忽略这些建议。 … MADV_DONTNEED 对此范围内的页面的后续访问将成功,但将导致从底层映射文件(请参阅mmap(2))或零填充按需页面重新加载内存内容,以便在没有基础文件的情况下进行映射。 … 当前的Linux实现(2.4.0)将此系统调用视为命令而不是建议… 或者我是否必须重新映射并重新映射该区域? 它必须在Linux上工作,理想情况下在OS X上具有相同的行为。

C中的指针实现细节

我想知道违反我在下面列出的假设的架构 。 此外,我想知道所有架构的假设是否都是错误的(也就是说,如果它们中的任何一个完全错误的话)。 sizeof(int *)== sizeof(char *)== sizeof(void *)== sizeof(func_ptr *) 无论指向何种数据类型,给定体系结构的所有指针的内存中表示都是相同的。 指针的内存中表示与与体系结构相同的位长的整数相同。 指针数据类型的乘法和除法仅被编译器禁止。 注意:是的,我知道这是荒谬的。 我的意思是 – 是否有硬件支持禁止这种不正确的用法? 所有指针值都可以转换为单个整数。 换句话说,哪些架构仍然使用分段和偏移? 增加指针相当于将sizeof(the pointed data type)到指针存储的内存地址。 如果p是int32*则p+1等于p后4个字节的存储器地址。 我最习惯在连续的虚拟内存空间中使用指针。 对于这种用法,我通常可以将它们视为数字线上的地址。 请参阅堆栈溢出问题指针比较 。