![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Kernel
文章平均质量分 79
Linux kernel driver and software framework
huofengfeihu
这个作者很懒,什么都没留下…
展开
-
Linux Kernel编程 --- 字符设备驱动
1 字符设备驱动结构 字符设备是3大类设备(字符设备、块设备、网络设备)中的一类,其驱动程序主要完成的工作是初始化、添加、删除cdev结构体,申请和释放设备号,填充file_oprations结构体中的操作函数,实现file_oprations中的read() write() ioctl()等函数是驱动设计的主要工作。 先看看字符设备驱动的架构:1.1 cdevcdev结构体是字符设备的核心数据结构,用于描述一个字符设备,cdev定义如下:#include ...原创 2020-08-18 10:26:54 · 487 阅读 · 0 评论 -
Linux Kernel编程 --- class_create/device_create/udev特性
1 class 内核中定义了struct class结构体,顾名思义,一个struct class结构体类型变量对应一个类,内核同时提供了class_create(…)函数,可以用它来创建一个类,这个类存放于sysfs下面,一旦创建好了这个类,再调用device_create(…)函数来在/dev目录下创建相应的设备节点。这样,加载模块的时候,用户空间中的udev会自动响应device_create(…)函数,去/sysfs下寻找对应的类从而创建设备节点。(1)通过class_cr...原创 2020-08-11 11:42:24 · 2690 阅读 · 0 评论 -
Linux Kernel编程 --- procfs编程
1 procfs概述 procfs也是虚拟文件系统(debugfs、sysfs和procfs)之一。这个虚拟文件系统在内核空间和用户空间之间打开了一个通信窗口。在类Unix系统中体现了一种良好的抽象哲学,就是几乎所有的数据实体都被抽象成一个统一的接口--文件来看待,这样我们就可以用一些简单的基本工具完成大量复杂的操作。 procfs是Linux内核信息的抽象文件接口,大量内核中的信息以及可调参数都被作为常规文件映射到一个目录树中,这样我们就可以简单直接的通过echo或ca...原创 2020-07-29 10:03:37 · 986 阅读 · 0 评论 -
Linux Kernel编程 --- 内存与IO访问
本文档参考宋宝华老师的《linux设备驱动开发详解》内存访问与映射是linux驱动常见操作,操作硬件时离不开内存的映射,本章比较重要。1 CPU与内存、I/O嵌入式处理器,一般不提供专门的I/O空间,而仅存在内存空间;各种外设寄存器都直接映射到内存空间,可以通过指针直接访问x86一般提供专门的I/O空间, 用特殊指令访问这些空间; CPU访问虚拟地址(VA),MMU把虚拟地址转换为物理地址(PA),同时提供内存访问权限保护和Cache缓存控制等硬件支持。MMU的知识点还是比较多,也比较复原创 2020-07-27 22:28:25 · 900 阅读 · 0 评论 -
Linux Kernel编程 --- 中断与时钟
本文档参考宋宝华老师的《linux设备驱动开发详解》1 中断与定时器 中断一般有如下类型:内部中断和外部中断:内部中断来自CPU,例如软件中断指令、溢出、除0错误等;外部中断有外部设备触发 可屏蔽中断和不可屏蔽中断 向量中断(矢量中断)和非向量中断,ARM一般是非向量中断,因为现在的中断源很多,如果做成向量,那中断向量表会很大。不过ARM的总异常还是按照向量的方式组织的。NVIC(CM4) -- 向量中断 CR5/CA55 -- 非向量中断向量表:发生异常后,CPU直接跳转到响应地址.原创 2020-07-25 19:35:07 · 431 阅读 · 0 评论 -
Linux Kernel编程 --- 设备驱动中的异步通知和异步IO
本文档参考宋宝华老师的《linux设备驱动开发详解》1 概念异步通知,也称信号驱动的异步IO,类似于软中断的概念。具体来讲,一旦资源就绪,则主动通知相应的应用来获取资源。信号是软件层次上对中断的一种模拟。信号是异步的,一个进程不必通过任何操作来等待信号的到达。阻塞IO意味着一直等待设备可访问后再访问。非阻塞IO使用poll查询设备是否可以访问。异步通知意味着设备通知用户设备自己可以被访问,之后用户再进行IO。...原创 2020-07-25 17:14:49 · 292 阅读 · 0 评论 -
Linux Kernel编程 --- 设备驱动中的阻塞与非阻塞IO
本文档参考宋宝华老师的《linux设备驱动开发详解》1 概述阻塞:访问设备时,若不能获取资源,则进程挂起,进入睡眠状态;也就是进入等待队列,直到满足的条件被满足为止; 非阻塞:不能获取资源时,不睡眠,要么退出、要么一直查询;直到可以进行操作为止,直接退出且无资源时,返回-EAGAIN如图所示,阻塞访问时,不能获取资源的进程将进入休眠,它将CPU资源让给其它进程。阻塞的进程会进入休眠状态,所以必须确保有一个地方可以唤醒休眠的进程。一般在中断中唤醒。非阻塞进程则是通过不断的尝试,直到原创 2020-07-25 16:31:21 · 456 阅读 · 0 评论 -
Linux Kernel编程 --- 设备驱动中的并发控制
1 基本概念(1)并发(concurrency)指的是多个执行单元同时、并行被执行;(2)并发的执行单元对共享资源的访问容易导致竞态(race conditions);这里的共享资源可以为硬件资源、软件上的全局及静态变量等(3)解决竞态问题的途径是保证对共享资源的互斥访问;所谓互斥访问是指一个执行单元访问共享资源的时候,其他执行单元被禁止;(4)访问共享资源的代码区域称为临界区,临界区需...原创 2020-07-25 15:16:45 · 160 阅读 · 0 评论 -
Linux Kernel编程 --- genalloc原理
参考链接:https://www.douban.com/group/topic/47566535/http://blog.chinaunix.net/uid-20321537-id-1966893.htmlhttp://www.alivepea.me/kernel/kernel-genalloc/转载 2020-03-03 21:12:15 · 1716 阅读 · 0 评论 -
Linux内核数据结构-----链表
0 内核链表的引出背景普通的链表操作,通常包含数据域和指针域2个内容 如下所示。typedef struct node{ ElemType data; //数据域 struct node *next; //指针域}node, *list; 但是,这种方式和数据本身的关联性太大,不利于通用化;而Linux中设计了一种专门的通用链表数据结构,只需将链...原创 2018-08-18 14:20:38 · 148 阅读 · 0 评论 -
GIT 基本原理及使用
1 git基础1.1 git与其它版本控制(SVN)的区别(1)Git是分布式的,而Svn不是分布的;GIT跟SVN一样有自己的 集中式版本库或服务器。但,GIT更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect out代码后会在自己的机器上克隆一个自己的版本库。可以这样说,如果你被困在一个不能连接网络的地方时,你仍然能够提交文件,查看历史版本记录,创建项 目...原创 2018-11-12 23:08:00 · 330 阅读 · 0 评论 -
设备树和Platform架构--2--设备树编译
本小节讲解(1)设备树编译(2)uboot对设备树的相关操作;参考:https://blog.csdn.net/woyimibayi/article/details/775747361 Device Tree编译Device Tree文件的格式为dts,包含的头文件格式为dtsi,dts文件是一种人可以看懂的编码格式。但是uboot和linux不能直接识别,他们只能识别二进制文件,所...转载 2019-06-04 13:49:53 · 833 阅读 · 1 评论 -
设备树和Platform架构--1--设备树基础
本小节讲解设备树相关的基础知识。参考链接:https://www.cnblogs.com/liuwanpeng/p/7421661.html设备数语法参考链接:https://elinux.org/Device_Tree_Usage设备树(dts)是节点和属性的树型结构。属性即为键-值对,节点包含子节点和属性描述上图属性结构的示例dts为:##################...原创 2019-05-30 09:24:25 · 1467 阅读 · 0 评论 -
设备树和Platform架构--3--kernel解析设备树(dtb----device_node)
参考:https://blog.csdn.net/thisway_diy/article/details/84336817https://blog.csdn.net/woyimibayi/article/details/775747361 概述Linux使用设备树完成3个目的:(1)识别machine(platform identification);(2)运行信息提取与管...原创 2019-06-04 10:19:15 · 2580 阅读 · 0 评论 -
设备树和Platform架构--4--platform bus概述及其初始化
1 概述1.1 platform(平台)总线出现背景 Platform总线是Linux设备驱动模型为了保持设备驱动的统一性而虚拟出来的总线。因为对于usb设备、i2c设备、pci设备、spi设备等等,他们与cpu的通信都是直接挂在相应的总线下面与cpu进行数据交互的,但是在嵌入式系统当中,并不是所有的设备都能够归属于这些常见的总线,在嵌入式系统里面,SoC系统中集成的独立的外设控制器...原创 2019-06-12 09:00:02 · 3383 阅读 · 0 评论 -
设备树和Platform架构--6-platform_driver及match
1 概述(1)Linux设备模型使用了三个数据结构分别来描述总线、设备和驱动。所有的设备和对应的驱动都必须挂载在某一个总线上,通过总线,可以绑定设备和驱动。这个属于分离的思想,将设备和驱动分开管理。(2)Platform总线仅仅时诸多总线中的一种。platform总线的设计初衷:见《设备树和Platform架构--4--platform bus概述及其初始化》(3)在设备树为引入到li...原创 2019-06-13 10:15:46 · 882 阅读 · 1 评论 -
设备树和Platform架构--5--platform_device创建
platform_device的建立包含两种方式:(1)在内核初始化时通过device_node转换为platform_device,这种是最新的实现方式,基于设备树,在内核初始化时将设备树中的节点转化为platform_device;(2)使用platform_device_register注册platform_device;1 关键数据结构体struct platfor...原创 2019-06-30 11:26:55 · 7695 阅读 · 0 评论 -
Linux Kernel编程 --- Mailbox驱动框架
1 概述(1)mailbox是一种框架,通过消息队列和中断驱动信号处理多处理器间的通讯;(2)mailbox的实现分为contoller和client。简单的说就是client 可以通过controller提供的channel发送信息给controller;(3)在drivers/mailbox下实现的都是controller的源码;具体到某个厂商的硬件,则描述如下:Kconfig文...原创 2020-02-02 21:29:48 · 17074 阅读 · 0 评论