0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Linux的设备号的构成、分配、释放的详细解析

Q4MP_gh_c472c21 2018-01-24 08:42 次阅读

设备分为三大类:字符设备,块设备和网络设备。内核针对每一类设备都提供了对应驱动模型架构,包括基本的内核设施和文件系统接口

字符设备:在传送过程中以字符为单位,一个字Linux中设备驱动的分类

基于Linux的设备号的构成、分配、释放的详细

从上图可以看到Linux系统将各异的设备分为三大类:字符设备,块设备和网络设备。内核针对每一类设备都提供了对应驱动模型架构,包括基本的内核设施和文件系统接口。

字符设备:在传送过程中以字符为单位,一个字节一个字节的读写,不能随机的读写数据,因为这类设备读写速度比较缓慢(因而其内核设施中不提供缓存机制),常见的字符设备有键盘,鼠标已打印机设备等。

块设备:是指可以从任意位置读取数据的设备,对这种设备读写是按块为单位读写的。它使用缓存区来暂存数据,等待条件成熟后,会一并将数据写入到设备或者从设备一次性读出到缓冲区。比较U盘,磁盘,SD卡等。

网络设备:网络设备不同于字符设备和块设备,它是面向报文的。同时在/dev目录下没有设备节点这样一说,在应用层是用户是通过API的socket函数来使用网络设备的。比如网卡等。

设备号的构成

● 主设备号与次设备号

关于设备号,我们先通过如下的图来了解一下

基于Linux的设备号的构成、分配、释放的详细

从上图可以看出,c代表的是字符设备,d代码的是块设备。

对于红色区域来说,1是主设备号,11是次设备号。

对于绿色区域来说,7是主设备号,0-7代表是次设备号。

主设备号用来标识对于的设备驱动程序,而次设备号则由驱动程序使用,用来标识它所管理的若干同类设备。

●设备号的表示

在linux系统中,设备号用dev_t表示。这是个32位的无符号整数。

在内核中,dev_t的低20位用来表示次设备号,高12位用来表示主设备号。随着Linux系统的演变,上述的主次设备号的分发可能在将来会发生变化,所以设备驱动程序开发者应该避免直接使用主次设备号所占的位宽来获得对于的主设备号或次设备号。为了保证以后主次设备号所占的位数发生变化之后,驱动程序依然可以正常工作,内核提供了如下了几个宏来操作设备号。

基于Linux的设备号的构成、分配、释放的详细

其中MAJOR宏用来从一个dev_t类型的设备号中提取出主设备号,MINOR宏从来从一个dev_t类型的设备号中提取出此设备号。MKDEV则是将主设备号ma和次设备号mi合成一个dev_t类型的设备号。

假设在内核版本之后对主次设备号所占的位数发生了变化,MINORBITS修改为18位,只要驱动是使用MAJOR和MINOR宏来操作设备号,就不需要修改驱动代码也可以在新内核中使用。

设备号的分配

在内核源码中,设备号的分配主要有两个函数:

●静态分配设备号

基于Linux的设备号的构成、分配、释放的详细

该函数是用来在知道主设备号的前提下使用,第一个参数form表示一个设备号,第二个参数count表示次设备的个数,也就是当前驱动程序所管理的同类设备的个数,第三个参数name表示设备或者驱动的名称。成功返回0,失败返回负数。

比如内核代码中使用register_chrdev_region申请设备号示例:

以上代码申请了主设备号为13,总共存在1024个次设备,设备的名字为input。

●动态分配设备号

基于Linux的设备号的构成、分配、释放的详细

该函数有系统动态的分配设备号,是在主设备号不知情的情况下,让系统给分配设备号。第一个参数dev表示是输出参数,也就是设备号,第二个参数baseminor表示第一个次设备号编号,第三个参数count表示次设备号的个数,第四个参数name也就是设备或者驱动的名称。

内核中使用alloc_chrdev_region的示例:

基于Linux的设备号的构成、分配、释放的详细

上述示例代码是通过alloc_chrdev_region函数申请设备号,设备的个数为16个,设备的名称为rtc设备。

设备号释放

在驱动程序不使用的时候需要释放设备号,因为设备号也是系统的资源,不用的使用需要及时释放资源。已供其他设备使用。

基于Linux的设备号的构成、分配、释放的详细

使用该函数可以使用申请的设备号,第一个参数from表示要释放的设备号,第二个参数count表示要释放的个数。

内核使用unregister_chrdev_region的示例:

从上面代码可知,如果调用unregister_chrdev_region就会从系统中释放主设备号13的设备。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1331

    浏览量

    40038
  • Linux
    +关注

    关注

    87

    文章

    11092

    浏览量

    207630
  • 网络设备
    +关注

    关注

    0

    文章

    286

    浏览量

    29502

