精华内容
下载资源
问答
  • 字符设备、块设备、网络设备

    千次阅读 2017-08-25 10:48:33
    字符设备、块设备、网络设备设备模型设备驱动的代码量占内核程序的50%设备模型的意义: 为了降低设备多样性带来的Linux驱动开发的复杂度,以及设备热拔插处理、电源管理等,Linux内核提出了设备模型(也称作Driver ...

    字符设备、块设备、网络设备

    这里写图片描述

    设备模型

    设备驱动的代码量占内核程序的50%

    设备模型的意义:
    为了降低设备多样性带来的Linux驱动开发的复杂度,以及设备热拔插处理、电源管理等,Linux内核提出了设备模型(也称作Driver Model)的概念。设备模型将硬件设备归纳、分类,然后抽象出一套标准的数据结构和接口。驱动的开发,就简化为对内核所规定的数据结构的填充和实现。

    因为硬件设备多种多样,使得设备驱动程序繁多,设备模型将硬件设备分类,抽象出一套标准的数据结构和接口。

    一、字符设备

    1.特点

    一个字节一个字节读写的设备,
    读取数据需要按照先后数据(顺序读取
    常见的字符设备有鼠标、键盘、串口、控制台和LED设备
    每个字符设备在/dev目录下对应一个设备文件,linux用户程序通过设备文件(或称设备节点)来使用驱动程序操作字符设备。

    2.上层应用如何调用底层驱动?

    1.应用层的程序open(“/dev/xxx”,mode,flags)打开设备文件,进入内核中,即虚拟文件系统中。
    2.VFS层的设备文件有对应的struct inode,其中包含该设备对应的设备号,设备类型,返回的设备的结构体。
    3.在驱动层中,根据设备类型和设备号就可以找到对应的设备驱动的结构体,用i_cdev保存。该结构体中有很重要的一个操作函数接口file_operations。
    4.在打开设备文件时,会分配一个struct file,将操作函数接口的地址保存在该结构体中。
    5.VFS层 向应用层返回一个fd,fd是和struct file相对应,这样,应用层可以通过fd调用操作函数,即通过驱动层调用硬件设备了。

    这里写图片描述
    这里写图片描述

    二、块设备

    1.特点

    数据以固定长度进行传输,比如512K
    从设备的任意位置(可跳)读取,但实际上,块设备会读一定长度的内容,而只返回用户要求访问的内容,所以随机访问实际上还是读了全部内容。
    块设备包括硬盘、磁盘、U盘和SD卡
    每个块设备在/dev目录下对应一个设备文件,linux用户程序通过设备文件(或称设备节点)来使用驱动程序操作块设备。
    块设备可以容纳文件系统,比如磁盘

    三、网络设备

    1.特点

    面向报文而不是面向流的,因此将网络接口映射到文件系统的节点比较困难
    内核调用一套和数据包相关的函数,而不是read,write。
    网络接口没有像字符设备和块设备一样的设备号,只有唯一的名字,如eth0,eth1
    主要通过socket操作,打开通常用命令行,

    2.关系

    网络协议接口层:网络层,IP
    网络设备接口层:将协议和各种网络驱动连接在一起,这一层提供一组通用函数供底层网络设备驱动使用。
    网络驱动接口层:数据链路层,提供对物理层访问的设备驱动程序,这可以是各种介质,例如串口链路或以太网设备。包括LLC和MAC层
    物理层:PHY层
    这里写图片描述

    展开全文
  • Linux块设备驱动之内存模拟块设备

    千次阅读 2015-10-06 15:44:04
    今天我们开始接触块设备驱动程序了,一下程序的各个模块我讲的很详细,想头文件这些我没有加上来,因为不同 内核版本头文件有可能不一样,驱动的程序的狂街我在下面写出来了,希望给大家带来帮助。   用内存代替...
    
    用内存代替块设备的总结,相对来简单得多,对内存操作想必大家都很熟悉,直接分配一块内存就可以直接读写操作了
    /* 参考:
     * drivers\block\xd.c
     * drivers\block\z2ram.c
     */
    #define RAMBLOCK_SIZE (1024*1024)//一个扇区是512字节
     
    static struct gendisk *ramblock_disk;
    static struct request_queue *ramblock_queue;
    static DEFINE_SPINLOCK(ramblock_lock);//定义一个自旋锁
    static unsigned char *ramblock_buf;

    static struct block_device_operations ramblock_fops = {//fops结构体,必须要。
    .owner = THIS_MODULE,
    .getgeo = ramblock_getgeo,//设置heads /cylinders/sectors
    };

    static int ramblock_getgeo(struct block_device *bdev, struct hd_geometry *geo)
    {
    /* 容量=heads*cylinders*sectors*512 */
    geo->heads     = 2;//柱头
    geo->cylinders = 32;//柱面
    geo->sectors   = RAMBLOCK_SIZE/2/32/512;//扇区
    return 0;
    }
    static int ramblock_init(void)
    {
    /* 1. 分配一个gendisk结构体 */
    ramblock_disk = alloc_disk(16); /* 次设备号个数: 分区个数+1 */
    /* 2. 设置 */
    /* 2.1 分配/设置队列: 提供读写能力 */
    ramblock_queue = blk_init_queue(do_ramblock_request, &ramblock_lock);//do_ramblock_request请求队列函数
    ramblock_disk->queue = ramblock_queue;
    /* 2.2 设置其他属性: 比如容量 */
    major = register_blkdev(0, "ramblock");  /* cat /proc/devices */
    ramblock_disk->major       = major;
    ramblock_disk->first_minor = 0;
    sprintf(ramblock_disk->disk_name, "ramblock");//把ramblock打印到ramblock_disk->disk_name
    ramblock_disk->fops        = &ramblock_fops;
    set_capacity(ramblock_disk, RAMBLOCK_SIZE / 512);//设置容量
    . 硬件相关操作 */
    ramblock_buf = kzalloc(RAMBLOCK_SIZE, GFP_KERNEL);//分配一个读写缓冲区
    /* 4. 注册 */
    add_disk(ramblock_disk);
    }

    static void do_ramblock_request(struct request_queue * q)//当读写的时候调用这个函数
    {
    static int r_cnt = 0;
    static int w_cnt = 0;
    struct request *req;

    //printk("do_ramblock_request %d\n", ++cnt);

    while ((req = elv_next_request(q)) != NULL) {
    /* 数据传输三要素: 源,目的,长度 */
    /* 源/目的: */
    unsigned long offset = req->sector * 512;//偏移值为

    /* 目的/源: */
    // req->buffer

    /* 长度: */
    unsigned long len = req->current_nr_sectors * 512;

    if (rq_data_dir(req) == READ)
    {
    //printk("do_ramblock_request read %d\n", ++r_cnt);
    memcpy(req->buffer, ramblock_buf+offset, len);
    }
    else
    {
    //printk("do_ramblock_request write %d\n", ++w_cnt);
    memcpy(ramblock_buf+offset, req->buffer, len);
    }
    end_request(req, 1);//表示读写完成,必须写,不然会卡在那里,只有重新开关机
    }
    }
    }

    static void ramblock_exit(void)
    {
    unregister_blkdev(major, "ramblock");
    del_gendisk(ramblock_disk);
    put_disk(ramblock_disk);
    blk_cleanup_queue(ramblock_queue);
    kfree(ramblock_buf);
    }

    测试如下:
    在开发板上:
    1. insmod ramblock.ko
    2. 格式化: mkdosfs /dev/ramblock
    3. 挂接: mount /dev/ramblock /tmp/
    4. 读写文件: cd /tmp, 在里面vi文件
    5. cd /; umount /tmp/
    6. cat /dev/ramblock > /mnt/ramblock.bin
    7. 在PC上查看ramblock.bin
       sudo mount -o loop ramblock.bin /mnt

    测试5th:
    1. insmod ramblock.ko
    2. ls /dev/ramblock*
    3. fdisk /dev/ramblock
    块设备常用的几个命令:
    m:寻求帮助  n:增加一个新的分区  w:保存分区
    展开全文
  • Ceph块设备

    千次阅读 2015-12-10 21:50:28
    由于块设备接口的广泛性,使用一个虚拟机快设备是对于Ceph来说是一个非常理想的交互方式。 Ceph块设备是精简配置、可调整大小、条带化在多个OSDs存储数据。Ceph块设备有RADOS特性,例如快照、复制、一致性。

    CEPH BLOCK DEVICE

    一个快是一个顺序的字节(例如,一个512字节块数据)。传统的旋转式存储(例如硬盘、CDs、软盘甚至是)基于块存储是磁带)大多数提供块存储。由于块设备接口的广泛性,使用一个虚拟机快设备是对于Ceph来说是一个非常理想的交互方式。

    Ceph块设备是精简配置、可调整大小、条带化在多个OSDs存储数据。Ceph块设备有RADOS特性,例如快照、复制、一致性。Ceph RADOS Block Device(RBD)通过linux内核或者librbd库与OSDs进行交互。

    Note

     内核模块可以使用Linux页面缓存(page cahing)。对于基于librdb的应用,Cepg支持RBD缓存。

    Ceph块设备可以在无限扩展的基础上为内核模块、KVMs(例如Qemu)、基于libvirt的云计算系统(例如OpenStack或者CloudStack)和Qemu提供高性能块存储。你可以使用同一个集群提供Ceph RADOS GateWay,Ceph文件系统和Ceph 块存储。

    Important

     为了获取Ceph块设备,你必须连接到一个正在运行的集群。
    展开全文
  • 字符设备与块设备的区别

    千次阅读 2019-06-18 13:46:31
    字符设备与块设备的区别 字符设备与块设备的区别 在LINUX里面,设备类型分为:字符设备、块设备以及网络设备,PCI是一种和ISA为一类的总线结构,归属于网络驱动设备~~~ 字符设备、块设备主要区别是:在对字符设备...

    字符设备与块设备的区别

    字符设备与块设备的区别  

    在LINUX里面,设备类型分为:字符设备、块设备以及网络设备, PCI是一种和ISA为一类的总线结构,归属于网络驱动设备~~~ 

     字符设备、块设备主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,而块设备则不然,它利用一块系统内存作为缓冲区,当用户进程对设备请求能满足用户的要求时,就返回请求的数据,如果不能就调用请求函数来进行实际的I/O操作,因此,块设备主要是针对磁盘等慢速设备设计的,以免消耗过多的CPU时间来等待~~~

     

    系统中能够随机(不需要按顺序)访问固定大小数据片(chunks)的设备被称作块设备,这些数据片就称作块。最常见的块设备是硬盘,除此以外,还有软盘驱动器、CD-ROM驱动器和闪存等等许多其他块设备。注意,它们都是以安装文件系统的方式使用的——这也是块设备的一般访问方式。

     

      另一种基本的设备类型是字符设备。字符设备按照字符流的方式被有序访问,像串口和键盘就都属于字符设备。如果一个硬件设备是以字符流的方式被访问的话,那就应该将它归于字符设备;反过来,如果一个设备是随机(无序的)访问的,那么它就属于块设备。

     

         这两种类型的设备的根本区别在于它们是否可以被随机访问——换句话说就是,能否在访问设备时随意地从一个位置跳转到另一个位置。举个例子,键盘这种设备提供的就是一个数据流,当你敲入"fox" 这个字符串时,键盘驱动程序会按照和输入完全相同的顺序返回这个由三个字符组成的数据流。如果让键盘驱动程序打乱顺序来读字符串,或读取其他字符,都是没有意义的。所以键盘就是一种典型的字符设备,它提供的就是用户从键盘输入的字符流。对键盘进行读操作会得到一个字符流,首先是"f",然后是"o",最后是"x",最终是文件的结束(EOF)。当没人敲键盘时,字符流就是空的。硬盘设备的情况就不大一样了。硬盘设备的驱动可能要求读取磁盘上任意块的内容,然后又转去读取别的块的内容,而被读取的块在磁盘上位置不一定要连续,所以说硬盘可以被随机访问,而不是以流的方式被访问,显然它是一个块设备。

     

      内核管理块设备要比管理字符设备细致得多,需要考虑的问题和完成的工作相比字符设备来说要复杂许多。这是因为字符设备仅仅需要控制一个位置—当前位置—而块设备访问的位置必须能够在介质的不同区间前后移动。所以事实上内核不必提供一个专门的子系统来管理字符设备,但是对块设备的管理却必须要有一个专门的提供服务的子系统。不仅仅是因为块设备的复杂性远远高于字符设备,更重要的原因是块设备对执行性能的要求很高;对硬盘每多一分利用都会对整个系统的性能带来提升,其效果要远远比键盘吞吐速度成倍的提高大得多。另外,我们将会看到,块设备的复杂性会为这种优化留下很大的施展空间。

     

      块设备通过系统缓存进行读取,不是直接和物理磁盘读取字符设备可以直接物理磁盘读取,不经过系统缓存。(如键盘,直接相应中断)

     

    字符设备是裸设备 通过查看 ll /dev/vg00/ 下的内容 若开头带c字符的则为字符设备

    块设备是文件设备 通过查看 ll /dev/vg00/ 下的内容 若开头带b字符的则为块符设备

     

    在使用上,只要在对数据库方面的应用需要考虑是选择块设备还是字符设备。一般数据库厂商会建议你建库时使用裸设备(字符设备),空间管理完全由数据库引擎进行管理,这样所有数据和日志直接写盘,当发生系统故障时,不至于丢失数据。但还有一种说法是使用块设备便于管理维护人员的系统管理,因为使用裸设备在第一次分配出去之后,这个设备的空间就不能做任何其他用途了,但块设备则不然,你想使用多少空间就分配多少,你可以进行自由的扩展,而无需一次性的全部分配出去。所以我建议在创建数据库master库使用裸设备,而业务数据库及tempdb则使用块设备。

     

    展开全文
  • Linux中块设备和字符设备的区别

    千次阅读 2014-09-06 09:21:19
    系统中能够随机(不需要按顺序)访问固定大小数据片(chunks)的设备被称作块设备,这些数据片就称作块。最常见的块设备是硬盘,除此以外,还有软盘驱动器、CD-ROM驱动器和闪存等等许多其他块设备。注意,它们都是以...
  • linux块设备

    千次阅读 2018-05-31 01:00:56
    来自:https://www.cnblogs.com/xuyh/p/5333086.htmlhttp://www.cnblogs.com/xuyh/p/5333191.htmlhttp://www.cnblogs.com/xuyh/p/5340026.html 一: 块设备概念: 一种具有一定结构的随机存取设备,对这种设备的...
  • Linux内核块设备总结(一)

    千次阅读 2019-03-07 18:41:27
    在分析块设备驱动之前,整体规划如下: 1. 介绍qemu使Linux内核挂载块设备。 2. 介绍块设备驱动挂载过程。 3. 介绍块设备驱动运行过程。
  • Linux块设备驱动总结

    千次阅读 2016-03-26 08:36:06
    《Linux设备驱动程序》第十六章 块设备驱动程序读书笔记 简介 一个块设备驱动程序主要通过传输固定大小的随机数据来访问设备 Linux内核视块设备为与字符设备相异的基本设备类型 Linux块设备驱动程序接口使得...
  • Linux块设备驱动

    千次阅读 2013-03-26 19:05:41
    一、块设备驱动之概念和框架 1.基本概念 块设备(blockdevice) --- 是一种具有一定结构的随机存取设备,对这种设备的读写是按块进行的,他使用缓冲区来存放暂时的数据,待条件成熟后,从缓存一次性写入...
  • 块设备文件

    千次阅读 2014-03-10 14:08:10
    linux 操作系统秉承“一切都是...理解块设备文件,关键有两方面,一,从外部表现看,他是属于某个外部文件系统上的一个文件,通常将他们存放在/dev目录下,用户像常规文件一样通过文件名对他们进行访问;二,从内部实现
  • 块设备读写流程

    千次阅读 2014-03-10 15:58:08
    在学习块设备原理的时候,我最关系块设备的数据流程,从应用程序调用Read或者Write开始,数据在内核中到底是如何流通、处理的呢?然后又如何抵达具体的物理设备的呢?下面对一个带Cache功能的块设备数据流程进行分析...
  • 块设备驱动架构分析

    千次阅读 2016-06-06 22:34:12
    1. 块设备概念:块设备是指只能以块为单位进行访问的设备,块的大小一般是512个字节的整数倍。常见的块设备包括硬件,SD卡,光盘等。 2. 块设备驱动的系统架构 2.1 系统架构---VFS VFS是对各种具体文件系统的一种...
  • 什么是块设备,什么是字符设备?有什么区别? 系统中能够随机(不需要按顺序)访问固定大小数据片(chunks)的设备被称作块设备,这些数据片就称作块。最常见的块设备是硬盘,除此以外,还有软盘驱动器、CD-...
  • 字符设备(裸设备)和块设备的区别

    千次阅读 2013-05-29 17:04:02
    Character Device Drive被称作字符设备或者裸设备(raw devices),Block Device Drive通常称为块设备。/dev/disk对应的为块设备,文件系统操作用到它,如mount ,/dev/rdisk对应的为字符设备(裸设备,rdi
  • linux驱动由浅入深系列:块设备驱动之一(高通eMMC分区实例)linux驱动由浅入深系列:块设备驱动之二(从用户空间的read、write到实际设备物理操作整体架构分析)linux驱动由浅入深系列:块设备驱动之三(块设备驱动...
  • Linux块设备总结(二)

    千次阅读 2019-03-07 22:44:04
    上一篇博客中《Linux内核块设备总结(一)》[link][https://blog.csdn.net/weixin_37867857/article/details/88316757]介绍了从qemu中启动增加块设备的方法。最后一步gdb调试中提及了blkdev_open函数的系统调用,...
  • 字符设备和块设备的区别

    千次阅读 2010-11-15 15:59:00
    系统中能够随机(不需要按顺序)访问固定大小数据片(chunks)的设备被称作块设备,这些数据片就称作块。最常 见的块设备是硬盘,除此以外,还有软盘驱动器、CD-ROM驱动器和闪存等等许多其他块设备。注意,它们都是...
  • 块设备驱动程序之一

    千次阅读 2014-02-10 23:41:00
    一、块设备概述 linux支持的两种重要的设备类型分别是字符设备和块设备块设备可以随机地以固定大小的块传送数据。与字符设备相比,块设备有以下几个特殊之处: 块设备可以从数据的任何位置进行访问块数据总是以...
  • 进一步理解Linux操作系统的块设备

    千次阅读 2019-06-21 11:06:08
    在前文《理解Linux操作系统的块设备》中我们从比较高层面(Hight Level)介绍了块设备的原理和块设备的特性。但是关于Linux操作系统块设备的实现原理可能还一知半解。本文将进一步深入的分析Linux的块设备,期望能让...
  • linux 字符设备和块设备的区别

    千次阅读 2018-07-15 12:04:44
    Linux中I/O设备分为两类:字符设备和块设备。两种设备本身没有严格限制,但是,基于不同的功能进行了分类。(1)字符设备:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节/...
  • 在Linux操作系统下有3类主要的设备文件类型:块设备、字符设备和网络设备。这种分类方法可以将控制输入/输出设备的驱动程序与其他操作系统软件分离开来。字符设备是指存取时没有缓存的设备。典型的字符设备包括鼠标...
  • ... 块设备剖析之块设备注册 - add_disk()函数解析 2015-07-07 23:08:45 分类: LINUX 本文所有内容基于内核版本Linux-v3.2.40。  add_disk()是块设备注册的内核接
  • 块设备驱动程序概念介绍

    千次阅读 2016-10-06 17:35:34
    系统中能够随机访问都顶大小数据片的设备被称作块设备,这些数据片就称作块。最常见的块设备事硬盘。注意,它们都是以安装文件系统的方式使用的——这也是块设备通常的访问方式。  另一种基本的设备类型是字符设备...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 526,568
精华内容 210,627
关键字:

属于块设备的是