进程如何访问不属于其虚拟地址空间的内存映射 IO 地址?
How can a process access memory mapped IO address not belonging to it's virtual address space?
我正在阅读操作系统理论,其中我发现一个进程具有虚拟地址空间(为了简单起见,松散地使用技术基础和限制寄存器)但它无法访问任何其他地址。但是在嵌入式系统中,我们可以使用放置 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
查看代码如何从虚拟地址映射到物理地址。
相关文章:
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 使用内存地址访问结构的属性值
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- 将布局映射到内存地址
- 为什么同一个变量的内存地址不同?
- 无法将内存地址转换为值
- 给定特定内存地址的数组的动态内存分配
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 获取 R 数据帧的内存地址
- c++ 编译器是否保护常量内存地址免受任何更改?
- 如何防止矢量的内存地址更改
- 任务管理器 - C/C++ 应用程序 - 分配的地址空间与已用内存
- 从某个特定但很大的虚拟地址空间(例如,20GB以上)分配内存
- 进程如何访问不属于其虚拟地址空间的内存映射 IO 地址?
- 在虚拟地址空间中使用内存映射文件
- c++类的内存布局是否会受到地址空间布局随机化的影响?
- 进程外内存堆围绕32位地址空间工作
- 虚拟内存地址空间不足(Borland C++Builder 6程序)