【问题标题】:How can a process access memory mapped IO address not belonging to it's virtual address space?进程如何访问不属于其虚拟地址空间的内存映射 IO 地址?
【发布时间】:2012-06-21 04:46:38
【问题描述】:

我正在阅读操作系统理论,其中我发现一个进程具有它的虚拟地址空间(为了简单起见,松散地使用技术库和限制寄存器)但它不能访问任何其他地址。但是在嵌入式系统中,我们可以使用placement new 或reinterpret_cast (C++) 来访问内存映射的IO 地址,但是如果我们不能访问除了进程的虚拟地址空间之外的任何其他地址,这怎么可能呢?

class ControlReg { 
public:
bool ready() const { return readyBit; }
private:
volatile unsigned readyBit :1;
};

ControlReg *pcr = reinterpret_cast<ControlReg*>(0xFFFF0000); // address 0xFFFF0000 is still virtual or absolute physical mapped address?

是否有一些指令可以让进程访问任何地址? .我想我很困惑,有人可以帮我看清楚吗?

谢谢

【问题讨论】:

    标签: c++ memory memory-management operating-system


    【解决方案1】:

    从您的进程中看到的所有地址都是虚拟地址,至少从高级语言的角度来看是这样。如果您运行的是 linux,您可以cat /proc/{pid}/maps 查看您的代码如何从虚拟地址映射到物理地址。

    【讨论】:

      【解决方案2】:

      这纯粹是操作系统问题,适用于所有语言(包括 汇编程序)。现代通用操作系统映射用户的内存 进程,并且不允许在映射内存之外进行访问;用户 进程无法正常访问内存映射 IO,甚至无法访问内存使用的内存 操作系统。但是这个映射是由系统完成的:系统可能有 允许绕过它的特殊要求;内核级代码肯定 可以绕过去;和许多嵌入式系统,尤其是较小的系统, 根本没有内存映射。

      【讨论】:

        【解决方案3】:

        为了在真正的虚拟内存系统中工作,设备必须映射到进程的虚拟地址空间。例如,在类 Unix 操作系统中,这可以通过对设备文件的 mmap() 调用来完成。这将使设备驱动程序有机会创建将虚拟地址与相应物理地址相关联的页表条目。

        (不过,我在这里推测;我没有这种嵌入式开发的经验。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-03
          • 1970-01-01
          • 2011-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-18
          • 1970-01-01
          相关资源
          最近更新 更多