VFS

https://www.linuxprobe.com/linux-vfs.html

三种设备类型

字符设备:字符设备是能够以字节流形式被访问的设备,字符设备驱动程序通常至少实现open,close,read和write系统调用,参数和返回值都是字符或字节流。例如:串口、鼠标、键盘、摄像头等。
块设备:块设备是存储以“块”为单位存储数据的设备,例如:磁盘设备、光盘或者U盘。

驱动设备加载与卸载

insmod或modprobe命令可以加载内核模块,模块的加载函数会执行,完成本模块的相关初始化工作。
rmmod命令可以卸载某模块,模块的卸载函数会执行,完成与模块加载函数相反的功能。
另外depmod(depend module)可检测模块的相依性,供modprobe在安装模块时使用。初次加载需要。

外设地址

外设的控制都是通过读写设备上的寄存器来进行的,外设的寄存器通常被连续编址,并且根据CPU的体系架构不同CPU对IO端口的编址方式有两种。IO映射方式(IO-mapped):比较典型的有X86处理器为外设专门实现了一个单独的地址空间,称为“IO端口空间”或者“IO地址空间”,此时CPU可以通过专门的指令(比如X86的IN和OUT)来访问这个“IO端口空间”。内存映射方式(memory-mapped):RISC指令系统的CPU一般只实现一个物理地址空间,外设IO端口成为内存的一部分。此时CPU可以访问外设的IO端口,就像访问自己的内存一样方便,不必再设置专门的指令来访问。在驱动开发过程中一般使用内存映射方式。
外设寄存器的物理地址是已知的,但不能直接访问,必须将其映射到内存空间,在Linux内核的io.h头文件中声明了ioremap()函数,用来将IO内存资源映射到核心虚拟地址空间(3Gb~4GB)中,当然不用了可以将其取消映射iounmap()。

设备树

