一张图看懂应用程序访问驱动的内部原理

news2024/11/18 19:39:24

咱就浅谈一下字符设备驱动的内部实现~

 

1、当我们在应用程序中使用open打开文件的时候,会自动在/dev/mycdev下生成一个inode号。

2、只要文件存在于系统中,在系统内核就会存在一个inode结构体,里面存储文件的一些相关信息,其中信息之一有设备号,设备号是设备驱动的唯一标识,inode结构体中的共用体里边保存有一些块设备、字符设备等等信息。

3、其中字符设备也是一个结构体类型,struct cdev类型的对象用于描述一个字符设备的驱动,注册驱动的本质就是分配一个cdev的空间并初始化,然后通知内核。

4、struct cdev结构体中包含了操作方法结构体,在操作方法结构体里边定义我们要打开open、读read、写write、关闭close的函数指针。

从而实现应用程序访问驱动的过程。

***********************************************分界线*******************************************************

注册注销一个字符设备驱动的步骤:

  1. 分配一个struct cdev空间(驱动对象)
  2. 初始化驱动对象
  3. 注册驱动对象
  4. 注销

实现过程用到的API:

***********注册流程********************
1.为驱动对象申请空间
    a:struct cdev cdev;//这种方法不是自己申请的,不知道什么时候空间能释放,用起来不灵活
    b.//struct cdev *cdev_alloc(void);
    //功能:申请一个字符对象空间
    //参数:无
    //返回值:成功返回对象空间首地址,失败返回NULL
     struct cdev*cdev=cdev_alloc();
2.对象的初始化
    void cdev_init(struct cdev *cdev, const struct file_operations *ops);
    功能:实现字符设备驱动对象的部分初始化
    参数:
        cdev:字符设备驱动对象指针
        ops:操作方法结构体指针
    返回值:无
3.申请设备号
    a.int register_chrdev_region(dev_t from, unsigned count, const char *name)
    功能:静态指定设备号(不常用,因为一次申请256个,用不了那么多会造成资源浪费)
    参数:
        from:申请第一个设备的设备号   
        count:申请的设备资源数量
        name:设备名或者驱动名
    返回值:成功返回0,失败返回错误码
    b.int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,
            const char *name)
    功能:动态申请设备号
    参数:
        dev:存放设备号的变量指针
        baseminor:次设备号的起始值
        count:设备资源数量
        name:设备名或者驱动名
    返回值:成功返回0,失败返回错误码
4.注册驱动对象
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
功能:实现驱动对象的注册
参数:
    p:字符设备驱动对象指针
    dev:申请得到的设备号
    count:申请的设备数量
返回值:成功返回0,失败返回错误码


**********注销流程*******************
1.注销驱动对象
void cdev_del(struct cdev *cdev)
参数:
    cdev:要注销的驱动对象指针
返回值:无
2.释放设备号
void unregister_chrdev_region(dev_t from, unsigned count)
功能:释放设备号
参数:
    from:第一个设备的设备号
    count:设备资源的数量
返回值:无
3.static void kfree(void *p)
功能:释放kmalloc申请的空间
参数:
p:要释放的空间首地址
返回值:无

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

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

相关文章

如何使用STAR原则优化项目管理?

介绍STAR原则 1.1 STAR原则的定义 STAR原则是一个行为面试技术,即Situation(情境)、Task(任务)、Action(行动)和Result(结果)。这种原则被广泛应用在职业面试中&#x…

【严重】Metabase 基于H2引擎的远程代码执行漏洞

漏洞描述 Metabase 是一个开源的数据分析和可视化工具。 由于 CVE-2023-38646 的补丁(从H2 JDBC连接字符串中删除INIT脚本以防止命令注入)修复不完全,Metabase 仍受到命令注入的影响。攻击者可使用 H2 作为数据库引擎,通过 /api/setup/validate 端点发…

idea设置项目使用本地仓库

方法一&#xff1a;最简单有效的方法 在pom加入以下内容 <repositories><repository><id>local-repo</id><url>file://本地仓库目录</url></repository></repositories>方法二&#xff1a;idea设置maven为workoffline&#x…

局域网内电脑ping不通(防火墙惹的祸)

明明是同一网段&#xff08;同一局域网&#xff09;的电脑&#xff0c;却ping不通&#xff0c;这种情况大概率就是防火墙惹得祸了。除了把防火墙关掉&#xff0c;我们还可以采取如下解决方案。 解决方案&#xff1a; 1. 打开&#xff1a;控制面板\系统和安全\Windows Defende…

真香!云原生安全,大客户终于愿意买单了

5年前&#xff0c;我的哥们老丁 从倒腾防火墙转行卖新产品 据说那是一片蓝海&#xff0c;美其名曰 「云原生安全」 可是&#xff0c;“吆喝”了一段时间 老丁发现&#xff0c;这个蓝海没想象那么蓝 很多老客户都不买账 相反还是那些传统安全产品销量更好 为啥客户不感冒呢…

程序员生涯写过最大的Bug!这威力多少有点大了...

程序员一生与bug奋战&#xff0c;可谓是杀敌无数&#xff0c;见怪不怪了&#xff01;如果要问码农们&#xff0c;在自己职业生涯中写过最大的Bug是什么&#xff0c;想必每一位都需要一个话筒来说上几分钟...... 一个BUG&#xff0c;连升两级 一个bug能给程序员带来什么?优秀员…

Vue2(初识vue)

