Articles of 虚拟地址空间

这两个函数有什么区别:`ioremap_uc()`和`set_memory_uc`?

当我想将内存区域标记为Write Combined(禁用可caching和使用BIU)或者通过设置PAT(页面属性表 – PIT中的7bit)不可caching时,那么我必须使用什么,以及这两个函数之间有什么区别? 驱动程序应该使用ioremap_[uc|wc]访问具有[uc | wc]访问types的PCI BAR: void __iomem * ioremap_wc(resource_size_t phys_addr,unsigned long size) 驱动程序应该使用set_memory_[uc|wc]设置RAM范围的访问types: int set_memory_uc(unsigned long addr,int numpages) 取自: http : //lwn.net/Articles/278994/ 为什么我不能使用PCI BAR和RAM范围的单一function? 说明: ioremap_uc()获取物理地址和返回虚拟地址设置不可caching,与set_memory_uc()获得虚拟地址,并设置这些页面的Uncacheable? 这些代码是否相同? void* virt_ptr = ioremap_uc(phys_ptr, size); 和 void* virt_ptr = ioremap(phys_ptr, size); const int page_size = 4096; set_memory_uc(virt_ptr, size/page_size);

是帧数=页数(Linux)?

我正在学习Linux设备驱动程序,发现页数等于帧数。 每个页面映射到每个frame.It说像每当程序需要内存将分配页面。 但在操作系统的书籍中,我发现像虚拟地址分成页面,这些页面被加载到框架中。那么页面的数量如何可以等于框架? 以上哪一项是正确的? 如何在页表中存储关于虚拟,页面,框架映射的信息? 我完全困惑。

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

我想在我的系统(Ubuntu GNU / Linux 2.6.32-41-server)上禁用地址空间布局随机化(ASLR),但是,如果我使用 sysctl -w kernel.randomize_va_space=0 我猜想,这个变化会影响系统中的所有用户。 (这是真的吗?)我怎样才能限制ASLR作为一个用户禁用自己的效果,或者仅限于我调用命令禁用的shell会话? 顺便说一句,我看到我的系统的当前(默认)设置是 sysctl -w kernel.randomize_va_space=0 为什么2而不是1或3? 我在哪里可以find有关/ proc / sys设置的数值,它们的范围和它们的含义的文档? 谢谢!

如何将虚拟内存地址转换为物理地址?

在我的C ++程序(在Windows上),我分配了一块内存,可以确保它在物理内存中保持locking(未打开和连续)(即使用VirtualAllocEx(),MapUserPhysicalPages()等)。 在我的过程中,我可以得到该块的虚拟内存地址, 但是我需要找出它的物理内存地址,以便将它传递给某个外部设备。 1.有什么办法可以在用户模式下将虚拟地址转换成我的程序中的物理地址? 2.如果没有,我只能在KERNEL模式下find这个虚拟到物理的映射。 我想这意味着我必须写一个驱动程序来做到这一点…? 你知道我可以使用的任何现成的驱动程序/ DLL / API,我的应用程序(程序)将与接口进行翻译吗? 3.如果我自己写驱动程序,我该怎么做这个翻译? 我使用哪些函数? 它是mmGetPhysicalAddress() ? 我如何使用它? 另外,如果我理解正确,mmGetPhysicalAddress()返callback用进程上下文中的虚拟基地址的物理地址。 但是,如果调用进程是驱动程序,并且正在使用我的应用程序调用该函数的驱动程序,那么我将更改上下文,并且我不再在应用程序的上下文中调用mmGetPhysicalAddress例程…如何翻译应用程序(用户模式)内存空间中的虚拟地址,而不是驱动程序? 任何答案,提示和代码摘录将非常感谢! 谢谢

在32位Windows可执行文件中使用/ LARGEADDRESSAWARE的缺点?

我们需要将其中一个可执行文件与这个标志链接起来,因为它使用了大量的内存。 但为什么给一个EXE文件的特殊处理。 为什么不标准化/ LARGEADDRESSAWARE? 所以问题是:使用/ LARGEADDRESSAWARE有什么问题,即使你不需要它。 为什么不把它用作所有EXE文件的标准?

为什么Windows为其系统地址空间预留1Gb(或2 Gb)?

众所周知,Windows应用程序通常在32位系统上拥有2Gb的专用地址空间。 这个空间可以通过/ 3Gb开关扩展到3Gb。 操作系统保留其余的4Gb。 我的问题是为什么? 以内核模式(即设备驱动程序代码)运行的代码有自己的地址空间。 为什么在独占的4Gb地址空间之上,操作系统仍然要保留2Gb的每个用户模式进程? 我认为原因是用户模式和内核模式调用之间的转换。 例如,对NtWriteFile的调用将需要一个内核调度例程的地址(因此为什么系统在每个应用程序中预留2Gb)。 但是,使用SYSENTER ,是不是足够的内核模式代码知道哪个函数/服务被调用的系统服务号? 如果您可以向我澄清,为什么操作系统在每个用户模式进程中占用2Gb(或1Gb)是如此重要。

x86 LargeAddressAware兼容性的unit testing

对于win32可执行文件(x86),我们可以设置LargeAddressAware标志,以便在x64 Windows上运行时可以访问4 GB(而不是2 GB)的虚拟地址空间。 这看起来非常有吸引力。 但是,有风险涉及。 例如,请参阅: 在32位Windows可执行文件中使用/ LARGEADDRESSAWARE的缺点? 因此,让我们继续并configuration正在执行一些unit testing的系统范围registry开关AllocationPreference设置为MEM_TOP_DOWN 。 应该这样做,不是吗? 它不! 问题是Visual Studio的x86“testing运行器”(执行引擎)本身不是LAA。 这个父进程只会看到“低”2 GB的VAS,我们的模块也会被testing。 来自VS2013.1的例子 mstest.exe产生QTAgent32.exe vstest.console.exe产生vstest.executionengine.x86.exe 他们都不是LAA启用! 那么使用启用LAA的x86testing运行器的推荐方法是什么? 这里有一个代码片段(VSunit testing,csharp)来检查LAA执行环境。 除非它成功了你的testing环境是不适合你有一套unit testing(也)覆盖与LAA的兼容性: using System; using System.Diagnostics; using System.Runtime.InteropServices; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace TestCheckEnv32LAA { [TestClass] public class CheckEnv32LAA { #region [Native DLL import] [Flags()] public enum AllocationType : uint { COMMIT […]

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

当Windows可以访问的总内存也被限制为4GB时,Windows如何为多个进程分配4GB的地址空间? 上述问题的解决scheme,我发现在Windows内存pipe理(作者:Pankaj Garg) 解: 要实现这个Windows使用称为分页的x86处理器(386及以上)的function。 分页允许软件使用与物理内存地址不同的内存地址(称为逻辑地址)。 处理器的分页单元将这个逻辑地址透明地转换成物理地址。 这使得系统中的每个进程都有自己的4GB逻辑地址空间。 任何人都可以帮助我以更简单的forms来理解它吗?

有没有什么API来确定Linux中的虚拟地址的物理地址?

在Linux操作系统中有没有用于从虚拟地址确定物理地址的API?