标签: virtual-memory

Linux内核:进程页表驻留在哪里?

由于仅由内核使用,因此它们只能位于 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 下面?如果是这种情况,用户空间进程是否无法访问它们?

virtual-memory linux-kernel

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

Visual Studio 2010 - 数据段和堆栈内存相同

我发现一个常量的文字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++ virtual-memory memory-segmentation

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

虚拟内存系统,页表和TLB

我正在敲打头来解决这个问题,甚至无法前进一步,问题是:

考虑以下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未命中?

任何人都可以给我一些提示我该如何解决?

c caching memory-management virtual-memory tlb

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

NUMA:如何检查分配了 C++ 数组的 RAM 部分?

我有一台带有 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++ multithreading virtual-memory numa

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

虚拟内存或物理内存

假设我们用C编写一个程序并打印程序中声明的一个变量的地址,那么在屏幕上打印的地址是虚拟地址还是变量的物理地址?如果它是虚拟地址,为什么它仍然具有与物理内存的位范围相同的范围?例如.对于32位机器,如果它返回0x833CA23E.

c c++ memory virtual-memory

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

页大小和块大小

我们都知道,在从虚拟地址到物理地址的地址转换中,低位用作页偏移,因此不会被转换。相反,它们保持不变。这意味着虚拟内存中的页面大小与物理内存相同。

我们还知道,当使用取模方法将块从内存移动到缓存时,两侧块的大小是相同的。

我的问题是,这是否意味着虚拟内存中的页面大小应该与缓存中的块大小相同。

caching virtual-memory

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

x64 计算机上 x86 LARGEADDRESSAWARE 程序的内核模式内存大小?

标题几乎概括了这一点。我有一个为 x86 平台编译的应用程序,它/largeaddressaware设置了标志。在 x64 系统上运行它,我可以“免费”获得扩展的 4GB 用户模式虚拟内存,而无需指定/3GB启动选项。在 x86 系统上,这意味着内核模式内存仅为 1GB,但由于 x64 系统可以寻址更多内存,内核模式是否会保留 2GB,甚至会增加到 3GB?

编辑:要明确的是,我想知道每个进程的限制。这个问题源于阅读这篇文章

编辑2:这个问题不是重复的多少内存可以在64位操作系统上32位进程访问?因为该问题仅涉及应用程序可访问的内存,而不是系统可访问的内存。如果我误解了并且没有为每个进程的系统保留内存,如果有人可以将其写为答案,我将不胜感激。我确信我不是第一个对此感到困惑的人。

c# windows memory-management virtual-memory large-address-aware

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

如果没有交换空间,虚拟内存怎么存在呢?

在运行“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

如果交换空间为零,如何使用虚拟内存?

ubuntu ram virtual-memory amazon-web-services

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

如果没有分页概念,虚拟内存还能存在吗?

我们通常在操作系统中同时学习虚拟内存和分页,它们看起来是相互依赖的。但我想知道它们是否相互独立存在?

paging operating-system virtual-memory

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

什么是指针稳定性?

链接中关于 Abseil 容器的第二段说:

例如,Abseil 容器通常不保证插入或删除后的指针稳定性。

在这种情况下,指针稳定性是什么意思?

c++ operating-system pointers virtual-memory abseil

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