字符设备驱动的内部实现

news2024/11/23 23:56:55

1.inode号的功能 :①inode号是文件存在于文件系统的唯一标识1

②同时也是索引当前文件的inode结构体的索引导

2.文件信息结构体:只要文件存在于文件系统中,那么内核中一定会存在一个struct inode结构体,这个结构体里面存放了文件的相关信息,其中就有设备号文件和字符设备驱动的信息

3.设备号:设备号是驱动存在内核的标识,也是设备驱动和设备文件的关联

4.字符设备驱动对象结构体:结构体里面包含了操作方法结构体,设备号,设备数量等信息。其中操作方法结构体就包含了open,read,write,close等操作方法。

那么用户层如何通过文件的路径去回调操作方法的呢?

1.根据open传递的文件路径找到inode结构体
2.根据inode结构体找到文件对应的驱动的对象指针
3.根据驱动的对象指针找到驱动对象中的操作方法结构体指针
4.再去回调操作方法中的open

那么open函数可以通过指定路径的文件名找到inode号,进而找到inode结构体,从而找到回调对应的操作方法,而read,write这些函数没有指定的路径,只有文件描述符,怎么回调对应的操作方法呢?

在一个linux内核里一定会存在一个task_strcut空间存放进程相关的信息

在task_struct结构体内部,有一个成员files,这个指针指向一片struct files_struct空间,里面存放了打开文件相关的信息

在这个结构体内部有一个struct file*类型的数组,数组成员都是一个个的struct file空间指针,而我们打开文件返回的文件描述符就是这个数组的下标



而file结构体内部就有对应的操作方法结构体,进而可以回调操作方法。



字符设备驱动分步注册流程代码:

static int __init mycdev_init(void)
{
    int ret,i;
    //1.分配对象空间
    cdev=cdev_alloc();
    if(cdev==NULL)
    {
        printk("分配字符设备驱动对象失败\n");
        ret=-EFAULT;
        goto OUT1;
    }
    printk("分配对象空间成功\n");
    //2.初始化对象
    cdev_init(cdev,&fops);
    //3.申请设备号
    if(major>0)//静态指定设备号
    {
        ret= register_chrdev_region(MKDEV(major,minor),3,"myled");
        if(ret)
        {
            printk("静态指定设备号失败\n");
            goto OUT2;
        }
    }
    else if(major==0)//动态申请设备号
    {
        ret=alloc_chrdev_region(&devno,minor,3,"myled");
        if(ret)
        {
            printk("动态申请设备号失败\n");
            goto OUT2;
        }
        //获取主设备号和次设备号
        major=MAJOR(devno);
        minor=MINOR(devno);
    }
    printk("申请设备号成功\n");
    //4.注册字符设备驱动对象
    ret=cdev_add(cdev,MKDEV(major,minor),3);
    if(ret)
    {
        printk("注册字符设备驱动对象失败\n");
        goto OUT3;
    }
    printk("注册字符设备驱动对象成功\n");
    //向上提交目录
    cls=class_create(THIS_MODULE,"myled");
    if(IS_ERR(cls))
    {
        printk("向上提交目录失败\n");
        ret=-PTR_ERR(cls);
        goto OUT4;
    }
    printk("向上提交目录成功\n");
    //向上提交设备节点信息
    for(i=0;i<3;i++)
    {
         dev=device_create(cls,NULL,MKDEV(major,i),NULL,"myled%d",i);
         if(IS_ERR(dev))
         {
            ret=-PTR_ERR(dev);
            goto OUT5;
         }
    }
    printk("向上提交设备节点成功\n");
    //完成硬件寄存器地址的映射以及初始化
    return 0;
OUT5:
    //释放已经申请的设备节点信息
    for(--i;i>=0;i--)
    {
        device_destroy(cls,MKDEV(major,i));
    }
    //释放目录空间
    class_destroy(cls);
OUT4:
    //注销字符设备驱动对象
    cdev_del(cdev);
OUT3:
    //释放设备号
    unregister_chrdev_region(MKDEV(major,minor),3);
OUT2:
//释放对象空间
    kfree(cdev);
OUT1:
    return ret;
}
static void __exit mycdev_exit(void)
{
    //销毁设备节点
    int i;
    for(i=0;i<3;i++)
    {
        device_destroy(cls,MKDEV(major,i));
    }
    //释放目录空间
    class_destroy(cls);
    //1.注销字符设备驱动对象
     cdev_del(cdev);
    //2.释放设备号
     unregister_chrdev_region(MKDEV(major,minor),3);
    //3.释放对象空间
     kfree(cdev);
}

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/650692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详解Http的Content-Type

