ioremap

将一个IO地址空间映射到内核的虚拟地址空间上

物理地址
CPU地址总线传来的地址,由硬件电路控制其具体含义。物理地址中很大一部分是留给内存条中内存的,但也常被映射到其他存储器上(如显存、bios等)

总线地址
外设使用的是地址总线,cpu使用的是物理地址。物理地址和总线地址之间的关系有系统设计决定的。在X86平台上,物理地址就是总线地址,这是因为它们共享相同的地址空间

虚拟地址
程序访问存储器所使用的逻辑地址称为虚拟地址
CPU启动保护模式后,程序运行在虚拟地址空间中。CPU在启动的时候是运行在实模式的,Bootloader以及内核在初始化页表之前并不使用虚拟地址,而是直接使用物理地址的
需要MMU的支持,把虚拟地址转换成物理地址

ioremap

#include <io.h>
void * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags)
void *ioremap(unsigned long phys_addr, unsigned long size)

phys_addr:要映射的起始的IO地址
size:要映射的空间的大小
flags:要映射的IO空间的和权限有关的标志

I/O读写

//read
unsigned int ioread8(void*addr); 
unsigned int ioread16(void*addr);
unsigned int ioread32(void*addr); 
//write
void iowrite8(u8value,void*addr); 
void iowrite16(u16value,void*addr);
void iowrite32(u32value,void*addr); 
//读一系列值到给定的I/O内存地址
void ioread8_rep(void *addr, void *buf, unsigned long count); 
void ioread16_rep(void *addr, void *buf, unsigned long count);
void ioread32_rep(void *addr, void *buf, unsigned long count);
//写一系列值到给定的I/O内存地址
void iowrite8_rep(void *addr, const void *buf, unsigned long count); 
void iowrite16_rep(void *addr, const void *buf, unsigned long count); 
void iowrite32_rep(void *addr, const void *buf, unsigned long count); 
//操作一块I/O地址
void memset_io(void *addr, u8 value, unsigned int count); 
void memcpy_fromio(void *dest, void *source, unsigned int count); 
void memcpy_toio(void *dest, void *source, unsigned int count);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值