① 驱动程序控制设备,主要是通过访问设备内的寄存器来达到控制目的。因此我们讨论如何访问硬件,就成了如何访问这些寄存器。

② 在Linux系统中,无论是内核程序还是应用程序,都只能使用虚拟地址,而芯片手册中给出的硬件寄存器地址或者Ram地址则是物理地址,无法直接使用。因此,我们读写寄存器的第一步就是将它的物理地址映射为虚拟地址。

(1)动态映射:指在驱动程序中采用ioremap函数将物理地址映射为虚拟地址

  void* ioremap(physaddr, size);

  phyaddr: 待映射的物理地址

  size: 映射区域长度

  返回值:映射后的虚拟地址

(2)静态映射:指在Linux系统根据用户事先指定的映射关系,在内核启东时,自动地将物理地址映射为虚拟地址

  * 用户通过map_desc结构来指明物理地址与虚拟地址的映射关系

struct map_desc {
unsigned long virtual;  /* 映射后的虚拟地址 */
unsigned long pfn;    /* 物理地址所在的页帧号 */
unsigned long length;  /* 映射长度 */
unsigned int type;    /* 映射的设备类型 */
};

  * pfn: 利用宏__phys_to_pfn可以根据物理地址计算出物理地址所在的页帧号

③ Linux内核提供了一系列函数来读写寄存器(映射之后的虚拟地址)

(1)read

  unsigned ioread8(void* addr)

  unsigned ioread16(void* addr)

  unsigned ioread32(void* addr)

  unsigned readb(address)

  unsigned readw(address)

  unsigned readl(address)

(2)write

  unsigned iowrite8(u8 value, void* addr)

  unsigned iowrite16(u16 value, void* addr)

  unsigned iowrite32(u32 value, void* addr)

  unsigned writeb(address)

  unsigned writew(address)

  unsigned writel(address)

Linux内核硬件访问技术的更多相关文章

  1. Linux硬件访问技术

    在Linux系统中,无论是内核程序还是应用程序,都只能使用虚拟地址,而芯片手册中给出的硬件寄存器地址或者RAM地址则是物理地址,无法直接使用,因此,我们读写寄存器的第1步就是将将它的物理地址映射为虚拟 ...

  2. Linux 内核硬件抽象

    我们结束 PCI 的讨论, 通过快速看一下系统如何处理在市场上的多种 PCI 控制器. 这只 是一个信息性的小节, 打算来展示给好奇的读者, 内核的面向对象分布如何向下扩展到最 低层. 用来实现硬件抽 ...

  3. Linux的同步访问技术

    1.中断屏蔽: 单CPU范围内避免竞态的一种简单方法:在进入临界区之前屏蔽系统的中断.中断屏蔽将使得中断与进程之间的并发不再发生,而且Linux内核的进程调度等操作都依赖中断来实现,内核抢占式进程之间 ...

  4. 深入理解Linux内核-访问文件

    文件的访问模式:1.规范模式:2.同步模式:3.内存映射模式:4.直接I\O模式5.异步模式: 内存映射模式:1.共享型:在线性区页上的任何写操作都会修改磁盘上的文件:而且这种修改对映射了同一文件的所 ...

  5. linux内核动态调试技术

    动态调试功能就是你可以决定在程序运行过程中是否要 pr_debug(), dev_dbg(), print_hex_dump_debug(), print_hex_dump_bytes() 这些函数正 ...

  6. Linux 驱动分类 与访问技术

    驱动开发概述 1.驱动分类 1.1 常规分析法 1.1.1  字符设备  字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,  这样的驱动通常实现open, close, read和wri ...

  7. Linux内核转发技术

    前言 在linux内核中,通常集成了带有封包过滤和防火墙功能的内核模块, 不同内核版本的模块名称不同, 在2.4.x版本及其以后的内核中, 其名称为iptables, 已取代了早期的ipchains和 ...

  8. Linux内核版本 uname命令 GNU项目 Linux发行版

    1.内核版本由linux内核社区统一编码和发布,格式如下图: major.minor.patch-build.desc 主版本号.次版本号.对次版本号的修订次数-编译次数.当前版本的特殊信息 次版本号 ...

  9. Linux的桌面虚拟化技术KVM(一)——新建KVM虚拟机

    (1).虚拟化产品对比介绍 虚拟化技术有以下三种:仿真虚拟化,这是一种对系统硬件没有要求,但性能最低的虚拟化技术:半虚拟化,这是一种直接使用物理硬件,性能高,但需要修改内核的虚拟化技术:全虚拟化,这是 ...

随机推荐

  1. php中COM函数的使用

    php里的com类可以操作window系统上的东西 例如:可以在本地打开一个word文档,然后写入东西,只用于window系统 需要加载php_com_dotnet.dll模块   $word = n ...

  2. [poj2653]Pick-up sticks

    题目大意:给定一系列线段,以及放在平面上的顺序,给出没有被其他覆盖的线段. 解题关键:线段相交的判断. 满足两个条件即可:快速排斥实验.跨立实验. #include<cstdio> #in ...

  3. Ubuntu,kubuntu与xubuntu的差别 Ubuntu各版本主要差异

    Ubuntu各版本主要差异 Ubuntu官方考虑到使用者的不同需求,提供各种不同的发行版.虽然发布了几种版本的Ubuntu系统,但是它们的核心系统是一模一样的.可以这么说不同发行版的Ubuntu的区别 ...

  4. dpdk中uio技术

    总结一下dpdk的uio技术 一:什么是uio技术 UIO(Userspace I/O)是运行在用户空间的I/O技术,Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即可, ...

  5. c++ vitual继承

    为了解决多继承下的二义性而设计的vitrul继承 class Base { public: Base(void); ~Base(void); }; Base::Base(void) { printf( ...

  6. 无法认识patch请求

    Content-Type: application/vnd.api+jsonbase64:账号密码的设置总结:该及时消化的知识,就应该当时消化.不能拖.注意细节,一个小细节的疏忽,导致自己几乎一天的时 ...

  7. SDUT 3374 数据结构实验之查找二:平衡二叉树

    数据结构实验之查找二:平衡二叉树 Time Limit: 400MS Memory Limit: 65536KB Submit Statistic Problem Description 根据给定的输 ...

  8. spring第二篇

    上次写到spring是什么,说了很多的废话,那么从现在起 来看看spring如何使用  写几个例子 1 如何使用 spring 1.1导包 在导入四个包的基础上再导入日志包总共六个包 如下图 1.2 ...

  9. boost.asio系列(一)——deadline_timer

    一.构造函数 一个deadline_timer只维护一个超时时间,一个deadline_timer不同时维护多个定时器.在构造deadline_timer时指定时间: basic_deadline_t ...

  10. MVC要点

    1.绑定一个DropDownList @Html.DropDownListFor(m => m.MobileType, new List<SelectListItem>() { ne ...