在32位系统上应用(理论上)有多少内存?不同的操作系统?2或1 Gb?
谢谢!
我必须处理通常不适合主内存的大量数据.我访问这些数据的方式具有很高的局部性,因此在内存中缓存部分内容看起来是个不错的选择.将malloc()作为一个庞大的数组是否可行,并让操作系统找出要分页的位和要保留的位数?
在一个内存饥渴的应用程序我正在开发我面临OutOfMemoryExceptions.我希望虚拟内存永远不会有这种异常.为什么如果需要更多RAM而不是可用操作系统不使用HD作为RAM?
我正在开发一个处理不同变量和函数地址的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
从书中读到,当一个进程启动时,它的私有进程地址空间被创建
假设它是从 0x0 到 0xMAX
空间的一部分是堆,我们写了一个 for 循环来继续 malloc(1k 日期),直到它返回 false。它分配了 3GB 的日期。
那么问题来了,如果一开始就分配了0x0到0xMAX,那说明0x0到0xMAX从一开始就大于3GB(因为有栈,控制...)?
如果一个进程一开始可以占用3GB以上,那一定是我理解错了。
谁能解释这个 0x0 - 0xMAX 是如何存储在乞讨中的?
假设我不确定如何检查我正在运行的操作系统.
所以我想确定使用下面的代码:
#include <limits.h>
...
size_t os_size = sizeof(void*) * CHAR_BIT;
Run Code Online (Sandbox Code Playgroud)
我可以100%依赖它,还是有任何需要注意的警告?
例如:
我是否有可能安装32位操作系统的编译器并在64位操作系统上正常工作?
谢谢
与保留和提交虚拟存储器至过程实验,我分配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) 所以可执行文件包含不同的部分和标题.
在ELF Header我们可以看到一些关于它们的元数据,如不同标题的大小,起点等.
可执行文件的不同部分是否一次性加载到内存中?
如果是,如何/何时定义以及我们可以在哪里看到有关该信息的信息,因为ELF Header在该问题上似乎没有任何参数.
提前致谢.
我潜伏在我的操作系统教科书中,它提到可以在数据断点上实现虚拟地址转换(用于程序调试)。我只知道调试器使用 INT 3 来暂停正在调试控制和地址寄存器中以某种方式处理的程序、局部和全局变量。但是经过一番挖掘,我只找到了有关使用调试寄存器的线性地址的信息。根本没有关于虚拟地址相关数据断点背后机制的文章或讨论。那么这究竟是如何工作的呢?
我正在阅读一本教科书,其中讨论了如何fork()使用虚拟内存:
当
fork当前进程调用该函数时,内核会为新进程创建各种数据结构,并为其分配一个唯一的 PID。为了为新进程创建虚拟内存,它创建了当前进程的mm_struct、区域结构和页表的精确副本。它将两个进程中的每个页面标记为只读[强调添加],并将两个进程中的每个区域结构标记为私有写时复制。
来源:Computer Systems: A Programmer's Perspective,第 3 章,第 9.8.2 节 -fork重新审视的功能。
我不明白为什么它需要将两个进程中的每个页面都标记为只读。如果父进程中的每个页面都是只读的,那么父进程将永远无法修改一些未初始化的全局变量(.bss部分)。那么程序如何工作呢?