Memory 我可以使用物理寻址的内存指针从RAM加载数据吗?

Memory 我可以使用物理寻址的内存指针从RAM加载数据吗?,memory,linux-kernel,kernel,linux-device-driver,virtual-address-space,Memory,Linux Kernel,Kernel,Linux Device Driver,Virtual Address Space,我可以使用指向内存的指针从我的驱动程序(Linux内核)加载数据,而不在虚拟寻址中分配页面(PDE/PTE)吗?是!“/dev/mem”是物理内存的映像,您甚至可以从用户空间访问它 例如,要访问物理地址0x7000000,下面的代码总结了以下步骤: fd = open("/dev/mem", O_RDWR); map = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x7000000); 什么是“CPU-RAM”?有一个CP

我可以使用指向内存的指针从我的驱动程序(Linux内核)加载数据,而不在虚拟寻址中分配页面(PDE/PTE)吗?

是!“/dev/mem”是物理内存的映像,您甚至可以从用户空间访问它

例如,要访问物理地址
0x7000000
,下面的代码总结了以下步骤:

fd = open("/dev/mem", O_RDWR);
map = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x7000000);

什么是“CPU-RAM”?有一个CPU和一个RAM。你是说处理器缓存吗?@sawdust不,我是说RAM:)我不完全确定这是否与你的问题完全相关。。如果可以的话,请快速阅读@user1761555我必须使用“ioremap()”来获取内核空间中的虚拟地址(分配PDE/PTE)并通过虚拟地址访问该内存,还是可以直接读取物理地址?如何通过物理地址直接读取内存?谢谢!如果我有8GB的RAM,我会按照你写的那样做,然后会在页面表中为8GB的RAM创建PDE/PTE,即200万个PTE,不是吗?虽然理论上可能,但我认为你只想映射一个物理内存区域,而该区域的大小是“有限的”。但在你的示例中,我们没有指定该区域的大小,但仅指定区域的起始地址-这是否意味着我们正在映射所有物理内存(8GB)?当您使用
读取
/
写入
访问虚拟页时,
/dev/mem
实现将临时分配虚拟页。使用
mmap
,将分配所有页面。不,它并不总是映射所有内存。在本例中,映射的大小在变量size中指定。代码中没有明确说明。您可以在mmap的手册页中查看详细信息。