标签: virtual-memory

在OS X 10.5/10.6中检索自己进程的内存映射

在Linux中,查看进程内存映射的最简单方法是查看/proc/PID/maps,给出如下内容:

08048000-08056000 r-xp 00000000 03:0c 64593      /usr/sbin/gpm
08056000-08058000 rw-p 0000d000 03:0c 64593      /usr/sbin/gpm
08058000-0805b000 rwxp 00000000 00:00 0
40000000-40013000 r-xp 00000000 03:0c 4165       /lib/ld-2.2.4.so
40013000-40015000 rw-p 00012000 03:0c 4165       /lib/ld-2.2.4.so
4001f000-40135000 r-xp 00000000 03:0c 45494      /lib/libc-2.2.4.so
40135000-4013e000 rw-p 00115000 03:0c 45494      /lib/libc-2.2.4.so
4013e000-40142000 rw-p 00000000 00:00 0
bffff000-c0000000 rwxp 00000000 00:00 0

如何在OSX 10.5或10.6下获取有关进程自身内存映射的等效信息(地址范围,保护,映射文件名等等)?

macos virtual-memory memory-mapping

9
推荐指数
1
解决办法
6728
查看次数

如何使Visual Studio保持4GB虚拟地址空间

Visual Studio devenv.exe进程是32位(即使在64位操作系统上运行),因此它不能使用超过4GB的虚拟内存.

不幸的是,当我使用Visual Studio调试我的C++应用程序时,由于这个4GB的限制,我经常会耗尽内存.例如,使用VMMap,下面显示了在几个小时内导致崩溃的典型Visual Studio使用情况的进展情况.

如何让Visual Studio使用更少的内存,以免浪费时间崩溃?

Visual Studio是否通常使用超过3.5 GB的虚拟地址空间?

我使用的是Visual Studio 2012,但我认为这个问题跨越了不同的VS版本,因为Visual Studio 2015仍然没有64位版本.

(请注意,VMMap将"Free"报告为地址空间中的剩余内存,32位进程最多为4GB,Windows上为64位进程则为8TB.)

在此输入图像描述 在此输入图像描述 在此输入图像描述 在此输入图像描述 在此输入图像描述 在此输入图像描述 在此输入图像描述


