问题标签 [virtual-address-space]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
20499 浏览

linux - 仅为我自己禁用和重新启用地址空间布局随机化

我想在我的系统(Ubuntu Gnu/Linux 2.6.32-41-server)上禁用地址空间布局随机化(ASLR),但是,如果我使用

我想这个改变会影响系统上的所有用户。(这是真的吗?)我怎样才能将禁用 ASLR 的影响限制为仅对我自己作为用户,或者仅对我调用命令禁用的 shell 会话?

顺便说一句,我看到我系统的当前(默认)设置是

为什么是 2 而不是 1 或 3?在哪里可以找到有关 /proc/sys 设置的数值、范围和含义的文档?谢谢!

0 投票
0 回答
372 浏览

virtual-memory - 虚拟内存大小和分配

在 32 位 x86 系统上,总虚拟地址空间的理论最大值为 4 GB。默认情况下,Windows 将此地址空间的一半(4 GB 虚拟地址空间的下半部分,从 x00000000 到 x7FFFFFFF)分配给进程作为它们唯一的私有存储,并将另一半(上半部分,地址 x80000000 到 xFFFFFFFF)用于它自己受保护的操作系统内存利用率。

64 位 Windows 为进程提供了更大的地址空间:IA-64 系统上为 7152 GB,x64 系统上为 8192 GB。

我对上述报价有几个问题:

  1. 为什么为进程分配低地址空间?
  2. “...使用另一半(上半部分,地址 x80000000 到 xFFFFFFFF)用于其自身受保护的操作系统内存利用率。” - 为什么操作系统不使用物理地址作为系统地址空间,而是使用虚拟地址?
  3. 为什么在 x64 系统上 8192GB 用于进程和系统?与 32 位操作系统相反,不是所有的地址空间都被使用?

谢谢

0 投票
0 回答
141 浏览

memory-management - 映射具有特定地址的页面

我正在尝试使用 VirtualAlloc 映射虚拟内存页面,但它是 8TB Windows 7 64 位允许范围之外的特定地址,我在 Windows Internals 中读过这个地址范围用于“页表自映射结构”,无论如何,有什么办法可以用 0x7ffffffff000 地址映射内存页吗?

0 投票
1 回答
301 浏览

linux - linux内核函数_copy_to_user,想清楚了解

我正在使用此函数将一些结构复制到内核。但是,问题是我必须复制三个数据结构,它们是更大数据结构的一部分。注意:这 3 个数据结构在更大的数据结构中是连续的。

所以,在我的复制用户函数中,我传递第一个数据结构的指针并给出所有 3 个数据结构的长度。但是,当我进入用户空间并打印第二个数据结构的第一个元素时,它会给出一些其他值。

所以,我做错了什么。作为一个解决方案,我进行了 3 次 copt_to_user 调用,令我惊讶的是它运行良好。这是我进行一次 copy_to_user 调用时的问题。

请让我知道可能是什么原因。

嘿,谢谢大家的回答,这是一个对齐问题,但是,更进一步,如果我想填充内部结构,我该怎么做..?例子-

结构化的{

结构 b;

结构 c; //我想把这个结构做成一个填充的,怎么做?

结构d;

}

0 投票
1 回答
7857 浏览

linux - 是帧数=页数(linux)?

我正在研究linux设备驱动程序,发现页数等于帧数。每个页面映射到每个帧。它说就像每当程序需要内存时它都会分配页面。

但是在操作系统书籍中,我发现虚拟地址分为页面,这些页面被加载到框架中。那么页面数如何等于框架?

以上哪个是正确的?linux如何在页表中存储有关虚拟、页面、框架映射的信息?

我完全糊涂了。

0 投票
6 回答
1879 浏览

windows - 当 Windows 可以访问的总内存也限制为 4GB 时,Windows 如何将 4GB 地址空间分配给多个进程

当 Windows 可以访问的总内存也限制为 4GB 时,Windows 如何将 4GB 地址空间分配给多个进程。

我在 Windows 内存管理中找到的上述问题的解决方案(作者:Pankaj Garg)

解决方案:

为了实现这一点,Windows 使用 x86 处理器(386 及更高版本)称为分页的功能。分页允许软件使用与物理内存地址不同的内存地址(称为逻辑地址)。处理器的分页单元透明地将这个逻辑地址转换为物理地址。这允许系统中的每个进程都有自己的 4GB 逻辑地址空间。

