![](https://img-blog.csdnimg.cn/20190918140213434.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
从零开始学Linux内核驱动系列
文章平均质量分 96
本专栏将会从一个最简单的Linux内核模块开始,一步一步的带你入门Linux内核驱动开发
浮云流响
代码强国。
展开
-
Linux驱动开发 --- 设备树
设备树文章目录设备树1. 设备树由来2. 设备树的目的3. Linux设备树的使用1. 设备树由来在Linux内核源码引入内核源码的ARM体系结构引入设备树之前,相关的BSP代码中充斥了大量的平台设备代码(platform device)。而这些代码大多是重复的、杂乱的,这就给内核移植带来了巨大的困难。以至于Linux之父Linus怒斥ARM社区。为了解决此问题,设备树就被引用到Linux中来。(需要注意的是设备树并不是Linux的首创)2. 设备树的目的设备树是一个描述硬件的数据结构。它也不能原创 2021-04-27 15:21:39 · 734 阅读 · 0 评论 -
从零开始学Linux设备驱动--Linux设备模型
Linux设备模型一、概述前面讲到了设备驱动的编写方法,但是我们会发现我们编写的驱动不够智能,或者说是实用性很差。比如:设备和驱动没有分离。这样一旦硬件信息改变,我们的驱动就无法使用了。不能查看相应的设备和驱动的的信息,比如Windows中有设备管理器,我们就可以比较方便的查看相关的设备和驱动的信息。不能自动创建设备节点驱动不能自动加载没有电源管理等等这些都是我们前面编写驱动程序的缺点,那么有什么比较好的办法可以解决吗?当然,Linux也提供了一套设备驱动模型用于Linux平台下的设原创 2020-07-26 22:55:32 · 373 阅读 · 0 评论 -
从零开始学Linux设备驱动--Linux内存管理与DMA(万字长文)
内存管理与DMA一、概述我们知道类似于ARM这种结构,操作硬件都是通过特殊功能寄存器(SFR)来进行的,他们和内存统一编址,也叫IO内存。下面我们一起来看一下Linux系统是如何来对内存进行管理的。二、内存管理从内存管理的方法来分,可以将计算机分为两种类型,一种是UMA(uniform memory access,一致内存访问)计算机,另一种是NUMA(non-uniform memory access,非一致内存访问)计算机。UMA计算机:每一CPU访问的都是同一块内存,分CPU对原创 2020-07-21 00:16:28 · 1920 阅读 · 2 评论 -
从零开始学Linux驱动--(9)内核中的互斥与同步
互斥与同步一、概述如果内核中有多条路径都要访问同一个资源,那么可能会导致数据的相互覆盖,并造成紊乱。例如,我们在驱动代码中定义了一个全局变量i,驱动中某个例程中执行了i++操作,而在中断服务程序中也执行了i++操作,在这种情形下我们来分析一下可能造成的数据紊乱情况。i++在ARM汇编中展开如下:ldr r1,[r0]add r1,r1,#1str r1,[r0]假设变量i所存放的值是放在r0所指向的内存中,也就是说,r0寄存器中保存了变量i的地址,并且变量i的初值为5。假设当我们执行到第一原创 2020-07-11 22:31:48 · 565 阅读 · 0 评论 -
从零开始学Linux设备驱动--(8)中断、事件管理及中断下半部
中断和事件管理一、中断中断进入过程为了提高外部时间处理的实时性,显示的处理器几乎都含有中断控制器,外设也都带有中断触发的功能。为了支持这一特性,Linux中设计了一个终端子系统来管理系统中的中断。很多处理器都有中断控制器,它负责进行中断管理。下面讨论一下,当中断发生了,如何调用驱动中的中断处理函数。一般在我们会实现将异常向量表写好,并标记异常向量表的起始地址,在内核启动的过程中会将异常向量表搬移到0xFFFF0000的位置,通过设置处理器的先关寄存器可以对异常向量表进行重映射当不同的中断原创 2020-07-05 14:19:44 · 597 阅读 · 0 评论 -
从零开始学Linux设备驱动--(7)高级Io操作
高级I/o操作一、ioctl设备操作除了之前提到的对设备的读写操作(read、write接口来实现),内核将对设备的控制操作委派给ioctl接口,ioctl也是一个系统调用。int iooctl(int d,int request,...);@ d :要操作的文件描述符@ request :代表不同操作的数字值,遵循一定的规则@ ... :C语言中可变参数函数的声明,表示第三个参数可有可无。这个是在应用层的系统调用函数,和read、write等系统调用一样,其对应的驱动接口函数式unlo原创 2020-06-28 22:54:49 · 806 阅读 · 0 评论 -
从零开始学Linux设备驱动--(六)字符设备驱动(中)
字符设备驱动-下一、一个驱动支持多个设备我们平时写设备驱动程序的时候,肯定遇到过这种情况,一类设备有多个个体(比如系统上有两个串口)。此时,我们可能会想到多一个设备我在多写一个同样的驱动程序就好啦,或者说同一中驱动程序写两份呢?这样当然可以啦,但是呢,这样并不是最好的解决办法。如果我们一个设备上面的设备有10个八个呢,而我们的驱动程序是要编译进内核的而内核又是对内存有着比较高的要求的,同一类...原创 2019-11-17 16:10:52 · 277 阅读 · 0 评论 -
从零开始学Linux内核驱动--(五)字符设备驱动(上)
typora-copy-images-to: …\pictureLinux设备驱动–(5)字符设备驱动一、字符设备驱动基础基本概念 在前面几篇博客里,已经基本介绍了Linux的驱动的的分类情况。所谓的字符设备就是指其数据的处理是以字节流的形式。 我们都知道有一句经典的话"linux下一切皆文件",这句话的意思意思是什么呢?这就意味着,我们的设备最终会议文件的形式被上层去调...原创 2019-11-06 23:35:32 · 444 阅读 · 0 评论 -
Linux驱动--(四)内核模块参数详解
Linux驱动-内核模块参数一、概述前面几篇文章中,我们简单说了一个简单的内核模块的编写。在那里我说过模块加载函数接收参数。那么如果我们想要通过传参对模块进行控制那不是很难办到了。别急,Linux提供了一种命令行的方式来传递参数信息,就是所谓的模块参数。模块参数:简单来说模块参数允许用户再加载模块时通过命令行指定参数值,在模块的加载过程中,加载程序会得到命令行参数,并转换成相应类型的值,然后...原创 2019-11-05 00:05:50 · 1020 阅读 · 1 评论 -
从零开始学Linux内核驱动--(三)简单的内核模块驱动程序(下)
(三)简单的内核模块驱动程序-下一、概述上篇中我们讲述了,简单的内核模块驱动程序。但是那并不是内核模块的一般形式。不知你是否尝试过将其加载到到内核中。如果你加载了,应该会看到以下输出:# hello:module license 'unspecified' taints kernel# Disabling lock debugging due to kernel taint这两句...原创 2019-11-05 00:04:49 · 346 阅读 · 0 评论 -
从零开始学Linux内核驱动--(二)简单内核模块驱动程序
Linux驱动–(二)简单的内核模块驱动程序一、概述Linux中所有的驱动都是以内核模块的形式来实现的,他们与其他所有的内核编译在一起形成一个单独的内核镜像文件(所以说Linux是一个宏内核)。当然啦,这是相对于微内核而言的(典型的微内核的代表是Windows系统),后面我会专门总结一下这两种内核的优缺点和不同,这里呢,先简单说一下红内核和微内核的区别(后面会专门写一篇博客来区分二者):...原创 2019-11-04 00:07:35 · 493 阅读 · 1 评论 -
从零开始学Linux内核驱动-(一)驱动综述
Linux驱动-驱动综述一、Linux驱动Linux是一个成功的优秀的开源项目,随着应用的日益广泛,Linux已受到越来越多的软件开发者的追捧。但是从官网上面下载下来Linux源码后,我们会发现Linux的世界是如此巨大,代码量是如此巨大。要想学习,Linux到底该从哪里入手呢?之前在一本很有名气讲述Linux的书中,看到作者有提到两个不错的突破口,可以帮助我们更好的进入Linux的世界...原创 2019-11-03 12:42:54 · 462 阅读 · 0 评论