在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下获取有关进程自身内存映射的等效信息(地址范围,保护,映射文件名等等)?
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.)

我已经尝试过的事情:
有人可以清楚地解释我们从Solaris中的prstat获得的SIZE和RSS值的含义吗?
我写了一个测试C++应用程序,它分配内存new[],填充它并释放它delete[].
据我所知,SIZE值应该与进程"保留"了多少虚拟内存有关,即内存"malloced"或"newed".
除非我真的使用它(填充一些值),否则该内存不会在RSS值中总结.但即使我释放内存,RSS也不会下降.
我不明白我能正确分配给这两个值的语义.
任何人都可以详细说明或提供Android内存管理的链接.我对Android虚拟内存方案感到困惑.如何在Android中完成分页?没有硬盘,他们怎么做?他们有缓存吗?
正如标题所示,我有一个从虚拟地址获取物理地址的问题.
让我解释一下:给定进程空间中的变量声明,如何从OS映射它的物理地址?
我已经在一些SYS电话绊倒/asm/io.h在virt_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(包含虚拟页面的物理映射).无论如何,该链接中的代码可以被修改为用作监视器应用程序或其他东西.
我需要物理地址进行缓存模拟.
感谢所有的帮助和答案!
在研究操作系统(主要以Linux作为参考)时,我在研究的材料中找不到很好的解释.
加载到存储器中的程序通常被描述为被分成文本,数据,堆栈等的段,甚至在诸如Linux的操作系统的上下文中,其中虚拟存储器完全基于分页.它只是程序,而不是被称为分段的内存本身吗?如果是这样,我发现术语令人困惑.
我看到malloc可以在Linux中使用调用'sbrk'来实现,这会增加数据段的大小.同样,这个"数据段"是否只是按惯例用于数据的内存区域而不是"真实"段?(额外的问题:'sbrk'似乎无法减小'段'的大小.这是否意味着进程永远不会释放内存到操作系统而不是退出?)
此外,我有兴趣知道为什么现代操作系统似乎不使用(分页)分段.它不会阻止某些类型的攻击使代码驻留在它自己的受保护段中,从而提高安全性吗?另一方面,这会使JIT编译变得不可能/困难吗?
除了上述问题的"是"/"否"答案之外,我对任何有关该主题的深刻阐述感兴趣.
先感谢您.
我的编译在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) 好的,我有一点菜鸟学生的问题.
所以我很熟悉堆栈包含子程序调用,堆包含可变长度数据结构,全局静态变量分配给永久存储器位置.
但这一切如何在较低的理论水平上发挥作用?
编译器是否只是假设它从地址0到地址无穷大有一个完整的内存区域?然后开始分配东西?
它在哪里布局指令,堆栈和堆?在内存区域的顶部,内存区域的结尾?
那么它如何与虚拟内存一起使用?虚拟内存对程序是透明的吗?
很抱歉bajilion的问题,但我正在采用编程语言结构,它一直在指这些区域,我想在更实际的层面上理解它们.
非常感谢!
memory compiler-construction assembly operating-system virtual-memory
我对内核如何加载到内存中有一些疑问。经过检查,/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)
puts在 0x200 的偏移量处说函数。当加载到内存 at 说地址时0x8048000,我将能够puts在0x8048000 + 0x200. 内核也一样吗?即内核映像是否作为 1 个连续.text部分加载到内存中?我问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)
如您所见,我在不同的执行中得到不同的结果.输出的第一行对应于分配的内存的地址,这应该发生在堆中 - 如果每次都为它们分配不同的地址,那对我来说是有意义的.但是,即使我打印局部变量的地址 - …