千家信息网

Linux IO内存的访问是怎样的

发表于:2024-10-08 作者:千家信息网编辑
千家信息网最后更新 2024年10月08日,本篇内容主要讲解"Linux IO内存的访问是怎样的",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Linux IO内存的访问是怎样的"吧!IO内存访问流程
千家信息网最后更新 2024年10月08日Linux IO内存的访问是怎样的

本篇内容主要讲解"Linux IO内存的访问是怎样的",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Linux IO内存的访问是怎样的"吧!

IO内存访问流程

我们知道,为了管理最重要的系统资源并让物理地址对进程透明,Linux使用了内存映射机制,就是一个进程如果想访问一个物理内存地址(eg.SFR地址),那么首先就是将其映射成虚拟地址。

IO内存申请/归还

Linux提供一组函数用于申请和释放IO内存的范围,这两个API在访问IO内存的时候并不是必须的,但是建议使用,他们可以检查申请的资源是否可用,增加IO访问的安全性,如果可用则申请成功,并标志为已用,其他驱动想在这个进程归还资源前申请就会失败。

request_mem_region()宏函数向内存申请n个内存地址,这些地址从first开始,len长,name表示设备的名称,成功返回非NULL失败返回NULL。

/**  * request_mem_region - create a new busy resource region  * @start: resource start address  * @n: resource region size  * @name: reserving caller's ID string  */  struct resource * request_mem_region(resource_size_t start, resource_size_t n,const char *name)

release_mem_region()宏函数顾名思义就是将request_mem_region()申请的IO内存资源归还给内核以便其他进程也可以访问该IO内存。

/**  * release_mem_region - release a previously reserved resource region  * @start: resource start address  * @n: resource region size  */  void release_mem_region(resource_size_t start, resource_size_t n,const char *name)

IO内存映射/去映射

申请了IO资源,接下来就是进行物理地址到虚拟地址的映射。内核提供的API如下

static inline void __iomem *ioremap(unsigned long port, unsigned long size)
static inline void iounmap(volatile void __iomem *addr)

IO内存访问API

ARM的SFR是32bit的,我们在经过了ioremap之后其实就可以直接通过强制类型转换来读取获取的虚拟地址,但是这种方法不够安全,一不小心就会读错位,为此,内核同样提供的标准的API来读写IO内存,不但代码的安全性更高,可读性也得到了改善。

读IO

unsigned int ioread8(void *addr) unsigned int ioread16(void *addr) unsigned int ioread32(void *addr)

写IO

void iowrite8(u8 val,void *addr) void iowrite16(u8 val,void *addr) void iowrite32(u8 val,void *addr)

读一串IO内存

void ioread8_rep(void *addr,void *buf,unsigned long len) void ioread16_rep(void *addr,void *buf,unsigned long len) void ioread32_rep(void *addr,void *buf,unsigned long len)

写一串IO内存

void iowrite8_rep(void *addr,const void *buf,unsigned long len) void iowrite16_rep(void *addr,const void *buf,unsigned long len) void iowrite32_rep(void *addr,const void *buf,unsigned long len)

复制IO内存

void memcpy_fromio(void *dest,void *source,unsigned long len) void memcpy_toio(void *dest,void *source,unsigned long len)

设置IO内存

void memset_io(void *addr,u8 value,unsigned int len)

到此,相信大家对"Linux IO内存的访问是怎样的"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

内存 地址 资源 就是 进程 安全 内核 函数 物理 成功 内容 安全性 方法 学习 实用 更深 重要 顾名思义 为此 接下来 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 csgo给自己的服务器添加皮肤 宣传网络安全知识作文 数据库酒店管理er图 联合国贸易数据库的数据 php软件开发视频教程 软件开发师考试通过率 狠抓网络安全落实 数据库sql学的好吃力 涉密软件开发资质有哪些单位 安卓软件开发怎么将音乐 小学不沉迷网络安全教育视频 静电场复习软件开发 计算机网络技术拥塞怎么意思 武汉做税务软件开发的公司 升级数据库 解决连接问题 公共服务领域运用数字网络技术 语音同步翻译软件开发公司 历史计算机网络技术的特点 网络技术共享网站 主流软件开发工具吗 烟台计算机网络安全招聘 关于网络安全的对偶句 win7没有配置域名服务器 河北特殊软件开发市场报价 安徽天然气网络安全 计算机网络技术拥塞怎么意思 山东理工大网络安全专业 电脑连接数据库 错误 时间服务器构造 数据库导出表数据压力测试
0