描述设备树的文件叫做 DTS(Device Tree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息。
Bootloader会将这棵树传递给内核,然后内核来识别这棵树,并根据它展开出Linux内核中的各种设备,而这些设备用到的内存、IRQ等资源,也被传递给内核,内核会将这些资源绑定给展开的相应设备。
Linux 内核在启动的时候会解析 DTB 文件,然后在/proc/device-tree 目录下生成相应的设备树节点文件。

驱动的套路


在Linux内核中:使用cdev结构体来描述字符设备;通过其成员dev_t来定义设备号(分为主、次设备号)以确定字符设备的唯一性;通过其成员file_operations来定义字符设备驱动提供给VFS的接口函数,如常见的open()、read()、write()等。
驱动框架中:模块加载函数通过 register_chrdev_region( ) 或 alloc_chrdev_region( )来静态或者动态获取设备号;通过 cdev_init( ) 建立cdev与 file_operations之间的连接,通过 cdev_add( ) 向系统添加一个cdev以完成注册;模块卸载函数通过dev_del( )来注销cdev,通过 unregister_chrdev_region( )来释放设备号。
“一切皆文件”,驱动加载成功以后,会在/dev/xxx下面出现一个文件,应用层通过open、close等函数,操作驱动设备。

中断上半部与下半部

上半部:上半部就是中断处理函数,那些处理过程比较快,不会占用很长时间的处理就可以放在上半部完成。
下半部:如果中断处理过程比较耗时,那么就将这些比较耗时的代码提出来,交给下半部去执行,这样中断处理函数就会快进快出。
软中断必须在编译的时候静态注册!
下半部的实现方式很多:小任务(tasklet),工作队列,软中断。
上半部立刻执行,下半部执行时间由内核负责。
下半部分被上半部分所调用。

tasklet、软中断、工作队列

tasklet 是利用软中断来实现的另外一种下半部机制。由于软中断必须使用可重入函数,这就导致设计上的复杂度变高,tasklet,它具有以下特性:一种特定类型的tasklet只能运行在一个CPU上,不能并行,只能串行执行;多个不同类型的tasklet可以并行在多个CPU上;软中断是静态分配的,在内核编译好之后,就不能改变。但tasklet就灵活许多,可以在运行时改变(比如添加模块时)。
工作队列(work queue)可以实现一些tasklet不能实现的工作,比如工作队列机制可以睡眠。这种差异的本质原因是,在工作队列机制中,将推后的工作交给一个称之为工作者线程(worker thread)的内核线程去完成(单核下一般会交给默认的线程events/0)。因此,在该机制中,当内核在执行中断的剩余工作时就处在进程上下文(process context)中。也就是说由工作队列所执行的中断代码会表现出进程的一些特性,最典型的就是可以重新调度甚至睡眠。
对于tasklet机制(中断处理程序也是如此),内核在执行时处于中断上下文(interrupt context)中。而中断上下文不能睡眠。

ioremap

https://blog.csdn.net/renzemingcsdn/article/details/119256808

Linux内核五大模块

https://blog.csdn.net/daaikuaichuan/article/details/82957655

面经——Linux内核及驱动相关推荐

  1. Linux内核网络设备驱动

    本文首先从宏观上介绍数据包的接收过程,然后详细介绍了Linux网络设备驱动的工作过程,最后介绍网卡监控与调优,包括网络数据包总数.丢包.错包数量的相关统计. 1. 接收数据包过程概述 介绍数据包收包过 ...

  2. Android系统 linux内核按键驱动开发

    Android系统 linux内核按键驱动开发 前言 刚入门的小白,在csdn的帮助下完成了第一个按键驱动,特写此文记录学习并分享给有需要的人. 1.修改设备树.dts 我是用的开发板是rp-rk32 ...

  3. linux内核led驱动开发,从Linux内核LED驱动来理解字符设备驱动开发流程

    目录 博客说明 开发环境 1. Linux字符设备驱动的组成 1.1 字符设备驱动模块加载与卸载函数 1.2 字符设备驱动的file_operations 结构体中的成员函数 2. 字符设备驱动--设 ...

  4. 【嵌入式环境下linux内核及驱动学习笔记-(16)linux总线、设备、驱动模型之input框架】

    目录 1.Linux内核输入子系统概念导入 1.1 输入设备工作机制 1.2 运行框架 1.3 分层思想 2.驱动开发步骤 2.1 在init()或probe()函数中 2.2 在exit()或rem ...

  5. Linux内核IOREMAP驱动

    1 Linux内核IOREMAP驱动 在内核驱动的代码中,存在大量代码使用ioremap进行物理地址和虚拟地址映射,使得内核更加容易操作硬件,对比于简单的gpio控制,实际的代码同样是使用了iorem ...

  6. 【嵌入式环境下linux内核及驱动学习笔记-(15-1)例程】

    目录 1.在APP直接调用标准文件IO操作I2C(针对学习笔记-15的15.3节) 1.1 mail.c 1.2 mpu6050.h 1.3 mpu6050.c 1.4 Makefile 2.以外称i ...

  7. 深入讲解Linux内核网络设备驱动(图例解析)

    1. 接收数据包过程概述 介绍数据包收包过程,有助于我们了解Linux内核网络设备在数据收包过程中的位置,下面从宏观的角度介绍数据包从被网卡接收到进入 socket 接收队列的整个过程: 加载网卡驱动 ...

  8. linux驱动内核,Linux内核设备驱动之Linux内核基础笔记整理

    1. Linux内核驱动模块机制 静态加载, 把驱动模块编进内核, 在内核启动时加载 动态加载, 把驱动模块编为ko, 在内核启动后,需要用时加载 2. 编写内核驱动 #include #includ ...

  9. linux内核_Linux驱动编程的本质就是Linux内核编程

    由于Linux驱动编程的本质属于Linux内核编程,因此我们非常有必要熟悉Linux内核以及Linux内核的特点. 这篇文章将会帮助读者打下Linux驱动编程的基础知识. 本篇文章分为如下三个小节进行 ...

  10. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的I2C驱动架构分析

    PowerPC + Linux2.6.25平台下的I2C驱动架构分析 Sailor_forever  sailing_9806#163.com (本原创文章发表于Sailor_forever 的个人b ...

最新文章

  1. Android平台的事件处理机制和手指滑动例子
  2. 转贴 jQuery Datepicker by Example
  3. day38 19-Spring整合web开发
  4. ethereumjs/ethereumjs-account-2-test
  5. python十大装b语法_Python 十大语法
  6. struts启动过滤器异常_Spring 统一异常处理的方式
  7. 在MFC中获取窗口\视图句柄 &获取当前活动的CView .
  8. python好友信息管理系统
  9. eclipse中文语言包在线安装方法
  10. 毕业两年程序员Java学习路线
  11. 计算机中文无敌版,与电脑下象棋无敌版
  12. 基于欧拉-拉格朗日方程的机器人动力学模型
  13. 数值分析思考题(钟尔杰版)参考解答——第一章
  14. 英特尔服务器主板型号哪里看,intel cpu型号参数如何查看
  15. Cannot determine archive format of /tmp/pip-req-build-
  16. if_attact中几个宏定义
  17. 正大国际期货:正大期货公司开户指南
  18. 算法4 随书 IDE:DrJava 在 Win10 下高分屏字体太小问题解决
  19. 2015 mbpr13 升级固态硬盘
  20. Praat脚本-019 | Praat批量修改音频通道数

热门文章

  1. hdu 2604 Queuing AC自动机构造递推式-矩阵-结果
  2. 铁路专用计算机,浅谈专用铁路计算机联锁控制
  3. ado.net知识点博客网址
  4. java中logger关闭log_Log4J如何关闭Logger对象的IO流资源
  5. 再论《IT人员应聘建议》
  6. 对于一些敏感的数据(例如密码),为什么使用字符数组存储比使用String更安全?
  7. 各种编程技术中的$符的使用
  8. GDAL不支持创建PCIDSK的面状矢量格式
  9. ArcGIS制图表达Representation-制图表达原理
  10. PhoneGap跨平台移动应用开发框架体验