Linux内核驱动–硬件访问I/O【转】

寄存器与内存

寄存器和内存之间有什么区别?

[En]

What is the difference between registers and memory?

寄存器和RAM的主要不同在于寄存器操作有副作用(side effect或边际效果):

读取地址可能会导致地址内容发生变化,例如,许多设备的中断状态寄存器在被读取后立即自动清除。

[En]

Reading an address may lead to changes in the contents of the address, for example, the interrupt status registers of many devices are cleared automatically as soon as they are read.

内存与IO

在X86处理器中存在IO空间的概念,IO空间是相对内存空间而言的,他们是彼此独立的地址空间,在32位的x86系统中,IO空间大小只有64K,内存却有4G

X86 支持内存空间、IO空间

ARM 只支持内存空间

MIPS 只支持内存空间

PowerPC 只支持内存空间

IO端口:

当一个寄存器或内存位于IO空间时,称其为IO端口。

IO内存:

当一个寄存器或内存位于内存空间时,称其为IO内存。

操作I/O端口

对I/O端口的操作需按如下步骤完成:

1、 申请

2、 访问

3、 释放

申请I/O端口

内核提供了一套函数来允许驱动申请他需要的I/O端口,其中核心的函数是:

struct resource request_region(unsigned long first, unsigned long n, const char name)

这个函数告诉内核,你要使用从first开始的n个端口,name参数是设备的名字。如果申请成功,返回非NULL,如果申请失败,返回NULL.

系统中端口的分配情况记录在/proc/ioports中. cat /proc/ioports,如果不能分配需要的端口,可以来这里看看谁在使用。

访问I/O端口

