前言
截至当前,工作中涉及的驱动基本都是字符设备驱动,内核通过字符设备向用户空间提供API,实现内核与用户态间的交互。
学习字符设备需要了解以下几方面的知识:
- 了解Linux内核字符设备驱动程序的架构
- 了解Linux内核字符设备驱动相关的API
- 了解Linux内核内存管理的API
- 了解Linux内核中断管理的API
- 了解Linux内核同步和锁相关的API
- 了解具体芯片的工作原理及操作方式
下面围绕几点,概述一下相关知识。
字符设备驱动
字符设备驱动架构
驱动架构如图所示,最底层是硬件、向上是Linux的核心模块(比如文件管理、内存管理、中断管理等),然后是驱动程序、虚拟文件系统、系统调用,最上层是应用程序。应用程序通过打开字符设备,使用open、read、write以及mmap等系统调用,获取相关资源,进行对应的操作,最后控制硬件的行为。
字符设备驱动的API
相关接口的功能包括创建一个字符设备、管理相关的文件操作集函数。大概归纳一下有如下接口:
1 | // 申请一个字符设备号 |
内存管理的API
主要就是分配内存,设备内存映射等接口。
1 |
|
中断管理的API
中断一般由设备发起,驱动程序通过注册中断函数处理数据,而不需要驱动程序主动去poll数据是否准备好。当然,根据应用场景,也有禁用中断使用轮询方式的,比如DPDK。
相关API如下:
1 | int platform_get_irq(struct platform_device *pdev, int index); |
同步和锁相关的API
驱动常用的主要是struct mutex 和 struct spinlock,其中mutex会导致线程阻塞挂起,而spinlock则类似while循环一直在忙。API省略。
具体芯片的工作原理及操作方式
根据具体硬件的手册来操作,了解实现逻辑和寄存器地址与功能。
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。
博客地址: https://fishmwei.github.io
掘金主页: https://juejin.cn/user/2084329776486919