我已经尝试过的事情:

  • 从安全模式开始
  • 删除所有插件和扩展,以便在工具>加载项管理器或工具>扩展中不显示任何内容(https://github.com/tsasioglu/Total-Uninstaller对此有帮助)
  • 删除我的.suo/.sdf文件
  • 删除我的AppData/*/Microsoft/VisualStudio文件夹
  • 使用漏斗并过滤除3个项目之外的所有项目
  • 删除了所有"符号文件(.pdb)位置"选项并选择"自动加载符号:""仅指定模块"
  • 选择"启用我的代码"进行调试
  • 禁用智能感知(工具 - >选项 - >文本编辑器 - > C/C++ - >高级 - >禁用智能感知)

c++ virtual-memory visual-studio

9
推荐指数
1
解决办法
1274
查看次数

prstat输出中SIZE和RSS值的含义

有人可以清楚地解释我们从Solaris中的prstat获得的SIZE和RSS值的含义吗?

我写了一个测试C++应用程序,它分配内存new[],填充它并释放它delete[].

据我所知,SIZE值应该与进程"保留"了多少虚拟内存有关,即内存"malloced"或"newed".

除非我真的使用它(填充一些值),否则该内存不会在RSS值中总结.但即使我释放内存,RSS也不会下降.

我不明白我能正确分配给这两个值的语义.

solaris virtual-memory

8
推荐指数
1
解决办法
4万
查看次数

Android虚拟内存和分页

任何人都可以详细说明或提供Android内存管理的链接.我对Android虚拟内存方案感到困惑.如何在Android中完成分页?没有硬盘,他们怎么做?他们有缓存吗?

paging android virtual-memory

8
推荐指数
1
解决办法
1万
查看次数

Linux(Ubuntu),C语言:虚拟到物理地址转换

正如标题所示,我有一个从虚拟地址获取物理地址的问题.

让我解释一下:给定进程空间中的变量声明,如何从OS映射它的物理地址?

我已经在一些SYS电话绊倒/asm/io.hvirt_to_phys()函数定义; 但是看起来这个标题已经过时了,我无法找到解决方法.

然而; io.h可在以下位置获得:/usr/src/linux-headers-2.6.35-28-generic/arch/x86/include/asm/.我当前的内核是2.6.35-28,但io.h不包括在内/usr/include/asm/

所以,重申一下:我需要一种从虚拟中获取物理地址的方法.优选地,在运行时从应用程序内派生.但即使是使用监视器的解决方法/proc/PID/maps也可以.

任何想法或意见将不胜感激.


编辑 在对这个主题做了一些研究之后,我发现了一些在这方面有所帮助的东西.

事实证明这是可行的,虽然需要一些解决方法.这是一个分析当前映射页面的简单应用程序的链接.有问题的文件是(二进制文件)/proc/pid/pagemap(包含虚拟页面的物理映射).无论如何,该链接中的代码可以被修改为用作监视器应用程序或其他东西.

我需要物理地址进行缓存模拟.

感谢所有的帮助和答案!

c linux virtual-memory

8
推荐指数
1
解决办法
9364
查看次数

现代操作系统中的内存分割

在研究操作系统(主要以Linux作为参考)时,我在研究的材料中找不到很好的解释.

加载到存储器中的程序通常被描述为被分成文本,数据,堆栈等的段,甚至在诸如Linux的操作系统的上下文中,其中虚拟存储器完全基于分页.它只是程序,而不是被称为分段的内存本身吗?如果是这样,我发现术语令人困惑.

我看到malloc可以在Linux中使用调用'sbrk'来实现,这会增加数据段的大小.同样,这个"数据段"是否只是按惯例用于数据的内存区域而不是"真实"段?(额外的问题:'sbrk'似乎无法减小'段'的大小.这是否意味着进程永远不会释放内存到操作系统而不是退出?)

此外,我有兴趣知道为什么现代操作系统似乎不使用(分页)分段.它不会阻止某些类型的攻击使代码驻留在它自己的受保护段中,从而提高安全性吗?另一方面,这会使JIT编译变得不可能/困难吗?

除了上述问题的"是"/"否"答案之外,我对任何有关该主题的深刻阐述感兴趣.

先感谢您.

operating-system virtual-memory memory-segmentation

8
推荐指数
1
解决办法
2947
查看次数

虚拟内存耗尽:无法分配内存

我的编译在ubuntu 12.10上失败,300mb内存可用(总共750mb,对于MySQL为350mb),1.5ghz,我试图将wt的基本hello world文件重新编写成一个简单的ajax页面.我很确定这不是内存问题,因为我能够编译原始的hello.C文件g++ -O3 -o hello hello.C -lwtfcgi -lwt -lboost_signals.

我确定我搞砸了c ++,因为我HelloApplication::HelloApplication(const WEnvironment& env) : WApplication(env)从Wt :: Json示例中删除了内容并放入了示例

HelloApplication::HelloApplication(const WEnvironment& env)
  : WApplication(env)
{
    Json::Object result;
    Json::parse("{ "
             "  \"a\": \"That's great\", "
             "  \"b\": true "
             "}",
             result);

    std::cerr << "Size: " << result.size(); << std::endl; // Size: 2
    WString s = result.get("a");
    bool b = result.get("b");
    std::cerr << "a: " << s << ", b: " << b << std::endl; // a: That's great, …
Run Code Online (Sandbox Code Playgroud)

c++ json compiler-errors wt virtual-memory

8
推荐指数
3
解决办法
8915
查看次数

编译器如何在内存中布置代码

好的,我有一点菜鸟学生的问题.

所以我很熟悉堆栈包含子程序调用,堆包含可变长度数据结构,全局静态变量分配给永久存储器位置.

但这一切如何在较低的理论水平上发挥作用?

编译器是否只是假设它从地址0到地址无穷大有一个完整的内存区域?然后开始分配东西?

它在哪里布局指令,堆栈和堆?在内存区域的顶部,内存区域的结尾?

那么它如何与虚拟内存一起使用?虚拟内存对程序是透明的吗?

很抱歉bajilion的问题,但我正在采用编程语言结构,它一直在指这些区域,我想在更实际的层面上理解它们.

非常感谢!

memory compiler-construction assembly operating-system virtual-memory

8
推荐指数
1
解决办法
1910
查看次数

linux内核加载的基址

我对内核如何加载到内存中有一些疑问。经过检查,/proc/kallsyms我能够找到内核中各种符号的地址。

$ cat /proc/kallsyms | head -n 10
00000000 t __vectors_start
80008240 T asm_do_IRQ
80008240 T _stext
80008240 T __exception_text_start
80008244 T do_undefinstr
80008408 T do_IPI
8000840c T do_DataAbort
800084a8 T do_PrefetchAbort
80008544 t gic_handle_irq
800085a0 T secondary_startup
Run Code Online (Sandbox Code Playgroud)
  1. 有什么办法可以找到加载内核的基地址吗?
  2. 在用户空间中,假设我使用 libc 并puts在 0x200 的偏移量处说函数。当加载到内存 at 说地址时0x8048000,我将能够puts0x8048000 + 0x200. 内核也一样吗?即内核映像是否作为 1 个连续.text部分加载到内存中?

linux elf kernel-module virtual-memory linux-kernel

8
推荐指数
1
解决办法
1万
查看次数

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

我问Google并对StackOverflow做了一些研究.我的问题是,当我main()在C++程序中输入函数并声明第一个变量时,为什么这个变量的地址会因不同的执行而有所不同?请参阅下面的示例程序:

#include <iostream>

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;
}
Run Code Online (Sandbox Code Playgroud)

执行结果1:

address: 0xa32010 0xa32030
address of locals: 0x7fff10de2cf0 0x7fff10de2cf8
Run Code Online (Sandbox Code Playgroud)

执行结果2:

address: 0x1668010 0x1668030
address of locals: 0x7ffc252ccd90 0x7ffc252ccd98
Run Code Online (Sandbox Code Playgroud)

执行结果3:

address: 0x10e0010 0x10e0030
address of locals: 0x7ffd3d2cf7f0 0x7ffd3d2cf7f8
Run Code Online (Sandbox Code Playgroud)

如您所见,我在不同的执行中得到不同的结果.输出的第一行对应于分配的内存的地址,这应该发生在堆中 - 如果每次都为它们分配不同的地址,那对我来说是有意义的.但是,即使我打印局部变量的地址 - …

c c++ memory virtual-memory aslr

8
推荐指数
1
解决办法
450
查看次数