问题标签 [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.
c++ - 如何将虚拟内存地址转换为物理地址?
在我的 C++ 程序(在 Windows 上)中,我分配了一块内存,并且可以确保它在物理内存中保持锁定(未交换且连续)(即使用 VirtualAllocEx()、MapUserPhysicalPages() 等)。
在我的进程上下文中,我可以获得该块的虚拟内存地址, 但我需要找出它的物理内存地址才能将其传递给某个外部设备。
1.有什么方法可以在我的程序中以用户模式将虚拟地址转换为物理地址?
2.如果没有,我只能在 KERNEL 模式下找到这个虚拟到物理的映射。我想这意味着我必须编写一个驱动程序来做到这一点......?您是否知道我可以使用的任何现成的驱动程序/DLL/API,我的应用程序(程序)将与之交互以进行翻译?
3.如果我必须自己编写驱动程序,我该如何翻译?我使用哪些功能?是mmGetPhysicalAddress()吗?我该如何使用它?
4.另外,如果我理解正确, mmGetPhysicalAddress() 返回调用进程上下文中的虚拟基地址的物理地址。但是,如果调用进程是驱动程序,并且我正在使用我的应用程序来调用该功能的驱动程序,那么我正在更改上下文并且在调用 mmGetPhysicalAddress 例程时我不再处于应用程序的上下文中......所以如何转换应用程序(用户模式)内存空间中的虚拟地址,而不是驱动程序?
任何答案、提示和代码摘录将不胜感激!!
谢谢
64-bit - 以兼容模式运行的 64 位系统中的虚拟地址空间
我看到在 64 位 Windows 操作系统上,可用的用户虚拟地址空间是 8 terra 字节。但是,如果我们正在执行的程序在 32 位兼容模式下运行,那么还有这么多的用户空间可用吗?还是它的行为类似于普通的 32 位操作系统并且只提供 2GB 的用户地址空间?
windows - 如何以编程方式确定(Windows)操作系统的最大用户模式空间?
我正在编写一个诊断应用程序,它需要记录用户设置为他的用户模式空间,也就是用户模式虚拟地址空间,也就是 WinXP 中的 /3GB 开关或 Vista/Win7 上 bcdedit 中的 increaseuserva 开关。
C++ 或 C++/CLI 都可以。
有任何想法吗 ?
windows - 为什么 Windows 为其系统地址空间保留 1Gb(或 2 Gb)?
众所周知,Windows 应用程序在 32 位系统上通常具有 2Gb 的私有地址空间。这个空间可以通过 /3Gb 开关扩展到 3Gb。
操作系统自己保留剩余的 4Gb。
我的问题是为什么?
在内核模式下运行的代码(即设备驱动程序代码)有自己的地址空间。为什么在一个独占的 4Gb 地址空间之上,操作系统还想为每个用户模式进程保留 2Gb 的空间?
我认为原因是用户模式和内核模式调用之间的转换。例如,调用NtWriteFile
将需要内核调度例程的地址(因此系统在每个应用程序中保留 2Gb)。但是,使用SYSENTER
,系统服务编号是否足以让内核模式代码知道正在调用哪个函数/服务?
如果您能向我解释为什么操作系统占用每个用户模式进程的 2Gb(或 1Gb)如此重要。
point - 为什么ELF执行入口点虚拟地址的形式是0x80xxxxxx而不是零0x0?
执行时,程序将从虚拟地址 0x80482c0 开始运行。这个地址并不指向我们的main()
过程,而是指向一个_start
由链接器创建的过程。
到目前为止,我的谷歌研究只是让我做出了一些(模糊的)历史推测,比如:
民间传说 0x08048000 曾经是 STACK_TOP(即堆栈从 0x08048000 附近向下增长到 0)在 *NIX 到 i386 的端口上,这是由加利福尼亚州圣克鲁斯的一个团体颁布的。当时 128MB 的 RAM 很昂贵,而 4GB 的 RAM 是不可想象的。
任何人都可以确认/否认这一点吗?
windows - 对 32 位 Windows 可执行文件使用 /LARGEADDRESSAWARE 的缺点?
我们需要将我们的一个可执行文件与此标志链接,因为它使用大量内存。
但是为什么要给一个EXE文件特殊处理呢。为什么不标准化/LARGEADDRESSAWARE
?
所以问题是:/LARGEADDRESSAWARE
即使你不需要它,使用它有什么问题。为什么不将它用作所有 EXE 文件的标准?
function - 如何在汇编中找到函数虚拟调用地址?
我已经四处搜索,但我不确定我是否在问正确的问题,无论如何我都找不到太多,也许链接会有所帮助。
我制作了一个显示消息框的 c++ 程序,然后我用 Ollydbg 打开它并转到它调用 MessageBoxW 的部分。
每次我运行应用程序时,MessageBoxW 的调用地址都会更改,因为 Windows 正在更新我的 Imports 表以具有 MessageBoxW 的正确地址。所以我的问题是如何在导入表中找到 MessageBoxW 的虚拟地址,以及如何在 ollydbg 中使用它?
基本上我正在尝试在程序集中创建一个代码洞穴以再次调用 MessageBoxW。通过使用十六进制编辑器搜索可执行文件并找到调用的位置,我非常接近,我想我找到了虚拟地址。但是,当我在 olly 中调用该虚拟地址并将其保存到可执行文件中时,下次我打开它时,该调用被替换为一堆DB xyz
(看起来像虚拟地址,但为什么call
会被删除?
抱歉,如果我的术语不正确,因为我是新手,所以我不太确定该叫什么。
assembly - 汇编指令地址
为什么每次我反汇编同一个 .exe 文件时,相同的指令都在同一个地址?那是什么地址(RAM?HDD?虚拟?)?
ram - 纯分割
由于在我的脑海中一直存在虚拟内存的想法,我对纯分段有点困惑。
但据我了解,纯分段也是想象一个虚拟地址空间,分成全部加载到 RAM 中的段。
带分段的虚拟内存的区别在于,可能有一些段不在 RAM 中。
它是否正确?
我补充一个问题:分段结合分页和两级分页之间有实际区别吗?除了分段方法的“限制”保护之外,它是相同的。还是有别的区别?