问题标签 [virtual-memory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
716 浏览

c - 专家 - GCC 和 ld 链接器:重新初始化 .data 部分中包含的变量?

在 C 程序中,我需要重新初始化所有全局变量,因为它们在程序启动时用于测试目的。

我想重现由 GCC 库通过重新初始化功能完成的从加载内存地址、LMA 到 VMA(运行时地址)的数据副本。例如,如果 foo 变量被声明为全局变量并已初始化。如果我的重新初始化函数是 re_init():

然后我想有一个输出:

我相信这样做的正确方法是使用默认链接器文件,也许还有将初始值复制到 RAM 的启动代码。那么,使用 GCC(cygwin),我应该怎么做才能实现这一目标?

编辑:这个页面似乎更精确:http: //sources.redhat.com/binutils/docs-2.12/ld.info/Output-Section-LMA.html#Output%20Section%20LMA

0 投票
4 回答
691 浏览

c++ - C++ 应用程序超出内存但不使用虚拟内存

我有一个应用程序,它用“new”分配内存并在代码的某些部分用“delete”释放它们。问题是,每当它超过系统的内存限制(比如 2GB)时,Windows 就会向进程发送一个 Kill 信号。我认为这不常见,因为它应该使用交换空间(我认为在 Windows 中它被称为虚拟内存),对吧?我的应用程序是用 C++/Visual Studio 编写的。

0 投票
5 回答
2334 浏览

windows - Windows 操作系统中的内核内存包含什么?

众所周知,在 32 位 Windows 操作系统下运行的程序只有 2GB 的可用虚拟内存。众所周知,其他 2GB 被保留为内核空间。但是那个内核空间实际上是什么?

我可以理解内核本身所需的储备,但为什么进程的 VAS 中有内核空间?谢谢。

0 投票
2 回答
3494 浏览

linux-kernel - Mel Gorman 的“理解 Linux 虚拟内存管理器”是否过时了?

我正在尝试更深入地了解 linux 的虚拟内存管理器。如果发现 Mel Gorman 写的名为“Understanding the Linux Virtual Memory Manager[1]”的书,看起来相当详尽。不幸的是,它基于 2.4 内核系列,所以它有点古老。

有人读过书吗?它仍然相关吗?备择方案?

[1] http://www.kernel.org/doc/gorman/pdf/

0 投票
5 回答
16079 浏览

memory-management - 为什么 16 位地址和 12 位偏移量会导致 4KB 页面大小?

我正在阅读“现代操作系统”一书。我对“页面大小”感到困惑。

在书中,作者说,

传入的 16 位虚拟地址分为 4 位页码和 12 位偏移量。使用 4 位作为页码,我们可以有 16 个页面,使用 12 位作为偏移量,我们可以寻址一个页面内的所有 4096个字节。

为什么是 4096 字节?使用 12 位,我们可以解决一个页面内的 4096 个条目,正确。但是,一个条目是一个地址(在这种情况下,地址大小 = 16 位)。所以我认为我们可以寻址 4096(entry) * 16(bit) = 4096(entry) * 2(byte) = 8KB,但是为什么书上说我们可以寻址 4096(bytes) 呢?

提前致谢!:)

0 投票
2 回答
860 浏览

c++ - 使用页面文件进行缓存?

我必须处理通常不适合主内存的大量数据。我访问这些数据的方式具有很高的局部性,因此将部分数据缓存在内存中看起来是一个不错的选择。仅 malloc() 一个巨大的数组是否可行,并让操作系统找出要分页的位以及要保留的位?

0 投票
3 回答
2003 浏览

c# - 内存管理 - 如何以及何时将大对象写入磁盘

我正在开发一个应用程序,该应用程序可能具有较大的内存负载(> 5gb),但由于客户部署环境,它需要在基于 32 位和 .NET 2 的桌面上运行。到目前为止,我的解决方案是为这些大容量对象使用应用程序范围的数据存储,当一个对象被分配给存储时,存储检查应用程序的总内存使用量,如果它接近限制它将开始将存储中的一些旧对象序列化到用户的临时文件夹,并在需要时将它们检索回内存中。这被证明是绝对不可靠的,就像应用程序中的其他对象开始使用内存一样,存储没有提示清理和腾出空间。我确实看过使用弱指针来保存内存中的数据对象,当它们被释放时它们被序列化到磁盘,

我应该使用任何有用的模式/范式来处理这个问题吗?我已经广泛搜索,但还没有发现任何有用的东西。

0 投票
3 回答
49017 浏览

memory - 确定虚拟内存的页表大小

考虑一个具有 38 位虚拟字节地址、1KB 页面和 512 MB 物理内存的虚拟内存系统。这台机器上每个进程的页表总大小是多少,假设有效位、保护位、脏位和使用位总共占用 4 位,并且所有虚拟页都在使用中?(假设磁盘地址没有存储在页表中。)

0 投票
2 回答
2681 浏览

linux-kernel - 内核中映射的 fork 和用户空间内存的交互

考虑一个使用get_user_pages(或get_page)映射来自调用进程的页面的 Linux 驱动程序。然后将页面的物理地址传递给硬件设备。进程和设备都可以读取和写入页面,直到双方决定结束通信。特别是,在调用get_user_pages返回的系统调用之后,通信可以继续使用页面。系统调用实际上是在进程和硬件设备之间建立一个共享内存区域。

我担心如果进程调用会发生什么fork(它可能来自另一个线程,并且可能在调用的系统调用get_user_pages正在进行或稍后发生)。特别是,如果父级在分叉之后写入共享内存区域,我对底层物理地址了解多少(可能由于写时复制而改变)?我想了解:

  1. 内核需要做什么来防御潜在的行为不端的进程(我不想造成安全漏洞!);
  2. 进程需要遵守哪些限制才能使我们的驱动程序的功能正常工作(即物理内存保持映射到父进程中的相同地址)。

    • 理想情况下,我希望子进程根本不使用我们的驱动程序(它可能exec几乎立即调用)来工作的常见情况。
    • 理想情况下,父进程在分配内存时不必采取任何特殊步骤,因为我们有现有代码将堆栈分配的缓冲区传递给驱动程序。
    • 我知道madvisewith MADV_DONTFORK,可以让内存从子进程的空间中消失,但它不适用于堆栈分配的缓冲区。
    • “当你与我们的司机有连接时不要使用叉子”会很烦人,但如果满足第 1 点,作为最后的手段是可以接受的。

我愿意被指向文档或源代码。我特别查看了Linux Device Drivers,但没有发现这个问题得到解决。即使只是应用于内核源代码的相关部分的 RTFS 也有点让人不知所措。

内核版本不是完全固定的,而是最近的版本(比方说​≥2.6.26)。我们只针对 Arm 平台(目前是单处理器,但多核指日可待),如果重要的话。

0 投票
2 回答
83 浏览

windows - 当我们测量函数的性能时,如何清空缓存

CPU 缓存总是会中断我们测试某些代码的性能。

当你衡量你的代码性能时,你如何消除缓存的影响。

我在 Windows 中找到了一些功能或方法来执行此操作。
请给我你的好建议。谢谢。