
linux字符设备驱动学习
乱世半仙
人生最大的悲哀莫过于坚持了不该坚持的,放弃了不该放弃的
展开
-
input输入子系统
文章目录前言一、输入子系统的作用二、输入子系统框架分析1.输入子系统架构图2.输入子系统分析2.1 核心层分析2.2 事件层分析2.3 input device driver层分析3. input事件分析三、按键驱动实例总结前言本文仅作为学习笔记总结提示:以下是本篇文章正文内容,下面案例可供参考一、输入子系统的作用兼容所有输入设备——Linux系统支持的输入设备繁多,例如键盘、鼠标、触摸屏、手柄或者是一些输入设备像体感输入等等,Linux系统为了管理如此之多的不同类型、不同原理、不同的输入信原创 2020-10-28 18:28:19 · 765 阅读 · 0 评论 -
驱动学习之时间管理
一、jiffies1.1概念 通常情况下,jiffies在linux系统启动引导阶段初始化为0,当系统完成了对时钟中断的初始化之后,在每个时钟中断处理例程中,该值都会被+1,因此该值存储了系统自最近一次启动以来的时钟滴答数。除了时钟中断程序对该值有修改的权利,其它任何模块都只有读的权利。这里再介绍一个概念HZ,该值在内核源码根目录下.config文件中。一般为1000,代表系统一秒中发生1000次时钟中断。jiffies在内核源码中作为一个全局性变量被导出,所以在驱动程序中如过想使用,必须包含头文原创 2020-09-21 14:22:54 · 258 阅读 · 0 评论 -
驱动学习之延时机制(tasklet与工作队列)
前言:最近接触到了工作队列,不知道为什么要用它,大概学习一下一、工作队列的引入我们都知道中断分为顶半部与底半部,顶半部完成的都是比较着急的硬件的操作,完成之后要迅速清除中断,然后由底半部执行那些推后的工作,我们经常使用tasklet...原创 2020-09-18 18:28:16 · 1177 阅读 · 0 评论 -
驱动学习之中断
前言:我们知道外部设备与处理器交互的一般手段有两种–中断与轮询。但是由于轮询是比较消耗CPU资源的,所以现代设备大多数都采用中断与处理器通信。处理器在中断到达时候会根据中断号找到对应的处理函数对该信号进行处理。这些处理函数我们成为中断处理例程,设备驱动程序负责为设备提供相应的中断处理例程,并注册到系统。从设备发出中断信号,到处理器最终调用处理例程处理完成。期间会经过很多步骤,这个过程构成了中断处理框架,本文将描述linux系统下的中断处理设计框架,然后讨论驱动程序如何利用接口注册中断处理例程。一、中断架原创 2020-09-18 13:31:21 · 1159 阅读 · 0 评论 -
驱动学习之同步IO
前言:本文讨论驱动程序中同步IO类型一、同步阻塞IO同步阻塞IO是驱动中最常用到的,这里我们分析一下他的实现。等待队列是内核中实现阻塞IO经常使用的办法,我们这里分析一下等待队列的机制。1等待队列这里先介绍两个结构体,等待队列头部及节点:内核实现了自动实现阻塞的接口,如下:1.定义等待队列头wait_queue_head_t wq; //定义等待队列头init_waitqueue_head(&wq) //等待队列头的初始化2.实现阻塞wait_event(wq, con原创 2020-09-16 15:00:20 · 140 阅读 · 0 评论 -
驱动学习之互斥与同步
一、并发的来源中断处理路径调度器的可抢占性多处理器的并发执行二、解决竟态的办法2.1 中断屏蔽对于单cpu范围来说,解决竟态的简单方法就是屏蔽系统的中断,屏蔽中断使得中断与进程之间的并发不会发生,并且由于Linux内核进程调度等操作都是依赖于中断来实现,内核抢占之间的并发也就可以避免了。local _ irq _ disable() //屏蔽中local _ irq _ enable() //开中断下面这两个宏是上面的变体,目的是为了防止在关闭中断的环境中使用上面两个宏之后,最后的环原创 2020-09-16 08:51:01 · 337 阅读 · 0 评论 -
Linux内核内存分配接口函数分析
前言:这里来分析一下Linux内核内存分配的原理1、物理内存的管理先来简单了解几个概念1.1 内存节点 node在计算机世界中,有两种物理内存的管理方式被广泛使用,他们分别是:UMA(一直内存访问)模型NUMA(非一致内存访问)模型两种模型的区别如下:在linux源码中以struct pglist_data数据结构来表示单个的内存节点,对于NUMA模型,多个内存节点通过链表链接起来,对于UMA模型,因为只有一个这种node,所以不存在链表。1.2 内存区域ZONE内存区域属于单个内存节原创 2020-09-14 11:34:15 · 942 阅读 · 1 评论 -
内核中打印信息学习
在 Linux 中,内核打印语句 printk()会将内核信息输出到内核信息缓冲区中。内核信息缓冲区是一个环形缓冲区(ring buffer),因此,如果塞入的消息过多,就会将之前的消息冲刷掉。Linux 的 klogd 进程(一个系统守护进程,它截获并且记录下 Linux 内核日志信息)会通过/proc/kmsg 文件读取缓冲区,一旦读取完成,内核信息便从缓冲区中被删除。之后,klogd 守护进程会将读取的内核信息派发给 syslogd 守护进程(syslogd 记录下系统里所有提供日志记录的原创 2020-09-10 15:15:27 · 788 阅读 · 0 评论 -
字符设备驱动原理分析
前言:开始学习字符设备驱动,这里会配合对内核的了解来学习学习字符设备前,先了解一个结构体:struct file_operations可以看到该结构体中都是一些函数指针变量,这些函数变量这里不做介绍,我们只需要知道现实中驱动的编写多是围绕着这些函数的实现来进行的。学习字符设备驱动,要先了解字符设备结构体,内核使用cdev结构体来描述一个字符设备。 struct cdev { struct kobject kobj; /* 内嵌的 kobject 对象 */ struct module *ow原创 2020-09-11 11:42:59 · 580 阅读 · 0 评论 -
内核模块加载过程分析
前言:想要了解内核模块的加载过程,需要先了解ELF文件格式,我的ELF文件格式解析文章地址如下:ELF文件格式解析https://blog.youkuaiyun.com/zj82448191/article/details/108441447在用户空间,用insmod这样的命令来向内核空间安装一个内核模块,本章将详细讨论模块加载时的内核行为,当我们加载一个模块时,insmod会首先利用文件系统的接口将其数据读取到用户空间的一段内存中,然后通过系统调用sys_init_module,让内核去处理加载的整个过程。一、原创 2020-09-10 14:22:25 · 1655 阅读 · 0 评论 -
Linux内核经典链表list_head常用方法总结
前言:一起分析内核最重要的链表list_head一、链表结构struct list_head { struct list_head *next, *prev;};二、链表初始化函数list_head 链表的初始化只是把 *next, *prev连个指针指向链表头,形成双向循环链表;#define LIST_HEAD_INIT(name) { &(name), &(name) } #define LIST_HEAD(name) \ struct list_head nam原创 2020-09-09 10:05:03 · 702 阅读 · 0 评论 -
ELF文件格式解析
前言:为了更好的学习驱动,这里打算了解一下内核模块实现机制,融汇贯通一下,可能会遇到很多之前没有接触的东西一、LINUX驱动学习之常用的模块操作命令(1)lsmod(list module,将模块列表显示),功能是打印出当前内核中已经安装的模块列表(2)insmod(install module,安装模块),功能是向当前内核中去安装一个模块,用法是insmod xxx.ko(3)modinfo(module information,模块信息),功能是打印出一个内核模块的自带信息。,用法是modinf原创 2020-09-07 17:36:46 · 5211 阅读 · 0 评论 -
Linux内核模块编译方法
一、分类静态编译:静态编译即为将驱动直接编译进内核 调试完之后,采用该方法动态编译:动态编译即为将驱动编译成模块二、动态编译这里提供一个Makefile,动态编译区分单文件与多问见,详细见Makefile内容:#obj-m = demo.o 单文件obj-m = demo.odemo-objs = 1.o 2.o 3.o PWD := $(shell pwd)KDIR:=/lib/modules/$(shell uname -r)/build/ all: m原创 2020-09-04 16:27:19 · 975 阅读 · 0 评论 -
Linux内核模块作用及组成
前言:Linux 设备驱动会以内核模块的形式出现,因此,学会编写 Linux 内核模块编程 是学习 Linux 设备驱动的先决条件一、模块的作用Linux 内核的整体结构非常庞大,其包含的组件也非常多,如果把所有需要的功能都编译到Linux内核,这会导致两个问题,一是生成的内核会很大,二是如果我们要在现有的内核中新增或删除功能,将不得不重新编译内核。所以引入了模块,模块可以随意添加到内核中或者从内核中卸载掉,模块特点如下:1.模块本身不被编译入内核映像,从而控制了内核的大小。2.模块一旦被加载,原创 2020-09-04 11:08:56 · 1588 阅读 · 0 评论