问题标签 [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 回答
94 浏览

c - 为什么未释放的内存会导致泄漏?和其他一些问题

据我所知,所有进程都在自己的虚拟地址空间内运行。如果一个进程调用malloc,操作系统会从程序拥有的堆中分配一些区域,并返回一个虚拟地址而不是真正的物理地址。由于堆是程序所有的,为什么操作系统不能回收程序员没有释放的内存?

虚拟地址空间是针对每个程序的,所以程序没有办法破坏其他程序所拥有的数据。我对吗?

如果一个程序访问其他程序拥有的随机地址,就会发生段错误。但是为什么程序访问之前自己释放的地址没有报错呢?

0 投票
2 回答
162 浏览

c - 便携式可执行文件中虚拟地址的计算

我试图了解 PE 文件中寻址的基础知识,并且我制作了一个简单的应用程序,其中包含几个调用malloc静态链接到 msvcr110 库的函数。所以我把我生成的可执行文件在 ida pro 中打开,找到了malloc没有导入的函数的偏移量,添加了基地址并尝试像这样调用它:

然后我在 IDA pro 中检查了重新构建的程序,以确保 malloc 偏移量保持不变并且它仍然是0x0048AD60. 所以问题是 offset+hCurrentModule 给了我不正确的地址,并且在我调用这个地址后崩溃。例如,我的结果hMallocAddr是,0x0186AD60但在反汇编窗口中的 MSVC 调试会话中,malloc 地址位于0x0146AD60. 这里有什么问题?

0 投票
0 回答
29 浏览

arrays - 如何验证从另一个程序访问了全局数组的哪个索引?

正在运行的程序已全局初始化大型数组。我想验证同时在同一台机器上运行的另一个程序正在访问该大数组的哪个索引。

我看到了如何在给定进程 proc_id 的物理内存中获取一组页面,还看到了如何直接访问系统的物理内存。但是如何验证当前正在访问哪个块。

如何访问另一个进程的全局数据段访问模式是个问题。如果有人可以将我引导到任何代码示例或任何具有此功能的 api,那将会很有帮助。

0 投票
3 回答
7072 浏览

assembly - x86-64 规范地址?

在阅读英特尔手册时,我遇到了以下问题:

在支持 Intel 64 架构的处理器上,IA32_SYSENTER_ESP字段和IA32_SYSENTER_EIP字段必须各自包含一个规范地址。

什么是“规范地址”?

0 投票
1 回答
3478 浏览

windows - LoadLibrary() 失败并出现错误 8 (ERROR_NOT_ENOUGH_MEMORY)

稍后编辑:经过更多调查,Windows 更新和 OpenGL DLL 是红鲱鱼。这些症状的原因是LoadLibrary()呼叫失败GetLastError() == ERROR_NOT_ENOUGH_MEMORY。请参阅我的答案以了解如何解决此类问题。以下是历史兴趣的原始问题。/编辑

我用 Python/wxPython for Windows 编写的带有 C++ 后端的地图查看器突然停止工作,没有任何代码更改甚至重新编译。相同的可执行文件已经工作了数周(相同的 Python,相同的 DLL,...)。

现在,在向 Windows 查询要与 OpenGL 一起使用的像素格式(带有 ChoosePixelFormat())时,我得到一个 MessageBox 说:

执行以下代码片段时显示错误消息:

它实际上是一个显示消息框的 ATI GL 驱动程序 DLL。调用堆栈的相关部分是这样的:

两周前我进行了一次Windows 更新,并注意到一些小故障(例如,在调整窗口大小时),但我的程序仍然可以正常工作。刚才我重新启动了,Windows 又安装了 1 个更新,我再也无法通过 ChoosePixelFormat()了。但是,最后安装的更新是 KB2998527,俄罗斯时区更新?!

我已经检查过的事情:

  • 重新编译不会使它工作。
  • 在没有其他程序运行的情况下重新启动和运行不起作用。
  • 我的程序的内存消耗只有 67 MB,我没有内存不足。
  • 大量可用磁盘空间(~50 GB)。
  • HDC m_hdc是从显示面板获得的,HWND似乎是有效的。
  • Changing my linker commandline doesn't work.

Should I update my graphics drivers or roll back the updates? Any other ideas?

System data dump: Windows 7 Ultimate SP1 x64, 4GB RAM; HP EliteBook 8470p; Python 3.3, wxPython 3.0.1.dev76673 msw (phoenix); access to C++ data structures via SIP 4.15.4; C++ code compiled with Visual Studio 2010 Express, Debug build with /MDd.

0 投票
4 回答
207 浏览

c - PAE系统上C中的指针大小是多少?

我通常知道在 32 位机器中,常规 C 程序中使用的指针大小是 32 位的。在带有 PAE 的 x86 系统中呢?

0 投票
1 回答
320 浏览

c++ - 从加载的 DLL 函数中获取文件偏移量

我想问一下,如何在 DLL 中找到特定(导出的)函数。例如,我想在 Kernel32 中找到 ReadProcessMemory。我不想依赖 Import 表,我想根据我使用自定义函数获得的地址来定位不同的 API。

我试图对 VA、RVA 和文件偏移量进行小型研究,但没有成功。这是我尝试过的一个示例,但它不起作用(在所有情况下都返回 0)

你能帮我如何完成这个简单的任务吗?

谢谢你。

Ps:我不坚持上面的功能,如果您能指出问题所在,或者提供更好的来源,那就太棒了。

0 投票
2 回答
3222 浏览

c - 执行子进程时,操作系统将 argv 和 argc 存储在哪里?

我很难理解操作系统如何将数据从父进程的地址空间传递到子进程的地址空间。也就是说,在 C 程序中,argc 和 argv 在传递给 main 时存储在哪里?

我了解 argv 本质上是一个双指针。我不明白的是操作系统在将这些值加载到内核后对它们做了什么。在为子进程创建地址空间后,它是否会将这些值推送到新空间的堆栈中?我们显然不想传递指向另一个地址空间的指针。

作为记录,我正在使用 MIPS32 架构。

0 投票
1 回答
464 浏览

operating-system - 虚拟地址到物理地址

我正在为我的操作系统类编写地址转换器。我知道我正在正确读取虚拟地址,并且我得到的页码是正确的(我访问了正确的数据)但是当我试图弄清楚物理地址是什么时,我得到了错误的物理地址。

眼镜:

  • 页表中有 2^8 个条目
  • 页面大小 = 2^8 字节
  • 帧大小 = 2^8 字节
  • 256帧
  • 物理内存 = 65,536 字节(256 帧 × 256 字节帧大小)

这是一个正确的输出:

虚拟地址:12107 物理地址:2635 值:-46

这就是我得到的:

虚拟地址:12107 物理地址:12107 值:-46

据我了解,物理地址等于(pageNumber * pageSize + pageOffset)我读过的所有内容都这么说。

当我从 12107 得到页码时,我得到 47(最左边 8 位)当我从 12107 得到偏移量时,我得到 75(最右边 8 位)(47 * 256 + 75)得到 12107。

要获得正确的输出(物理地址),页码需要为 10 (10 * 256 + 75) 才能获得正确的输出 2635。

我已经把我的书倒过来了,过去几天一直在试图找出我到底哪里出错了,但我似乎无法弄清楚。

0 投票
0 回答
575 浏览

x86 - ARM 与 x86 IO 映射

在此处输入图像描述

我正在查看 Raspberry Pi 数据表。在 BCM ARM PERIPHERALS 页面上,显示从物理地址到 ARM 虚拟地址的映射的图表,映射是恒定的。

即:ARM 物理地址 0x20000000(IO 基地址)映射到常量 ARM 虚拟地址 F2000000。

此转换已由板平台文件中的 IO_MEM(IO_ADDRESS) 等 MACROS 完成。所以我们只需要传递正确的地址。

x86 中是否有任何常量映射?

对于 PCI,不可能因为每次启动时地址都会改变。我对此是否正确?