谁能帮助我以更简单的形式理解它?

0 投票
1 回答
1388 浏览

process - 虚拟内存概念

我对有关虚拟内存的一些主题感到困惑。所以,我将逐点列出它们并提出问题。在回答时,如果您还列出一些我可以消除疑问的来源,我会更喜欢。我将参考 linux elf 可执行文件进行讨论。

  1. 我听说在 32 位系统中每个进程都有 4gb 的地址空间。当我检查我的一个可执行可重定位文件的 objdump 时,我看到它的限制从 00000000 到 ffffffff。它还包含内核空间。这是文件的地址空间。这就是我们说的虚拟内存吗?如果是,那么我已经读过虚拟内存机制允许运行非常大的进程,并且进程大小不受主内存大小的限制(我们可以在按需分页时将所需的页面带到主内存)。那么如果虚拟内存只有4gb,是不是限制程序的最大大小为4gb呢?此外,我检查了另一个文件的 objdump,它具有相同的地址(即 00000000 到 ffffffff)。那么这是什么意思?这是否意味着我们的文件是某种可重定位文件,将再次添加起始地址(尽管这看起来很荒谬,因为它已经是一个可执行的可重定位目标文件)。

  2. 我读过在已实现分段的内存中,cpu 产生虚拟(逻辑)地址。这个地址包含三个部分——段,段内的偏移量。此外,这里讨论的部分是代码、数据、堆栈等。

    在进程地址空间中,这些段从特定位置开始定位。那么,cpu的虚拟地址的内容是什么?生成的虚拟地址范围是否从 00000000 到 ffffffff?如果是,那么是在虚拟地址访问内容的过程,如下:-

    这再次出现了这样一个事实,即任何时候都没有进程可以完全位于主内存中,因为这样整个内存将只被一个进程占用(因为进程的地址空间本身就是 4gb)。

    此外,如果所有进程的地址空间从 00000000 到 ffffffff,并且主内存中一次可以存在多个进程,那么所有进程都应该有自己的段描述符表,该表返回线性地址空间中的段地址

  3. 我读到操作系统在启动时被加载到主内存中。那么该操作系统与特定进程的内核空间中的内核代码有什么区别?此外,是否所有进程在其内核空间中都有自己的内核代码副本?
0 投票
2 回答
1772 浏览

linux - 手动虚拟地址转换

我已经看过一些与此相关的不同文章,但没有一篇以我可以理解和复制的方式解释解决方案。我需要知道如何根据以下内容将物理地址转换为内存中的虚拟地址:

一个简单的虚拟内存系统有 32KB 物理内存,16 位虚拟地址,其中 12 位用作偏移量。以下是其中一个进程的页表的当前内容:

在此处输入图像描述

所以基本上我认为这个虚拟内存系统的页面大小是1024KB。我需要一个过程来找到VA B2A0的对应PA。如果你能给我我可以从那里开始的过程,你不必给我最终的解决方案:)

提前谢谢各位。此外,如果您知道一篇已经这样做的文章,而我只是错过了它,请随时将我链接到该文章。

干杯。

0 投票
1 回答
661 浏览

python - 获取指向我在长类型值中具有虚拟地址的内存的指针

我使用函数调用分配了一个内存,它返回了 64 位物理地址。我已经使用函数调用映射了该地址,该函数调用返回了 64 位虚拟地址。

现在,我需要一个指针来访问这个内存,我在 Python 中有一个长类型值的虚拟地址,我尝试使用 ctypes 模块指针()强制转换,但最终访问了一些令人难以置信的内存

我是这样访问的:

0 投票
1 回答
422 浏览

c++ - 是否可以安全地假设 64 位指针中的 16 个高位(2 个对我来说就足够了)未设置?

我正在构建一个数据结构,它将每 2 位或 3 位设置为 64 位整数。

如果我可以交替地在这个结构中存储一个指针(当它们是树中的终端节点时,但这不相关),那对我来说会很方便。

出于我的表示的目的(保证设置最高或第二高位),如果可以假设指针永远不会设置其最高两位,即这个断言成立:

那么我可以做到这一点!