目录 一&#xff0c;Vue2简介1.1&#xff0c;什么是vue1.2&#xff0c;初始vue1.3&#xff0c;搭建vue环境1.4&#xff0c;第一个hello world 二&#xff0c;基础知识2.1 指令2.2-1 指令v-text2.2-2 指令v-html2.2-3 指令v-if2.2-4 指令v-else2.2-5 指令v-show2.2-6 v-if指令与…

IDEA导入第三方jar包, 并在Maven中打包该jar包

IDEA导入jar包, 并在Maven中打包该jar包 背景步骤IDEA导入jar包Maven中打包第三方jar包 背景 项目因为某些原因, 需要引入demo中代码, 但是demo使用的是 java而且没有使用任何框架, 并且还引用第三方 jar, 因此在自己项目(SpringBootMaven)中集成demo时. 整个集成过程中颇为麻…

2023拒绝内卷!两年转行网络安全真实看法!

我目前转行网络安全两年&#xff0c;没啥天分&#xff0c;全靠努力&#xff0c;基本能够得上中级的水平了。看到大家对转行网络安全挺感兴趣&#xff0c;也有挺多争议&#xff0c;想把我的建议和经验告诉大家。 有很多人觉得网络安全已经饱和了&#xff0c;现在选择这个工作&a…

docker-compose 搭建 Sharding-Proxy 5.4.0 分库分表代理服务

感谢: 程序员一枚 提供搭建方式 项目地址: https://gitee.com/dromara/RuoYi-Cloud-Plus/tree/2.X/ 1.在 mysql 创建两个库 创建两个库 data-center_0 data-center_1 分别执行如何sql CREATE TABLE t_order_0 (order_id bigint(20) UNSIGNED NOT NULL COMMENT 主键ID,user_…

【数据结构】27.移除元素

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

P4145 上帝造题的七分钟 2 / 花神游历各国

上帝造题的七分钟 2 / 花神游历各国 题目背景 XLk 觉得《上帝造题的七分钟》不太过瘾&#xff0c;于是有了第二部。 题目描述 "第一分钟&#xff0c;X 说&#xff0c;要有数列&#xff0c;于是便给定了一个正整数数列。 第二分钟&#xff0c;L 说&#xff0c;要能修改…

Ubuntu22.04搭建mysql主从复制

记录哈&#xff0c;这个需要两台服务器&#xff0c;每台服务器上面都要安装mysql&#xff0c;若是没有安装&#xff0c;请分别在两台服务器上面运行下面的命令 sudo apt install mysql-server 引用 Ubuntu下的mysql8.0忘记密码怎么办? 环境 Ubuntu 22.04 主机:192.168.164.1…

mac前端代码编辑 Sublime Text 4 Dev 中文v4.0(4151)

Sublime Text 4 for Mac是一款功能强大的代码编辑器&#xff0c;适合所有需要高效编写代码和进行代码管理的程序员使用。 快速响应&#xff1a;Sublime Text 4在加载文件和执行命令时非常快速&#xff0c;能够让用户在高效的开发过程中体验到无缝的交互。 多种语言支持&#…

定了!全国2023下半年软考(高级、中级、初级)报名时间汇总

截止到2023年8月2日&#xff0c;有以下地区公布了软考报名时间&#xff1a; 安徽软考2023下半年报名时间&#xff1a;8月15日9:00至8月21日16:00 黑龙江软考2023下半年报名时间&#xff1a;8月16日至8月22日 甘肃软考2023下半年报名时间&#xff1a;8月28日9:00至9月6日18:00…

安全文件传输的重要性及其对企业的影响

在当今的信息时代&#xff0c;企业之间的文件传输已经成为日常工作的重要组成部分。无论是在商务合作、人力资源还是财务审计等方面&#xff0c;文件传输都发挥着关键的作用。然而&#xff0c;随着网络技术的发展&#xff0c;网络安全问题也日益突出&#xff0c;泄漏、篡改、丢…

django使用mysql数据库

Django开 发操作数据库比使用pymysql操作更简单&#xff0c;内部提供了ORM框架。 下面是pymysql 和orm操作数据库的示意图&#xff0c;pymysql就是mysql的驱动&#xff0c;代码直接操作pymysql ,需要自己写增删改查的语句 django 就是也可以使用pymysql、mysqlclient作为驱动&a…

EXCEL里数值列如何显示序号?如何重新排序? 怎么取得排序后的序号?

目录 1 EXCEL里如何显示序号&#xff1f; 2 如何重新排序&#xff1f; 3 怎么取得排序后的序号&#xff1f; 3.1 rank() 的序号可能不连续 3.2 方法2&#xff1a;SUMPRODUCT((C7>C$7:C$12)/COUNTIF(C$7:C$12,C$7:C$12))1 EXCEL里如何显示序号&#xff1f;如何重新排序…

A Survey of Embodied AI: From Simulators to Research Tasks 论文阅读

论文信息&#xff1a; 题目&#xff1a;A Survey of Embodied AI: From Simulators to Research Tasks 作者&#xff1a;Jiafei Duan, Samson Yu 来源&#xff1a;arXiv 时间&#xff1a;2022 Abstract 通过评估当前的九个具体人工智能模拟器与我们提出的七个功能&#xff0…

redis的事务、redis持久化方案、Java操作redis数据库

五、redis的事务 开启事务&#xff1a; 要等左边的提交事务&#xff0c;右边才能拿到修改后的值 本来name不能增加&#xff0c;会报错&#xff0c;但是事务中没提交不知道错 此时提交数据&#xff1a; redis事务将成功的正常提交&#xff0c;失败的才回滚&#xff0c;所以不具备…