原文标题:Linux字符设备学习之设备号的构成、分配、释放

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    关于Linux内存管理的详细介绍

    Linux内存管理是指对系统内存的 分配释放、映射、管理、交换、压缩等一系列操作的管理。在 Linux中,内存被划分为多个区域,每个区域有不同的作用,包括内核空间、用户空间、缓存、交换分
    发表于03-06 09:28 1000次阅读

    如何在UbuntuLinux释放/boot分区中的空间

    在Ubuntu Linux上,/boot分区是用于存储启动相关的文件的。随着时间的推移,这个分区可能会变满,导致系统无法安装新的内核和更新。本文将介绍如何 释放/boot分区中的空间,并提供 详细的步骤。
    的头像 发表于11-28 10:04 617次阅读

    linux的内存释放操作

    Linux系统下,我们一般不需要去 释放内存,因为系统已经将内存管理的很好。但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空间影响性能,此时就需要执行 释放内存(清理缓存)的操作
    发表于07-26 07:05

    Linux内存系统:Linux内存分配算法

    ,便于内存管理,防止内存泄露· 缺点:大量的内存碎片会使系统缓慢,内存使用率低,浪费大2) 如何避免内存碎片· 少用动态内存 分配的函数(尽量使用栈空间)· 分配内存和 释放的内存尽量在同一个函数中
    发表于08-24 07:44

    Linux操作系统具体构成

    Linux操作系统为程序运行产生的进程 分配4G的虚拟空间。这4G有1G时内核空间不能使用,其余3G是我们可以使用的空间,其具体 构成如下:栈空间保存函数内部的局部变量和函数的形参,由操作系统
    发表于12-17 08:21

    LINUX内核中的内存是如何进行分配

    1、devm_kzalloc & devm_kfree函数devm_kzalloc和kzalloc一样都是内核内存 分配函数,但是devm_kzalloc是跟 设备(装置)有关的,当 设备
    发表于11-04 14:46

    LinuxMTD下获取Nand flash 各个参数的过程的详细解析

    LinuxMTD下获取Nand flash 各个参数的过程的 详细 解析
    发表于10-30 08:38 7次下载
    <b class='flag-5'>Linux</b> MTD下获取Nand flash 各个参数的过程的<b class='flag-5'>详细</b><b class='flag-5'>解析</b>

    嵌入式Linux设备和次设备的获取

    静态 分配 设备 ,就是驱动程序开发者,静态地指定一个 设备 。对于一部分常用的 设备,内核开发者已经为
    的头像 发表于05-23 17:18 6525次阅读
    嵌入式<b class='flag-5'>Linux</b>主<b class='flag-5'>设备</b><b class='flag-5'>号</b>和次<b class='flag-5'>设备</b><b class='flag-5'>号</b>的获取

    LinuxDMA Engine框架的介绍

    此会话描述如何从 设备驱动程序在 Linux中使用DMA。 这包括内存 分配,缓存控制和DMA 设备控制。 详细介绍了
    的头像 发表于11-23 06:29 6074次阅读

    学会linux驱动程序的步骤

    linux内核使用驱动时候,需要先初始化,包括建立 设备文件, 分配内存地址空间等,退出的时候要 释放资源,删除 设备文件,
    发表于04-26 16:19 1186次阅读

    LinuxDMA内置设备驱动程序的详细资料说明

    本文档的主要内容 详细介绍的是 LinuxDMA内置 设备驱动程序的 详细资料说明主要内容包括; 1.议程,2.内存 分配,3.内核配置,4.缓存控
    发表于04-12 08:00 1次下载
    <b class='flag-5'>Linux</b> DMA内置<b class='flag-5'>设备</b>驱动程序的<b class='flag-5'>详细</b>资料说明

    Linux内核之块分配

    为了解决小块内存的 分配问题, Linux内核提供了块 分配器,最早实现的块 分配器是SLAB 分配器。
    的头像 发表于07-27 09:35 1451次阅读

    Linux新字符设备驱动开发方式

    Linux字符 设备驱动开发模板中介绍了旧版本的驱动开发模板,其需要手动 分配 设备 后,再进行注册,驱动加载成功后还需要手动创建
    的头像 发表于04-14 12:02 748次阅读
    <b class='flag-5'>Linux</b>新字符<b class='flag-5'>设备</b>驱动开发方式

    虹科干货 | 多设备协同无忧:Linux环境下PCAN固定设备ID/通道分配指南

    插入顺序的影响。继往期文章介绍了Windows环境下的实现方法后,本文将 详细介绍如何在 Linux环境中CharDev和NetDev两种模式下,通过PCAN实现 设备ID和通道的固定 分配
    的头像 发表于06-11 15:03 270次阅读
    虹科干货 | 多<b class='flag-5'>设备</b>协同无忧:<b class='flag-5'>Linux</b>环境下PCAN固定<b class='flag-5'>设备</b>ID/通道<b class='flag-5'>分配</b>指南

    Linux内核中的页面分配机制

    Linux内核中是如何 分配出页面的,如果我们站在CPU的角度去看这个问题,CPU能 分配出来的页面是以物理页面为单位的。也就是我们计算机中常讲的分页机制。本文就看下 Linux内核是如何管
    的头像 发表于08-07 15:51 114次阅读
    <b class='flag-5'>Linux</b>内核中的页面<b class='flag-5'>分配</b>机制