进程如何访问内存映射的IO地址不属于它的虚拟地址空间?

时间:2012-06-19 07:08:15

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

我正在阅读操作系统理论,其中我发现一个进程拥有它的虚拟地址空间(为了简单起见,松散地使用技术基础和限制寄存器)但它无法访问任何其他地址。但是在嵌入式系统中,我们可以使用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?

是否有一些指令可以让进程访问任何地址? 。我很困惑,我想,有谁能帮我清楚地看清楚事情?

由于

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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