首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux设备驱动程序(一)——设备驱动简介

前言 这一部分主要是用来介绍 Linux 设备驱动程序的一些基本概念,包括:Linux 设备驱动程序的作用、内核功能的划分、设备和模块的分类以及版本编号。...一、Linux 设备驱动程序的作用 设备驱动程序就像一个个的“黑盒子”,使某个特定硬件响应一个定义良好的内部编程接口,这些操作完全隐藏了设备的工作细节。...用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序。将这些调用映射到作用于实际硬件的设备特有操作上,则是设备驱动程序的任务。...三、设备和模块的分类 以 Linux 的方式看待设备可区分为 3 种基本设备类型,每个模块常常实现 3 种类型中的 1 种,因此可分类成字符模块,模块,或者一个网络模块。...Linux,相反,允许应用程序读写一个设备象一个字符设备一样 – 它允许一次传送任意数目的字节。结果就是,和字符设备的区别仅仅在内核在内部管理数据的方式上,并且因此在内核/驱动的软件接口上不同。

76441
您找到你想要的搜索结果了吗?
是的
没有找到

Linux设备驱动程序(三)——字符驱动

前言 本章的目的是编写一个完整的字符设备驱动,我们开发一个字符驱动是因为这一类适合大部分简单硬件设备,字符驱动也比驱动易于理解。...字符驱动的特殊文件由使用 ls -l 的输出的第一列的"c"标识,设备也出现在 /dev 中,但是它们由"b"标识。 在Linux系统上输入:ls -l /dev 观察输出。...例如我们要操作某个设备,首先,我们要知道设备在/dev下的设备文件名。这个设备文件提供主设备号以及次设备号。然后内核通过设备文件提供的主设备找到设备驱动程序(操作设备驱动程序实现)。...最后通过主设备号和次设备构成的设备号找到正确的设备。有了操作的对象(设备)和操作的方法(驱动程序)那就可以完成了我们的要求。 一个驱动程序可以操作多个设备,所以不同的设备可以具有相同的主设备号。...如果想尝试比较简单的字符驱动实现,可以查看我的另一篇驱动开发之 hello 驱动程序实现的文章: 荔枝派Zero(全志V3S)驱动开发之hello驱动程序

38941

Linux设备驱动详解

