Linux驱动开发基础
LInux驱动基础知识
Echo缘
这个作者很懒,什么都没留下…
展开
-
驱动开发之始,(六)Linux内核时间,延迟操作
时钟中断由系统定时硬件周期性的间隔产生,这个间隔由内核根据HZ的值设定,HZ是一个与体系结构有关的常数。定义在<asm-genric/param.h>中(每个人下载的内核版本不同可能位于不同的文件下)。每次当时钟中断发生时,内核内部计数器的值就增加一。这个计数器的值在系统引导时被初始化为0。因此,它的值就是自上次操作系统引导以来的时钟滴答数,成为“jiffies_64”。1.使用j...原创 2020-04-06 17:28:48 · 252 阅读 · 0 评论 -
驱动开发之始,(五)异步通知
情形分析:一个进程需要从外设读取采集到的数据进行处理,如果有新的数据到来,应用程序可以周期性地调用poll来检查数据,但是这样做的效率并不高。因此,通过使用异步通知,应用程序可以在数据可用时收到一个信号,转而进行处理,而不需要不停的使用查询的方式来检查有无新数据的到来。为了启用文件的异步通知机制,应用程序执行以下三个步骤:step1:指定一个进程作为文件的“属主(owner)”(在file...原创 2020-04-06 14:07:34 · 117 阅读 · 0 评论 -
驱动开发之始,(四)阻塞型I/O,进程休眠
在前面的章节中,我们讲述了read和write方法。当数据不可用时,用户调用read,或者用户使用写入数据,但输出缓冲区已满,驱动程序该如何相应呢?在这种情况下,驱动程序应该(默认)阻塞该进程,将其置入休眠状态直到请求可继续。1.休眠(sleep)当一个进程被置入休眠时,它会被标记为一种特殊状态并从调度器的运行队列中移走,休眠中的进程会被搁置在一边,等待将来的某个事件发生,直到某些情况下修...原创 2020-04-05 20:52:07 · 316 阅读 · 0 评论 -
驱动开发之始,(三)并发与竞态,信号量与自旋锁
1.并发与竞态在单处理器结构中,各个进程从宏观上看是并行的,因为处理器执行速度非常快,但从微观上看进程是串行执行,因为在一个时刻只有一个进程能被处理器运行,称为并发。换句话说,在一段时间内,处理器能够同时做多件事。举个例子,A进程先在CPU上得到执行,突然被B进程打断(硬件中断或拥有更高优先级),CPU此刻暂时放下A进程,转而为B进程服务,当B进程服务完成后,在接着执行A进程,从这一段时...原创 2020-04-05 17:03:34 · 153 阅读 · 0 评论 -
驱动开发之始,(二)字符设备驱动——Part3 简单的字符驱动实例
通过前面两章的知识汇总,我们了解字符设备驱动框架及其涉及的几个重要数据结构,为了加深理解,本章用一个简单的实例来演示字符设备驱动的开发过程,因为没有实际接硬件,并未实现对驱动进行复杂操作,在此只做一个初步认识,在后续的进阶部分,笔者再通过实际的字符驱动来进一步分析。1.字符设备驱动 hello_module.c#include <linux/init.h>#include ...原创 2020-04-04 18:18:56 · 179 阅读 · 0 评论 -
驱动开发之始,(二)字符设备驱动——Part2 file_operations,file和inode结构
上一章中,讲到字符设备驱动模型,了解了字符驱动的框架。为了更好的理解驱动程序,本章讲述其中涉及的三个重要数据结构,file_operations、file和inode结构。1.文件操作file_operationsfile_operations结构是用来建立驱动程序与设备间的连接,该结构定义在<linux/fs.h>,其中包含了一组函数指针。每个打开的文件(在内部由一个file...原创 2020-04-04 16:11:47 · 205 阅读 · 0 评论 -
驱动开发之始,(二)字符设备驱动——Part1驱动模型
字符设备驱动将会分为三个部分,Part1:宏观上了解驱动模型,Part2:具体分析其中重要的三个数据结构,文件操作集file_operations,文件file以及inode结构。Part3:用一个简单的实例来演示字符设备驱动的实现字符设备是面向字节流的方式,一个字节一个字节传输数据的设备,通常是按照先后顺序传递,常见的字符设备有鼠标、键盘、串口等设备。对字符设备的访问是通过文件系统内的设...原创 2020-04-01 21:29:22 · 178 阅读 · 0 评论 -
驱动开发之始,(一)Hello World内核模块
在上一篇中,我们编译了自己的主线内核,建议读者在source insight中建立内核源码工程。现在我们开始学习第一个内核模块,有一个初步的感性认识。驱动程序在Linux内核里扮演着特殊的角色,它们就像“黑盒子”, 操作底层硬件而定义好的内部接口,它们完全隐藏了设备工作的细节。用户的活动通过一套标准化的调用来进行;设备驱动的角色就是将这些调用映射到作用于实际硬件的和设备相关的操作上。Hel...原创 2020-03-28 14:24:42 · 232 阅读 · 0 评论 -
驱动开发之始,简单的编译自己的主线内核
从kernel.org的镜像网站上获得一个“主线”内核,并安装到自己的系统中,下面为kernel网址https://www.kernel.org/在Linux系统下查看自己的内核版本,尽量采用一致的版本,避免后续带来各种suprise。使用uname -r命令查看解压内核文件,下面是解压后的内核源码目录树使用make menuconfig配置内核配置完成后,使用ma...原创 2020-03-25 11:15:28 · 240 阅读 · 0 评论 -
insmod加载内核模块后报错,Invalid module format
在使用insmod加载模块时报错:Invalid module format原因分析:使用dmesg | grep module 查看Ubuntu系统版本与内核版本不一致造成,接下来查看系统版本,使用uname –r查看若版本不一致,请重新下载编译内核版本。同时,可参考该Makefile文件:重新加载hello_module.ko,问题已解决!...原创 2020-03-07 14:20:41 · 13773 阅读 · 0 评论