标签: virtual-memory

32(x86)上应用程序内存空间的最大大小?2 Gb还是1 Gb?

在32位系统上应用(理论上)有多少内存?不同的操作系统?2或1 Gb?

谢谢!

x86 virtual-memory

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

使用页面文件进行缓存?

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

c++ caching virtual-memory

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

如何在.Net中获取OutOfMemoryException?

在一个内存饥渴的应用程序我正在开发我面临OutOfMemoryExceptions.我希望虚拟内存永远不会有这种异常.为什么如果需要更多RAM而不是可用操作系统不使用HD作为RAM?

.net memory out-of-memory virtual-memory

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

在Linux上,打印功能地址总是打印1(c ++)

我正在开发一个处理不同变量和函数地址的c ++程序.

当我在基于Linux的操作系统上编译我的程序时,包括main的所有函数都获得1的地址而不是像其他变量一样的8位六进制数,这在Windows中没有发生.

我写了这段小代码来解释这个问题

#include <iostream>
using namespace std;
void Function1();
void Function1()
{
}
int main()
{
int tmp;
void (*a) ()=&Function1;
cout<<a<<endl;
cout<<&Function1<<endl;
cout<<&main<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)

对于所有3个cout呼叫,输出为1而不是虚拟地址.

我真的很感谢你的帮助

感谢Advance Aziz

c++ printing cout virtual-memory

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

“linux进程地址空间”是如何存储的?

从书中读到,当一个进程启动时,它的私有进程地址空间被创建

假设它是从 0x0 到 0xMAX

空间的一部分是堆,我们写了一个 for 循环来继续 malloc(1k 日期),直到它返回 false。它分配了 3GB 的日期。

那么问题来了,如果一开始就分配了0x0到0xMAX,那说明0x0到0xMAX从一开始就大于3GB(因为有栈,控制...)?

如果一个进程一开始可以占用3GB以上,那一定是我理解错了。

谁能解释这个 0x0 - 0xMAX 是如何存储在乞讨中的?

linux malloc process virtual-memory

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

我可以依赖'sizeof'来确定我使用的是32位操作系统还是64位操作系统

假设我不确定如何检查我正在运行的操作系统.

所以我想确定使用下面的代码:

#include <limits.h>
...
size_t os_size = sizeof(void*) * CHAR_BIT;
Run Code Online (Sandbox Code Playgroud)

我可以100%依赖它,还是有任何需要注意的警告?

例如:

我是否有可能安装32位操作系统的编译器并在64位操作系统上正常工作?

谢谢

c c++ virtual-memory 32bit-64bit

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

释放内存不会导致页面错误

与保留和提交虚拟存储器至过程实验,我分配64K字节的内存VirtualAlloc,memcpy"DA测试字符串进去,printf倒是它像一个字符串,释放的内存VirtualFree与所述MEM_RELEASE标志,并且printf"再次ð它.由于某种原因,不会触发页面错误.为什么是这样?

#include <stdio.h>
#include <windows.h>

INT main(DWORD argc, LPSTR argv[]) {
    SYSTEM_INFO info;
    DWORD dwPageSize;
    DWORD dwMemSize;
    LPVOID lpvMem;

    GetSystemInfo(&info);
    dwPageSize = info.dwPageSize;
    dwMemSize = 16 * dwPageSize;

    lpvMem = VirtualAlloc((LPVOID) 0x00F00000, dwMemSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    if (!lpvMem) {
        printf("Error allocating virtual memory\n");
        return 1;
    }

    printf("lpvMem = 0x%08X\n", (UINT32) (UINT64) lpvMem);

    if (!memcpy(lpvMem, "I love foxes \\(^o^)/", 21)) {
        printf("Error copying memory (error code 0x%08X)\n", GetLastError()); …
Run Code Online (Sandbox Code Playgroud)

c windows winapi virtual-memory

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

当我们运行可执行文件时,是否会立即将所有部分加载到内存中?

所以可执行文件包含不同的部分和标题.

ELF Header我们可以看到一些关于它们的元数据,如不同标题的大小,起点等.

可执行文件的不同部分是否一次性加载到内存中?

如果是,如何/何时定义以及我们可以在哪里看到有关该信息的信息,因为ELF Header在该问题上似乎没有任何参数.

提前致谢.

linux assembly process elf virtual-memory

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

可以使用虚拟内存来支持 i386 中的数据断点功能吗?

我潜伏在我的操作系统教科书中,它提到可以在数据断点上实现虚拟地址转换(用于程序调试)。我只知道调试器使用 INT 3 来暂停正在调试控制和地址寄存器中以某种方式处理的程序、局部和全局变量。但是经过一番挖掘,我只找到了有关使用调试寄存器的线性地址的信息。根本没有关于虚拟地址相关数据断点背后机制的文章或讨论。那么这究竟是如何工作的呢?

debugging x86 assembly virtual-memory virtual-address-space

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

为什么 fork() 将两个进程中的每个页面都标记为只读?

我正在阅读一本教科书,其中讨论了如何fork()使用虚拟内存:

fork当前进程调用该函数时,内核会为新进程创建各种数据结构,并为其分配一个唯一的 PID。为了为新进程创建虚拟内存,它创建了当前进程的mm_struct、区域结构和页表的精确副本。它将两个进程中的每个页面标记为只读[强调添加],并将两个进程中的每个区域结构标记为私有写时复制。

来源:Computer Systems: A Programmer's Perspective,第 3 章,第 9.8.2 节 -fork重新审视的功能。

我不明白为什么它需要将两个进程中的每个页面都标记为只读。如果父进程中的每个页面都是只读的,那么父进程将永远无法修改一些未初始化的全局变量(.bss部分)。那么程序如何工作呢?

c process virtual-memory linux-kernel

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