由于仅由内核使用,因此它们只能位于 PAGE_OFFSET 以上的地址中。但我正在阅读这一页,在其末尾(在 IRC 会议中)我读到了以下几行内容,这让我很困惑:
saxm> riel: so where do page tables reside? Surely not below PAGE_OFFSET? Somewhere above PAGE_OFFSET+896mb then?
riel> they could reside anywhere
saxm> anywhere from 0->4gb (on x86 with no pae)?
riel> saxm: yeah
Run Code Online (Sandbox Code Playgroud)
我的意思是,为什么它们会位于 PAGE_OFFSET 下面?如果是这种情况,用户空间进程是否无法访问它们?
我发现一个常量的文字get放在程序的数据段中(来自SO)并且是只读的,因此行"s [0] ='a'"会导致错误,这实际上发生在我取消注释该行并运行.但是,当我查看MS VS中的内存窗口时,变量全部放在内存中.我很好奇他们(编译器)如何强制执行对's'的只读访问?
#include <iostream>
int main(void)
{
char *s = "1023";
char s_arr[] = "4237";
char *d = "5067";
char s_arr_1[] = "9999";
char *e = "6789";
printf("%c\n", s[0]);
// s[0] = 'a'; This line would error out since s should point to data segment of the program
printf("%s\n", s);
system ("pause");
}
0x002E54F4 31 30 32 33 00 00 00 00 34 32 33 37 00 00 00 00 1023....4237....
0x002E5504 35 30 36 37 00 00 …Run Code Online (Sandbox Code Playgroud) 我正在敲打头来解决这个问题,甚至无法前进一步,问题是:
考虑以下C程序:
int X[N];
int i;
int step = M; // M is some predefined constant
for (i = 0; i < N; i += step) X[i] = X[i] + 1;
Run Code Online (Sandbox Code Playgroud)
如果此程序在具有4 KB页面大小和64项TLB的计算机上运行,那么M和N的哪些值将导致每次执行内循环时TLB未命中?
任何人都可以给我一些提示我该如何解决?
我有一台带有 2 个 CPU 和 64GB RAM、每个 CPU 32GB 的服务器。
我知道每个 CPU 都有自己的 RAM 部分,我们称它们为 RAM1 和 RAM2。我想让我的程序知道它在哪个 RAM(RAM1 或 RAM2)上分配数据。
我试图检查指针值:
// put the thread at i-th CPU, using pthread_setaffinity_np
TData *a = new TData[N];
...
cout << "CPU = " << i << " adress = " << a << endl;
Run Code Online (Sandbox Code Playgroud)
但输出看起来是随机的。我想那是因为地址是虚拟的。虚拟内存地址和部分内存有对应关系吗?
如何检查分配了我的数组“a”的哪个 RAM?
假设我们用C编写一个程序并打印程序中声明的一个变量的地址,那么在屏幕上打印的地址是虚拟地址还是变量的物理地址?如果它是虚拟地址,为什么它仍然具有与物理内存的位范围相同的范围?例如.对于32位机器,如果它返回0x833CA23E.
我们都知道,在从虚拟地址到物理地址的地址转换中,低位用作页偏移,因此不会被转换。相反,它们保持不变。这意味着虚拟内存中的页面大小与物理内存相同。
我们还知道,当使用取模方法将块从内存移动到缓存时,两侧块的大小是相同的。
我的问题是,这是否意味着虚拟内存中的页面大小应该与缓存中的块大小相同。
标题几乎概括了这一点。我有一个为 x86 平台编译的应用程序,它/largeaddressaware设置了标志。在 x64 系统上运行它,我可以“免费”获得扩展的 4GB 用户模式虚拟内存,而无需指定/3GB启动选项。在 x86 系统上,这意味着内核模式内存仅为 1GB,但由于 x64 系统可以寻址更多内存,内核模式是否会保留 2GB,甚至会增加到 3GB?
编辑:要明确的是,我想知道每个进程的限制。这个问题源于阅读这篇文章。
编辑2:这个问题不是重复的多少内存可以在64位操作系统上32位进程访问?因为该问题仅涉及应用程序可访问的内存,而不是系统可访问的内存。如果我误解了并且没有为每个进程的系统保留内存,如果有人可以将其写为答案,我将不胜感激。我确信我不是第一个对此感到困惑的人。
c# windows memory-management virtual-memory large-address-aware
在运行“free”命令时,我看到使用的内存为:
total:3854884
使用:3752304
free:102580
共享:352
缓冲区:9252
缓存:150908
-/+ 缓冲区/缓存:已用:3592144
空闲:262740
Swap: 0 0 0
但在运行时htop,我看到有许多进程在 VIRT 列(虚拟内存)下使用 4507M 的内存量。RES 列(进程正在使用的物理 RAM)显示 209M。SHR(共享内存)为5352M。
-Xmx进程配置为2048m。
如果交换空间为零,如何使用虚拟内存?
我们通常在操作系统中同时学习虚拟内存和分页,它们看起来是相互依赖的。但我想知道它们是否相互独立存在?