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



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

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

谢谢

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

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

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

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

最新更新