2

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

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

谢谢

4

3 回答 3

4

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

于 2012-06-19T07:18:23.130 回答
0

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

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

于 2012-06-19T07:18:06.780 回答
0

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

于 2012-06-19T07:22:28.890 回答