展开

关键词

首页关键词linux 设备驱动之块设备

linux 设备驱动之块设备

相关内容

  • 块设备驱动初探

    前言研究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.comc
    来自:
    浏览:193
  • 23.Linux-块设备驱动(详解)

    通过上节的块设备驱动分析,本节便通过内存来模拟块设备驱动 ,方便我们更加熟悉块设备驱动框架参考内核自带的块设备驱动程序:driversblock xd.c  driversblock z2ram.c  ; 起始次设备号,等于0,则表示此设备号从0开始的 int minors; 分区(次设备)数量,当使用alloc_disk()时,就会自动设置该成员 char disk_name; 块设备名称, 等于register_blkdev,当major==0时,表示动态创建,创建成功会返回一个主设备号unregister_blkdev(unsigned int major, const char *name);卸载一个块设备, 在出口函数中使用mkdosfs devmemblock 将memblock块设备格式化为dos磁盘类型 mount dev memblock tmp 挂载块设备到tmp目录下接下来在tmp目录下vi 1.txt文件,目录下创建.bin文件,然后将块设备里面的文件追加到.bin里面然后进入linux的nfs挂载目录中sudo mount -o loop ramblock.bin mnt 挂载ramblock.bin,
    来自:
    浏览:1033
  • 22.Linux-块设备驱动之框架详细分析(详解)

    本节目的:    通过分析块设备驱动的框架,知道如何来写驱动1.之前我们学的都是字符设备驱动,先来回忆一下字符设备驱动:当我们的应用层读写(read()write())字符设备驱动时,是按字节字符来读写数据的,期间没有任何缓存区,因为数据量小,不能随机读取数据,例如:按键、LED、鼠标、键盘等2.接下来本节开始学习块设备驱动块设备: 块设备是io设备中的一类, 当我们的应用层对该设备读写时,是按扇区大小来读写数据的是Linux内存管理机制中一个内存页或者内存页的一部分。块  (Blocks):   由Linux制定对内核或文件系统等数据处理的基本单位。通常由1个或多个扇区组成。(对Linux操作系统而言)扇区(Sectors):块设备的基本单位。gendisk结构体设置gendisk结构体的成员注册gendisk结构体未完待续~ ~下节便开始写块设备驱动程序
    来自:
    浏览:979
  • 广告
    关闭

    腾讯云+社区「校园大使」招募开启!报名拿offer啦~

    我们等你来!

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

    很明显,根据设备的接口,我们可以知道分为usb设备,串口设备,pci设备,spi设备,i2c设备等等,那么在linux内核中又有样的划分呢?下面所述就是linux中对所有设备的一个分类,并描述了相互之间的简单区别。linux中设备和模块的分类:字符设备:字符设备是能够像字节流(类似文件)一样被访问的设备,有字符设备驱动程序来实现这种特性。linux可以让应用程序向字符设备一样读写块设备,允许一次传递任意多字节的数据。因而,块设备和字符设备的区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口,而这些不同对用户来讲是透明的。在内核中,和字符驱动程序相比,块驱动程序具有完全不同的接口。Linux下的磁盘设备都是块设备,尽管在Linux下有块设备节点,但应用程序一般是通过文件系统及其高速缓存来访问块设备的,而不是直接通过设备节点来读写块设备上的数据。
    来自:
    浏览:1190
  • linux字符设备驱动基本框架

    对于Linux的驱动程序,需要遵循一定的框架结构。嵌入式Linux的学习其实并不难,只要深入理解Linux的框架,写起来也可以得心应手。2.驱动程序的框架在理解设备框架之前,首先要知道驱动程序主要做了以下几件事1.将此内核驱动模块加载到内核中2.从内核中将驱动模块卸载3.声明遵循的开源协议2.1 Linux下的设备Linux下分成三大类设备字符设备与块设备驱动程序的区别与联系1.字符设备的最小访问单元是字节,块设备是块字节512或者512字节为单位2.访问顺序上面,字符设备是顺序访问的,而块设备是随机访问的3.在linux中,字符设备和块设备访问字节没有本质区别网络设备驱动程序的本质提供了协议与设备驱动通信的通用接口块设备驱动程序就是可以随机访问的缓冲区。作为Linux特有的抽象方式,将所有的硬件抽象成文件的读写。(2)设备类型字符设备、块设备、网络设备(3)设备文件、主设备号、从设备号 有了设备类型的划分,还需要进行进一步明确。
    来自:
    浏览:1693
  • Linux设备驱动模型-Bus

    前言在linux设备驱动模型中,总线可以看作是linux设备模型的核心,系统中的其他设备以及驱动都是以总线为核心围绕。不过驱动程序员在系统中创建一条总线的机会并不多。为此linux设备驱动模型都将围绕总线--设备--驱动来展开,因为符合linux设备驱动模型的设备与驱动都是必须挂载在一个总线上的,无论是实际存在的或者虚拟的。dev_attrs: 此bus设备上默认的属性。.bus_groups, dev_groups, drv_groups: 分别是总线, 设备,驱动的属性。.match: 当一个设备或者驱动添加到此总线上的时候,bus就会调用match对设备和驱动一一匹配的。.p: 一个用来管理总线上设备与驱动的数据结构。
    来自:
    浏览:533
  • Linux设备驱动模型-Device

    前言Linux将所有的设备统一抽象为struct device结构, 同时将所有的驱动统一抽象为struct device_driver结构。这样设计之后就方便驱动开发工程师编写驱动,只需要将具体的设备包含struct device结构,具体的驱动包含struct device_driver结构。数据结构Linux将所有的设备统一抽象为struct device结构。driver: 设备所对应的驱动。platfrorm_data: 设备所对应的平台数据。driver_data: 保存设备所对于驱动的数据,一般使用getset函数。,最终会调用到设备的show和store函数中,具体的流程分析可见Linux设备驱动模型-Ktype static ssize_t dev_attr_show(struct kobject *kobj,
    来自:
    浏览:615
  • Linux设备驱动模型-Driver

    前言linux将所有的驱动抽象为struct device_driver结构。这样设计可以方便驱动程序更好编写,在编写驱动的时候只需要将此结构嵌入到具体的驱动中即可。bus: 设备驱动所属的总线owner: 设备驱动的owner,通常为THIS_MODULEsuppress_bind_attrs: 通过sysfs操作设备驱动的bindunbind,用来使能关闭设备与驱动的自动匹配probe,remove: 当设备匹配移除的时候,会调用设备驱动的proberemove函数。shutdown,suspend, resume: 代表设备驱动在调用管理的时候的回调函数。groups: 设备驱动的属性。p: 设备驱动的私有数据结构,通常可以将驱动的信息放入此结构中。和设备一样,内核也为设备驱动定义了一些驱动的宏属性,方便定义驱动属性。
    来自:
    浏览:474
  • Linux笔记(13)| 字符设备驱动基础入门

    好了,言归正传,今天要分享的是linux驱动中的字符设备驱动,我们知道,对于嵌入式linux开发来说,主要是分为应用开发和驱动开发,在前面的文章当中,都是在介绍应用开发,因为应用开发相对来说难度更低一些前面的讲的应用开发虽然不是特别深(以后会慢慢加深),但是大致覆盖了涉及到的内容,还有一个线程没有讲,这个到后面再补充,从今天开始就正式进入驱动开发,linux驱动有字符设备驱动、块设备驱动和网络设备驱动1、准备工作 首先要准备linux内核源码,因为驱动模块的安装必须是在自己的系统上编译得到的内核源码树。2、了解驱动模块的代码结构和安装、卸载 驱动模块是以.ko为后缀的文件,驱动代码编译好之后就会得到.ko文件,然后使用命令insmod,就可以安装到linux系统中,使用rmmod命令就可以卸载模块,此外今天以驱动led为例,所以主要是实现write功能。 这里还要先明确一个概念就是,在linux系统中有一个哲学思想,就是一切皆文件。
    来自:
    浏览:203
  • Linux 总线、设备、驱动模型的探究

    设备驱动模型的需求总线、设备和驱动模型,如果把它们之间的关系比喻成生活中的例子是比较容易理解的。没错,Linux 内核里就是运用了这种设计思想去对设备和驱动进行适配隔离的,只不过在内核里我们不叫做适配层,而取名为总线,意为通过这个总线去把驱动和对应的设备绑定一起,如图:?基于这种设计思想,Linux 把设备驱动分为了总线、设备和驱动三个实体,这三个实体在内核里的职责分别如下:?最底层是不同板子的板级文件代码,中间层是内核的总线,最上层是对应的驱动,现在描述板级的代码已经和驱动解耦了,这也是 Linux 设备驱动模型最早的实现机制,但随着时代的发展,就像是人类的贪婪促进了社会的进步一样完美的 Linux 怎么会允许这样的事情存在,于是乎,设备树(DTS)就登向了历史舞台,下一篇内容将探讨设备树的实现原理和用法。【部分内容整理于宋宝华老师课程】
    来自:
    浏览:1558
  • NBD-网络块设备

    1997年4月,Pavel Machek 写了他的网络块设备代码,并被当时的Linux Kernel 2.1.55接受。本文描述了网络块设备、驱动、以及它的开发历史。NBD的驱动程序提供了一种在这个面向网络的世界中更为普遍的访问模型。它在本地客户端模拟了一个块设备,比如一个磁盘或者是一块磁盘分区,但实际提供物理支持的却是通过网络连接的远程服务器。在本地,该设备看起来是一个磁盘分区,但那只是远程服务器的表面。本地操作系统必须是linux,而且要支持Linux内核NBD驱动,并且能够运行本地客户端进程。安装NBD可被用来进行远程存储和备份,而且能用来在地球的任意一个角落虚拟地传送物理设备。?在本地Linux上挂载一个EXT2文件系统到NBD,其传输率要比在同样的远程机器上挂载一个NFS快(表1是接近Pavel最初写的驱动代码的计时)。?
    来自:
    浏览:622
  • Linux设备驱动模型-Kobject

    Kobject是linux设备驱动模型的基础,也是设备模型中抽象的一部分。如果想了解设备驱动模型就需要明白Kobject的构成或原理。linux内核为了兼容各种形形色色的设备,就需要对各种设备的共性进行抽象,抽象出一个基类,其余的设备只需要继承此基类就可以了。而此基类就是kobject,但是C语言没有面向对象语法,这时候就需要将此基类(Kobject)嵌入到具体的结构体中,从而就可以访问控制此设备的操作。通常驱动程序员很少使用到kobject结构及其相关接口,而是使用封装之后的更高层的接口函数。Kobject结构体内核使用kobject来表示内核一个对象。init_name; * initial name of the device * const struct device_type *type;Kobject相关操作函数kobject相关的操作函数一般驱动程序员是不会直接操作的
    来自:
    浏览:335
  • I2C总线架构 之 设备驱动

    引言I2C设备驱动是I2C框架中最接近应用层的,其上接应用层,下接I2C核心。也是驱动开发人员需要实现的代码,在此驱动中我们只需负责以下步骤(以ap3216c为例):a. 添加硬件信息(设备树)b.搭建驱动框架c. 构建i2c_driver,并注册到linux i2c中d. 注册字符设备e. 向应用层提供i2c设备操作接口f. 注销i2c设备本篇文章会按照以上六个阶段展开解析。流程解析a.通过以上读写的实现,与上一篇文章 《I2C总线架构 之 I2C协议》 读写时序是对应的:(1) 写操作只需要一个msg结构体:起始位 + 写操作(msg) + 停止位。由于Linux内部的实现较为复杂,本篇主要以设备驱动的角度来分析整个驱动的代码走向,涉及到内部API的实现,本篇只大概介绍其功能,剩余部分会放在i2c核心继续分析。参考:《Linux设备驱动开发详解》《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.4》https:blog.csdn.netEgeanarticledetails81085077
    来自:
    浏览:199
  • 深入浅出:Linux设备驱动之异步通知和异步IO

    在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问。因此,使用无阻塞IO的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类似“中断”的异步通知所取代。1、异步通知的概念和作用影响:阻塞–应用程序无需轮询设备是否可以访问非阻塞–中断进行通知即:由驱动发起,主动通知应用程序2、linux异步通知编程2.1 linux信号作用:linux系统中,异步通知使用信号来实现函数原型为不过此项工作已由内核完成,设备驱动无须处理。(2)、支持F_SETFL命令处理,每当FASYNC标志改变时,驱动函数中的fasync()函数得以执行。因此,驱动中应该实现fasync()函数(3)、在设备资源中可获得,调用kill_fasync()函数激发相应的信号设备驱动中异步通知编程:(1)、fasync_struct加入设备结构体模板中(2)、块设备和网络设备:本身是异步的字符设备:必须明确应支持AIO(极少数是异步IO操作)字符设备驱动程序中file_operations 包含 3 个与 AIO 相关的成员函数,如下所示:ssize_t (
    来自:
    浏览:611
  • Linux音频驱动-PCM设备

    图1-1 声音的录音和播放过程数据结构在ALSA架构下,pcm也被称为设备,所谓的逻辑设备。在linux系统中使用snd_pcm结构表示一个pcm设备。linux系统中使用snd_pcm_str定义stream, 使用snd_pcm_substream定义substream。调用snd_kernel_minor函数获得设备的此设备号。该此设备号已经存在则返回BUSY,小于返回错误。4.应用到驱动的过程当应用程序在通过open系统调用打开devpcmC0D0c的过程1.if ((err = substream->ops->open(substream)) < 0) 至此,整个pcm设备创建,调用,以及应用到驱动整个流程分析完毕。:)
    来自:
    浏览:551
  • Linux内核的LED设备驱动框架【转】

    驱动框架的概念内核中驱动部分维护者针对每个种类的驱动设计一套成熟的、标准的、典型的驱动实现,并把不同厂家的同类硬件驱动中相同的部分抽出来自己实现好,再把不同部分留出接口给具体的驱动开发工程师来实现,这就叫驱动框架即标准化的驱动实现,统一管理系统资源,维护系统稳定。2. LED设备驱动框架概述(1)LED设备的共性:1)LED的亮与灭;2)具有相应的设备节点(设备文件)。因此,Linux中LED的驱动框架把所有LED设备的共性给实现了,把不同的地方留给驱动工程师去做。LED设备驱动框架分析3.1 创建leds类subsys_initcall是一个宏,它的功能是将其声明的函数放到一个特定的段:.initcall4.init。详见Linux设备管理:sysfs文件系统的功能及其应用。led_class_attrs结构体数组设置了leds设备类的属性,即led硬件操作的对象和方法。
    来自:
    浏览:312
  • Linux块设备驱动详解

    来自:
    浏览:121
  • Linux 设备和驱动的相遇

    一个开发板上一节的最后我们讲到设备树的三大作用,其最后一个作用也是最重要的作用:设备信息集合。这一节结合设备信息集合的详细讲解来认识一下设备和驱动是如何绑定的。我们看到一个开发板有很多的设备,这些设备是如何一层一层展开的呢?设备和驱动又是如何绑定的呢?我们带着这些疑问进入本节的主题。各级设备的展开内核启动的时候是一层一层展开地去寻找设备,设备树之所以叫设备树也是因为设备在内核中的结构就像树一样,从根部一层一层的向外展开,为了更形象的理解来看一张图:?第一节中讲了总线、设备和驱动模型的原理,即任何驱动都是通过对应的总线和设备发生联系的,故虽然 soc 内部没有具体的总线,但是内核通过 platform 这条虚拟总线,把控制器一个一个找到,一样遵循了内核高内聚下面我们按照 platform 设备、i2c 设备、spi 设备的顺序探究设备是如何一层一层展开的。
    来自:
    浏览:794
  • Linux笔记(14)| 字符设备驱动基础入门(续)

    3、Makefile的编写 前面讲完了最简单的驱动模块的代码结构,这里继续讲解Makefile文件的编写。编译好了之后就会生成一个.ko的驱动模块文件,我们就可以在linux系统中去安装这个模块,这在上一节已经提到过。4、验证驱动程序工作是否正常 安装好这个模块之后,如何验证这个驱动模块能否正常工作呢?在之前的驱动代码中,我们的代码逻辑就是当写入“on”的时候,点亮led灯,当写入“off”的时候,就关闭led灯。那么,到底是向哪里写入?这里涉及到设备文件的创建。在这个试验中,要验证驱动程序是否正常,应该向设备文件中写入值,方法有两种,一种是直接在终端里面通过echo指令,这样比较简单,还有一种方法就是编写一个应用程序,这种方法在实际中比较常用。
    来自:
    浏览:120
  • linux设备驱动第三篇:如何写一个简单的字符设备驱动

    在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动。本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存。下面就开始学习如何写一个简单的字符设备驱动。首先我们来分解一下字符设备驱动都有那些结构或者方法组成,也就是说实现一个可以使用的字符设备驱动我们必须做些什么工作。1、主设备号和次设备号对于字符设备的访问是通过文件系统中的设备名称进行的。tty0 crw-rw---- 1 root tty 4, 1 3月 25 10:34 tty1 crw--w---- 1 root tty 4, 10 3月 25 10:34 tty10 其中b代表块设备那么主设备号和次设备号分别代表什么意义呢?一般情况下,可以这样理解,主设备号标识设备对应的驱动程序,也就是说1个主设备号对应一个驱动程序。当然,现在也有多个驱动程序共享主设备号的情况。
    来自:
    浏览:804

扫码关注云+社区

领取腾讯云代金券