目录 1.概述 2.常用类型 2.1.application/x-www-form-urllencoded 2.2.application/json 3.Spring MVC支持的编码 3.1.实验 3.2.适配器 3.3.自定义适配器 1.概述 HTTP&#xff08;HyperText Transfer Protocol&#xff09;&#xff0c;超文本传输协议。超文本&#xf…

从redis-trib.rb到集群加减节点实战

redis-trib.rb工具介绍 redis-trib.rb是redis集群管理工具&#xff0c;可以检查集群、创建删除节点、挪key、批量下发实例命令等等。 不是没有redis-trib.rb就没有集群管理了&#xff0c;没有redis-trib.rb照样可以管理集群。redis本身就有集群相关管理命令&#xff0c;redis-…

2021年系统架构设计师考试下午案例分析真题

试题一 阅读以下关于软件架构设计与评估的叙述&#xff0c;在答题纸上回答问题1和问题2。 [说明] 某公司拟开发-套机器学习应用开发平台,支持用户使用浏览器在线进行基于机器学习的智能应用开发活动。 该评台的核心应用场景是用户通过拖拽算法组件灵活定义机器学习流程&#…

“6511”成果显著,联诚发上半年表现企稳高升!

六场巡回演唱会&#xff0c;五大知名展会&#xff0c;一部爆款大电影&#xff0c;一项省级品牌荣誉。 这些关键词&#xff0c;是联诚发&#xff08;LCF&#xff09;在短短六个月内取得的各项成果的总览。 ▲联诚发LCF 公司简介 绿树阴浓夏日长&#xff0c;6月的到来也预示着阶…

让小脚本成为自己高效测试的工具(详细版)

目录 测试中会遇到的工具 测试常用的开源工具 Python 移动/UI自动化测试平台 平台需要做什么 自建需要的技术 接口测试平台 运维 Django运维部署框架 单元测试概述 什么是单元测试 单元测试什么进行&#xff1f; 单元测试由谁负责&#xff1f; 单元测试需要注意 …

opencv祛除高光

代码是直接借鉴的Opencv去除高光_SkyrimDragonBorn的博客-CSDN博客 原博客是c&#xff0c;我这边只是使用python进行翻译了一下 import cv2 import numpy as npimg cv2.imread(xxx.jpg)def highlight_remove(img):img cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.floa…

java0615

01java语言背景介绍 02java语言跨平台原理 03JRE和JDK

View UI Plus (iview)表格单选实现教程

View UI Plus 是 View Design 设计体系中基于 Vue.js 3 的一套 UI 组件库&#xff0c;主要用于企业级中后台系统 View UI&#xff0c;即原先的 iView&#xff0c;从 2019 年 10 月起正式更名为 View UI&#xff0c;并使用全新的 Logo View UI Plus 实现表格单选&#xff0c;这…

八股文总结

文章目录 项目介绍1.不动产项目项目难点机器学习算法调研图像提取算法调研数据集-ImageNetXceptionVGGInceptionDensenetMobilenet 系统流程图 2.图书项目技术栈ShiroMybatisMyBatis:Mybatis Plus: 面试问题 Java基础基本数据类型反射接口和抽象类异常代理模式1. 静态代理2. 动…

Java Logback日志框架概述及logback.xml详解

日志技术具备的优势 可以将系统执行的信息选择性的记录到指定的位置&#xff08;控制台、文件中、数据库中)。 可以随时以开关的形式控制是否记录日志&#xff0c;无需修改源代码。 日志体系结构 Logback日志框架 Logback是由log4j创始人设计的另一个开源日志组件&#xff0…

