单片机、裸机、linux操控硬件方法
在单片机和裸机中操作硬件是通过指针来对寄存器赋值来进行操控
但对于linux中不能这样,不能直接对物理地址直接修改,因为linux使能了mmu,所以不能直接菜操作物理地址
如果要操作硬件,需要先把物理地址转换成虚拟地址
使能mmu的好处
- 让虚拟地址成了可能
- 可以让系统更加安全,上层应用看到的都是虚拟内存,不能直接访问硬件
物理地址到虚拟地址映射函数
内核提供了几个函数,定义在源码根目录中的include/asm-generic/io.h
ioremap:物理地址转为虚拟地址
iounmap:把映射的地址释放掉
static inline void _iomem *ioremap(phys_addr_t offset,size_t size)
static inline void _iomem *ioremap(void _iomem *addr)
参数
- phys_addr_t offset:是映射物理地址的起始位置
- size_t size:要映射多大的内存空间
- void _iomem *addr:要取消映射的虚拟地址的首地址
返回值
- ioremap:成功返回虚拟地址的首地址,失败返回null
注意
- 物理地址只能被映射一次,多次映射会失败
查看被映射过的物理地址
输入命令:cat /proc/iomem
如果要取消某个映射就需要找到对应的驱动取消