物理地址、虚拟地址的转换
1、在单片机和逻辑中,我们操作硬件是可以直接
比如:
unsigned int *p = 0x12345678;
*p = 0x87654321;
但是在Linux上不行,是不能对物理地址直接进行操作的。(因为使能了MMU)
可我们还是避免不了操作硬件。那么在Linux上如果想要操作硬件,需要先把物理地址
转换成虚拟地址。
2、使能了MMU以后有什么好处呢?
(1)让虚拟地址成了可能
(2)可以让系统更加安全,因为有了MMU,我们上层应用看到的内存都是虚拟内存,我们应用不能直接访问硬件,所以这样我们就保证了系统安全。
3、MMU非常复杂,那么我们如何完成物理地址到虚拟地址的转换
内核给我们提供了相关的函数
ioremap,iounmap
ioremap:把物理地址转换成虚拟地址,
iounmap:释放掉ioremap映射的地址。
定义:在#include的asm-generic里
static inline void _iomem *ioremap(phys_addr_t offse, size_t size)
参数:
phys_addr_t iffset: 映射物理地址的起始地址
size_t size : 要映射多大的内存空间。
返回值:
成功:返回虚拟地址的首地址
失败:返回NULL
注意:物理地址只能被映射一次!!!多次映射就会失败。
4、如何查看哪些物理地址被映射过了呢?
可以通过命令行来查看,连接开发板。
使用命令
cat /proc/iomem
来查看!