Android classLoader 双亲委托 反射

双亲委托 双亲委托机制&#xff0c;就是导入类的时候判断parent是否已经导入过该类。 作用 1、避免重复加载&#xff0c;当父加载器已经加载了该类的时候&#xff0c;没有必要子ClassLoader再加载一次。 2、安全性考虑&#xff0c;防止核心API库被随意篡改。 核心代码 pri…

CSS查缺补漏之常用长度单位(px、em、rem、%、vw/vh、vmin/vmax)

此文内容较少&#xff0c;轻轻松松掌握&#xff0c;莫要有压力~ 正如现实生活中长度具有mm、dm、cm、m等&#xff0c;在css中&#xff0c;也具备多种长度单位&#xff0c;本文对常用的几种单位进行详细举例介绍~ px&#xff1a;像素单位 初学css时&#xff0c;px单位经常被使用…

2023-06-16 Android Studio 使用CMakeList编译JNI ,源码

一、代码结构图&#xff0c;代码路径https://download.csdn.net/download/qq_37858386/87913001 二、cmakedemo\app\build.gradle 加下面的代码 externalNativeBuild {cmake {cppFlags "-frtti -fexceptions"}}externalNativeBuild {cmake {path src/main/jni/CMakeL…

邮件触发无需代码连接维格表的方法

1.邮件触发用户使用场景&#xff1a; 公司时常会收到来自各地的合作邮件&#xff0c;为了筛选合适的合作伙伴&#xff0c;公司需要查询对方企业的基础工商信息&#xff0c;例如企业的存续状态、法人代表、注册资金等等&#xff0c;然后将查询后的信息发送至高管群里&#xff0c…

使用docker部署ELK实战

目录 什么是ELKELK简介ElasticsearchLogstashKibana docker安装ELK安装es安装 Kibana安装logstash 什么是ELK ELK是一个开源的数据分析平台&#xff0c;由三个开源项目Elasticsearch、Logstash和Kibana组成&#xff0c;因此被称为ELK Stack。ELK Stack主要用于处理和分析大量的…

数字安全免疫力:“关基”企业构建安全体系的通关攻略

2023年5月1日起&#xff0c;《信息安全技术 关键信息基础设施安全保护要求》&#xff08;以下简称《关基保护要求》&#xff09;正式实施&#xff0c;这是关键信息基础设施安全保护相关的首个国家标准。相对于2021年9月1日起实施的《关键信息基础设施安全保护条例》&#xff0c…

复习css样式的第1章

什么是 CSS&#xff1f; CSS 指的是层叠样式表* (Cascading Style Sheets)CSS 描述了如何在屏幕、纸张或其他媒体上显示 HTML 元素CSS 节省了大量工作。它可以同时控制多张网页的布局外部样式表存储在 CSS 文件中 三种使用 CSS 的方法 有三种插入样式表的方法&#xff1a; 外…

RISC-V体系结构的U-Boot引导过程 第一阶段

RISC-V体系结构的U-Boot引导过程 第一阶段 flyfish .globl _start _start:.globl使符号对链接器可见相当于C语言中的Extern&#xff0c;声明此变量&#xff0c;并且告诉链接器此变量是全局变量&#xff0c;外部可以访问.u-boot.lds里的ENTRY(_start)也是这里的_start。 即指定…

SUNet: Swin Transformer UNet for ImageDenoising

Abstract 图像恢复是一个具有挑战性的不适定问题&#xff0c;也是一个长期存在的问题。在过去的几年中&#xff0c;卷积神经网络(cnn)几乎主导了计算机视觉&#xff0c;并在不同层次的视觉任务中取得了相当大的成功&#xff0c;包括图像恢复。然而&#xff0c;最近基于Swin tr…

权限验证框架之Shiro

文章目录 前言shiro 核心项目构建默认Session模式配置测试接口Realm编写权限测试无权限测试登录测试权限测试 前后端分离tokenJWTFilter重写认证修改配置 总结 前言 交替换个脑子&#xff0c;一直搞考研的东西&#xff0c;实在是无聊。所以顺便把工程上的东西&#xff0c;拿来…