I/O端口可分为8位,16,32位端口,Linux内核头文件(体系依赖的头文件

unsigned inb(unsigned port) 读字节端口(8位宽)

void outb(unsigned char byte, unsigned port) 写字节端口(8位宽)

unsigned inw(unsigned port)

void outw(unsigned short word, unsigned port) 存取16位端口

unsigned inl(unsigned port)

void outl(unsigned long word, unsigned port) 存取32位端口

释放I/O端口

当用完一组I/O端口(通常在驱动卸载的时候),用如下函数把它们返还给系统:

void release_region(unsigned long start, unsigned long n)

操作I/O内存

步骤:

1、 申请

2、 映射

3、 访问

4、 释放

申请I/O内存

核心函数为:

Struct resource request_mem_region(unsigned long start, unsigned long len, char name)

这个函数申请一个从start开始, 长度为len 字节的内存区。如果成功,返回非NULL,

否则返回NULL, 所有已经在使用的I/O内存在 /proc/iomem中列出

映射I/O内存

在访问IO内存之前,必须进行物理地址到虚拟地址的映射,

void *ioremap(unsigned long phys_addr, unsigned long size)

访问IO内存

从IO内存读:

unsigned ioread8(void *addr)

unsigned ioread16(void *addr)

unsigned ioread32(void *addr)

写IO内存

void iowrite8(u8 value, void *addr)

void iowrite16(u16 value, void *addr)

void iowrite32(u32 value, void *addr)

老版本的I/O内存访问函数:

从I/O内存读,

unsigned readb(address)

unsigned readw(address)

unsigned readl(address)

写IO内存

unsigned writeb(unsigned value, address)

unsigned writew(unsigned value, address)

unsigned writel(unsigned value, address)

释放IO内存

IO内存不再需要使用时应当释放,步骤:

1、 void iounmap(void *addr)

2、 void release_mem_region(unsigned long start, unsigned long len)

欢迎交流

如有转载请注明出处

Original: https://www.cnblogs.com/yifeichongtian2021/p/15512918.html
Author: 壹飞冲天
Title: Linux内核驱动–硬件访问I/O【转】

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/524397/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • pyQt中的信号

    1. 说明 在调用 exec_()方法时,应用会进入主循环,而主循环会监听、处理事件 import sys from PyQt5.QtCore import Qt from PyQ…

    Linux 2023年6月7日
    085
  • 5.6 Linux Vim撤销和恢复撤销快捷键

    使用 Vim 编辑文件内容时,经常会有如下 2 种需求: 对文件内容做了修改之后,却发现整个修改过程是错误或者没有必要的,想将文件恢复到修改之前的样子。 将文件内容恢复之后,经过仔…

    Linux 2023年6月7日
    0106
  • XCTF pwn新手区解题记录

    一、前言 闲来无事,刷刷ctf题 二、题目: level0 1、下载好题目后,拖入到kali中去,用 file 和 checksec 查看一下,可以发现该程序是 64&#x…

    Linux 2023年6月8日
    0105
  • Java引用类型

    1 强引用 当我们使用new创建对象时,被创建的对象就是强引用。只要有强引用,GC 永远不会回收掉该对象。 Map map = new HashMap(); 2 软引用 如果一个对…

    Linux 2023年6月7日
    0102
  • Linux修改dns域名配置

    bash;gutter:true;</p> <h1>!/bin/bash</h1> <h1>1.定义DNS的文件</h1&gt…

    Linux 2023年6月13日
    0103
  • Question05-查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

    * SELECT a.SID, a.Sname, COUNT(b.CID) 选课总数, SUM(score) 总成绩 FROM Student a , SC b WHERE a.S…

    Linux 2023年6月7日
    0126
  • ACL和NAT

    NAT 概述: NAT(网络地址翻译)一个数据包目的ip或者源ip为私网地址, 运营商的设备 无法转发数据。 NAT工作机制: 一个数据包从企业内网去往公网时,路由器将数据包当 中…

    Linux 2023年6月6日
    094
  • Maven中POM文件总体配置说明

    POM文件总体配置说明 xxx xxx xxx xxx 4.0.0 xxx xxx jar 1.0-SNAPSHOT xxx-maven http://maven.apache.o…

    Linux 2023年6月6日
    085
  • linux 系统迁移到lvm分区

    对于普通分区磁盘空间不够,而采用lvm分区,原来系统进行迁移或者备份还原。 dd命令用于将整个硬盘进行备份,包括uuid,适用于对对整个物理盘的备份 tar 备份可以对整个系统进行…

    Linux 2023年6月14日
    084
  • 给你的计算机集群加一道安全屏障

    之前的LAXCUS集群操作系统系列文章介绍过,LAXCUS把集群分成内外两个网络环境。内网归管理员掌控,外网由用户操作,中间由网关连接,网关起着反向代理的作用,负责转发内外网络的通…

    Linux 2023年6月6日
    090
  • Django_渲染详解

    Django_render 模板语法 模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术。它实现了把前端代码和服务端代码分离的作用,让项目中的业务逻辑代码…

    Linux 2023年6月7日
    0120
  • 【Ubuntu】如何将Ubuntu软件源切换到国内源?

    为什么切换软件源? 当初次部署Ubuntu镜像时,会发现更新软件时速度非常慢,因为Ubuntu的软件都来自与国外,所下载或更新软件时的速度非常慢,此时就可以选择切换到国内的软件源来…

    Linux 2023年6月13日
    088
  • vue指令——day01

    v-cloak:能够解决插值表达式闪烁的问题 <p v-cloak>{{ msg }}</p> v-text:会覆盖元素中原本的内容,但是插值表达式 只会替…

    Linux 2023年6月7日
    0103
  • SQL87 最差是第几名(一)

    本题链接表结构如下所示。 +——-+——–+| grade | number |+——-+&#8…

    Linux 2023年6月13日
    081
  • Rook搭建Ceph

    Rook搭建Ceph 一、软件版本及先决条件 软件版本: 软件版本名称 软件版本号 Pacific 16.2.7 Rook V1.9 先决条件: K8s集群,1.16版本+ K8s…

    Linux 2023年6月13日
    079
  • .htaccess文件解析漏洞

    前言 htaccess文件(或者”分布式配置文件”),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的…

    Linux 2023年6月13日
    073
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球