Linux系统一次读取磁盘的大小是一个,而不是一个扇区,设备驱动由此得名。 二、设备处理过程 1、linux 内核中,设备将数据存储与固定的大小的中,每个都有自己的固定地址。...Linux内核中设备和其他模块的关系如下。 ? 1、设备的处理过程涉及Linux内核中的很多模块,下面简单描述之间的处理过过程。   ... ?...(Linux系统中,对设备的IO请求,都会向设备驱动发出一个请求,在驱动中用request结构体描述) 内核结构如下:. struct request { struct list_head queuelist...(也可以不用注册设备驱动一样可以工作,该函数和字符设备的register_chrdev()函数相对应,对于大多数的设备,第一个工作就是相内核注册自己,但是在Linux2.6以后,register_blkdev

5.3K30

Linux驱动开发: 设备驱动开发

Linux内核版本: 3.5 一、设备介绍 是一种具有一定结构的随机存取设备,对这种设备的读写是按进行的,他使用缓冲区来存放暂时的数据,待条件成熟后,从缓存一次性写入设备或者从设备一次性读到缓冲区...设备是与字符设备并列的概念, 这两类设备Linux驱动的结构有较大差异,总体而言, 设备驱动比字符设备驱动要复杂得多,在 I/O 操作上表现出极大的不同,缓冲、 I/O 调度、请求队列等都是与设备驱动相关的概念...在Linux中,驱动设备的输入或输出(I/O)操作,都会向设备发出一个请求,在驱动中用request结构体描述。...编写设备驱动时,使用的一些单位介绍: 1. 扇区(Sectors):任何设备硬件对数据处理的基本单位。通常,1个扇区的大小为512字节。(对设备而言) 2....2.1 内核自带可参考的设备驱动源码 drivers\block\z2ram.c drivers\block\xd.c \drivers\mmc\host\sdhci-s3c.c 2.2 设备注册与注销函数

31.8K30

Linux 设备驱动代码编写

按照ldd的说法,linux设备驱动包括了char,block,net三种设备。char设备是比较简单的,只要分配了major、minor号,就可以进行读写处理了。...换一句话说,所有fs对block设备的请求,最终都会转变为request的形式。所以,对于block设备驱动开发的朋友来说,处理好了request queue就掌握了block设备的一半。...闲话不多说,我们看看一个ramdisk代码驱动是怎么写的,代码来自《深入linux 设备驱动程序内核机制》, #include #include #include #include #include #include ...可以按照下面的步骤来做, a)make 一下,生成ramdisk.ko; b)编译好了之后,就可以安装驱动了,在linux下是这么做的,sudo insmod ramdisk.ko; c)安装好了

3.1K43

Linux设备驱动程序(四)——调试技术

CONFIG_DEBUG_DRIVER 在“Device drivers(设备驱动程序)”菜单中。该选项打开驱动程序核心中的调试信息,它可以帮助跟踪底层支持代码中的问题。...6、打印设备编号 有时当从一个驱动程序打印消息时,我们会希望打印与硬件关联的设备编号。...有些设备驱动程序也通过 iproc 导出信息,而我们自己的驱动程序当然也可以这么做。因为 /proc 文件系统是动态的,所以驱动程序模块可以在任何时候添加或删除其中的入口项。...在某个进程读取 /proc 文件时,内核会分配一个内存页 (即PAGE_SIZE字节的内存),驱动程序可以将数据通过这个内存页返回到用户空间。...对设备驱动程序来讲,它没有多少价值,这里包含该函数只是出于完整性考虑。

47541

linux设备驱动第一篇:设备驱动程序简介

linux设备和模块的分类: 字符设备:字符设备是能够像字节流(类似文件)一样被访问的设备,有字符设备驱动程序来实现这种特性。...linux可以让应用程序向字符设备一样读写设备,允许一次传递任意多字节的数据。...因而,设备和字符设备的区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口,而这些不同对用户来讲是透明的。在内核中,和字符驱动程序相比,驱动程序具有完全不同的接口。...Linux下的磁盘设备都是设备,尽管在Linux下有设备节点,但应用程序一般是通过文件系统及其高速缓存来访问设备的,而不是直接通过设备节点来读写设备上的数据。...内核和网络设备驱动程序间的通讯,完全不同于内核和字符以及驱动程序之间的通讯,内核调用一套和数据包传输相关的函数而不是read,write。

3.2K100

Linux驱动实践:如何编写【 GPIO 】设备驱动程序

目录 示例程序目标 编写驱动程序 编写应用程序 卸载驱动模块 在前几篇文章中,我们一讨论了:在 Linux 系统中,编写字符设备驱动程序的基本框架,主要是从代码流程和 API 函数这两方面触发。...这篇文章,我们就以此为基础,写一个有实际应用功能的驱动程序: 在驱动程序中,初始化 GPIO 设备,自动创建设备节点; 在应用程序中,打开 GPIO 设备,并发送控制指令设置 GPIO 口的状态; 示例程序目标...编写驱动程序 以下所有操作的工作目录,都是与上一篇文章相同的,即:~/tmp/linux-4.15/drivers/。...创建驱动目录和驱动程序 $ cd linux-4.15/drivers/ $ mkdir mygpio_driver $ cd mygpio_driver $ touch mygpio.c mygpio.c...从代码中可以看出:驱动程序使用 alloc_chrdev_region 函数,来动态注册设备号,并且利用了 Linux 应用层中的 udev 服务,自动在 /dev 目录下创建了设备节点。

4.8K30

23.Linux-设备驱动(详解)

通过上节的设备驱动分析,本节便通过内存来模拟设备驱动 ,方便我们更加熟悉设备驱动框架 参考内核自带的设备驱动程序: drivers/block /xd.c   drivers/block /z2ram.c...; struct block_device_operations *fops; //设备操作函数 struct request_queue *queue; //请求队列...源地址) ... ... }; 2.本节需要的函数如下: int register_blkdev(unsigned int major, const char *name); 创建一个设备...,当major==0时,表示动态创建,创建成功会返回一个主设备号 unregister_blkdev(unsigned int major, const char *name); 卸载一个设备, 在出口函数中使用.../tmp/ //挂载设备到/tmp目录下 接下来在/tmp目录下vi 1.txt文件,最终都会保存在/dev/ memblock设备里面 cd /; umount

3.3K60

Linux系统驱动之LCD驱动程序框架_使用设备

资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 编程_LCD驱动程序框架_使用设备树 参考资料,GIT仓库里: 基于这个程序修改: IMX6ULL\source\03_LCD\03_lcd_drv_qemu_ok STM32MP157...\source\A7\03_LCD\03_lcd_drv_qemu_ok 参考:内核自带的示例驱动程序 Linux驱动源码:drivers/video/fbdev/simplefb.c 设备树:...说明 Linux驱动程序 = 驱动程序框架 + 硬件编程。 在前面已经基于QEMU编写了LCD驱动程序,对LCD驱动程序的框架已经分析清楚。...核心就是: 分配fb_info 设置fb_info 注册fb_info 硬件相关的设置 本节课程我们基于设备树来编写驱动程序。 2. 入口函数注册platform_driver 3.

2.4K30

设备驱动初探

前言 研究IO也很久了,一直无法串联bio和设备驱动,只知道bio经过IO调度算法传递到设备驱动,怎么过去的,IO调度算法在哪里发挥作用,一直没有完全搞明白,查看了很多资料,终于对设备驱动有所理解...一、传统设备 我们先来实现一个基于内存的传统设备驱动。...1.5.3 bio-设备 通过make_request_fn和request_fn,我们将bio和设备驱动串联起来了。 而且IO调度算法会在这两个函数发挥作用。 ?...上面写的基于内存的设备不就是一个超高速设备嘛,我们能不能写一个没有中间商的驱动 2.1 simp_blkdev_init 我们需要重写一下init代码,不调用blk_init_queue。...代码参考 写一个设备驱动.pdf 资料参考 《Linux内核设计与实现》 《Linux内核完全注释》 Linux.Generic.Block.Layer.pdf https://zhuanlan.zhihu.com

2K40

Linux设备驱动程序(二)——建立和运行模块

2、内核的并发 常见引起并发原因: linux 系统中通常正在运行多个并发进程,并且可能有多个进程同时使用我们的驱动程序。...大多数设备能够中断处理器,而中断处理程序异步运行,而且可能在驱动程序正试图处理其他任务时被调用。 linux 可以运行在多处理器上,因此可能同时有多个处理器在使用该进程。...用户内存是可交换的,不象内核内存,一个不常使用的却有很大一个驱动设备不会占据别的程序可以用到的 RAM,除了在它实际在用时。...一个精心设计的驱动程序仍然可以,如同内核空间驱动,允许对设备的并行存取。 如果你必须编写一个封闭源码的驱动,用户空间的选项使你容易避免不明朗的许可的情况和改变的内核接口带来的问题。...最重要的设备不能在用户空间处理,包括但不限于网络接口和设备。 十、快速参考 insmod modprobe rmmod 用户空间工具,加载模块到运行中的内核以及去除它们。

51541

linux设备驱动程序注冊过程具体解释

Linux驱动程序注冊过程,大致分为两个步骤: 模块初始化 驱动程序注冊 以下以内核提供的演示样例代码pci-skeleton.c,具体说明一个pci设备驱动程序的注冊过程。...在介绍注冊函数之前,必需要具体说明下linux的总线设备驱动模型,否则以下的内容非常难描写叙述清楚。...2.1 linux总线设备驱动模型 关于总线设备驱动模型,非常多书上都有具体的解说,可是都非常抽象,非常难理解(至少我是这样觉得的)。以下我尽量用最简单的方法来说明相关内容。...当一个struct device诞生,总线就会去driver链表找设备相应的驱动程序。假设找到就运行设备驱动程序,否则就等待。反之亦然。...当驱动匹配到了相应的设备之后,就会调用该函数来驱动设备。所以能够说这个函数才是驱动程序真正的入口。 remove:当驱动程序相应的设备被删除之后,使用这个函数来删除驱动程序

2.2K20

Linux设备驱动程序(五)——并发和竞态

内核代码是可抢占的;因此,我们的驱动程序代码可能在任何时候丢失对处理器的独占,而拥有处理器的进程可能正在调用我们的驱动程序代码。设备中断是异步事件,也会导致代码的并发执行。...在我们的示例驱动程序中,所有的信息都包含在 scull_dev 结构中,因此该结构就是我们锁定机构的逻辑范围。...在驱动程序中使用 rwsem 的机会相对较少,但偶尔也比较有用。 使用 rwsem 的代码必须包括 。...循环缓冲区的使用在设备驱动程序中相当普遍。特别是网络适配器,经常使用循环缓冲区和处理器交换数据(数据包)。 2、原子变量 有时,共享的资源可能恰好是一个简单的整数值。...假定我们的驱动程序维护着一个共享变量 n_op,该变量的值表明有多少个设备操作正在并发地执行。通常,即使下面的简单操作也需要锁定: n_op++; 完整的锁机制对一个简单的整数来讲却显得有些浪费。

23631

Linux驱动开发_设备驱动开发(内存模拟存储)

一、前言 设备驱动Linux下3大设备驱动框架之一,设备主要是针对存储类型的设备设计的驱动,配合文件系统完成数据存储。...所以大致总结下:设备驱动的目的是给Linux文件系统提供底层接口。 二、编写设备驱动的思路 既然学到了驱动开发,了解到设备开发。.../dev/sdb1 /dev/sdb2 (2)在设备驱动里可以设置最大支持的分区数量 设备处理数据的方式 下面是设备驱动的数据结构: 设备注册与注销函数 1....没有依赖于硬件,所以:可以在任何Linux下编译安装测试,完成块设备驱动的了解学习。...看懂设备框架,使用的模拟的内存。 2.​ 加入SD卡的驱动,配合设备框架,完成完整的设备驱动编写。

4.5K30

PCI设备驱动程序「建议收藏」

众所周知,Linux 2.6内核引入了总线驱动模型这一概念,如此,很多基于总线的设备驱动就分成了总线驱动设备驱动两部分。...当你加载PCI驱动的时候,驱动程序会把系统中已经存在的设备的厂商号和设备号与驱动程序中的对比,如果一致,则会注册PCI总线驱动并进行下一步操作。...下面是我写的一个PCI总线的驱动程序,注意是PCI设备识别时的驱动程序,这里并没有实现具体的功能驱动。...PCI设备驱动分成两个部分,一部分是总线的,就是PCI设备识别、调用驱动程序probe函数的部分,另一部分就是具体的功能驱动,比如网卡。...基于PCI总线的设备有很多种,但就PCI总线驱动这一来说,都大同小异,实现了PCI总线驱动之后,再去继续做具体的设备驱动

2K21

字符设备驱动程序接口

# 创建设备文件 # 格式(c表示字符设备驱动、b表示设备驱动): mknod /dev/xxx c或者b major minor 查看设备文件信息 ls -l /dev/xxx 最简单的模块...字符设备驱动老接口 register_chrdev 向内核注册字符设备驱动 /* linux/fs.h */ static inline int register_chrdev(unsigned int...返回值:成功返回主设备号, 失败返回一个负值 内核中有一个数组要来存储注册的字符设备驱动,register_chrdev注册的字符设备驱动的信息主要就存在这个数组的相应位置,该数组的下标就是主设备号,...可以通过查看/proc/devices文件来确定已经注册了 的字符设备驱动设备驱动以及相应的编号 cat /proc/devices unregister_chrdev 从内核卸载字符设备驱动 /*...(主次) count: 请求注册的连续设备的数量 返回值:成功返回0, 失败返回负值 cdev_del 注销字符设备驱动,并释放用cdev_alloc分配的内存 /* linux/cdev.h */ void

1.4K30
领券