04_device_bus_driverLinux内核模块

news/2024/5/16 22:32:10/文章来源:https://blog.csdn.net/m0_37132481/article/details/136157824

01_basicLinux内核模块-CSDN博客文章浏览阅读45次。环境ID=ubuntuMakefilemodules:clean:basic.creturn 0;运行效果。https://blog.csdn.net/m0_37132481/article/details/136157384?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22136157384%22%2C%22source%22%3A%22m0_37132481%22%7D

device_bus_driver.c

root@T:/media/sf_D_DRIVE/kmodule/04_device_bus_driver# cat device_bus_driver.c
#include <linux/module.h>
#include <linux/device.h>
#include <linux/slab.h>#define TAG "HELLO# "struct device *dev = NULL;
struct device_driver *drv = NULL;static int my_bus_match(struct device *_dev, struct device_driver *_drv)
{printk(TAG "%s called\n", __func__);return !strcmp(dev_name(dev), drv->name);
}static int my_bus_probe(struct device *dev)
{printk(TAG "%s called\n", __func__);printk(TAG "hello drv_%s, dev_%s, Happy Marriage!\n", dev->driver->name, dev_name(dev));return 0;
}static void my_bus_remove(struct device *dev)
{printk(TAG "%s called\n", __func__);
}struct bus_type my_bus_type = {.name           = "my-bus",.match          = my_bus_match,.probe          = my_bus_probe,.remove         = my_bus_remove,
};static int device_bus_driver_init(void)
{printk(TAG "%s called\n", __func__);/* register bus */bus_register(&my_bus_type);/* register device */dev = kzalloc(sizeof(*dev), GFP_KERNEL);dev->init_name = "hello";dev->bus = &my_bus_type;device_register(dev);dev = get_device(dev);/* register driver */drv = kzalloc(sizeof(*drv), GFP_KERNEL);drv->name = "hello";drv->bus = &my_bus_type;driver_register(drv);return 0;
}
static void device_bus_driver_exit(void)
{printk(TAG "%s called\n", __func__);/* unregister driver */driver_unregister(drv);/* unregister device */device_unregister(dev);/* unregister bus */bus_unregister(&my_bus_type);/* free resource */kfree(dev);kfree(drv);
}module_init(device_bus_driver_init);
module_exit(device_bus_driver_exit);
MODULE_LICENSE("GPL");

效果

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL Error Codes (PostgreSQL错误代码)

Whats PostgreSQL Error Codes PostgreSQL服务器发出的所有消息都分配了五个字符的错误代码&#xff0c; 这些代码遵循 SQL 的"SQLSTATE"代码的约定。 需要知道发生了什么错误条件的应用程序通常应该检测错误代码&#xff0c;而不是查看文本错误消息。 这些错误代码…

【leetcode题解C++】51.N皇后 and 76.最小覆盖子串

51. N皇后 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方…

埋点自动化测试框架设计

大数据时代&#xff0c;多数的web或app产品都会使用第三方或自己开发相应的数据系统&#xff0c;进行用户行为数据或其它信息数据的收集&#xff0c;在这个过程中&#xff0c;埋点是比较重要的一环。埋点收集的数据一般有以下作用&#xff1a; 驱动决策&#xff1a;ABtest、漏斗…

【机构vip教程】Appium自动化(2):Python+Appium环境搭建

windows下搭建pythonappium环境 搭建过程步骤如下&#xff1a; 1、安装jdk并配置好环境变量&#xff08;jdk版本1.8以上&#xff09; 2、安装android-sdk并配置好环境变量&#xff1b;具体步骤见&#xff1a;https://www.cnblogs.com/YouJeffrey/p/15243705.html 3、安装安…

伦敦金和现货黄金是一回事吗?

想进入黄金市场的朋友&#xff0c;在网上一搜相关的讯息&#xff0c;可能就懵了。这个市场中好像有几个品种&#xff0c;又是伦敦金又是现货黄金什么的。很多新手投资者想知道&#xff0c;这些伦敦金、现货黄金分别是指什么&#xff0c;下面我们就来讨论一下。 实际上&#xff…

[VulnHub靶机渗透] Fowsniff

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

洛谷 P1019 [NOIP2000 提高组] 单词接龙

参考代码 #include <bits/stdc.h> using namespace std; string s[25]; int vis[25], ans, now 1, n; void dfs(int k) { ans max(ans, now); for(int i 1; i < n; i) if(vis[i] < 2) { for(int j 0; j < s[k].length(); j) …

【plt.bar绘制条形图or柱状图】:从入门到精通,只需一篇文章!【Matplotlib可视化】

【&#x1f4ca;plt.bar绘制条形图】&#xff1a;从入门到精通&#xff0c;只需一篇文章&#xff01;【Matplotlib】 利用Matplotlib进行数据可视化示例 &#x1f335;文章目录&#x1f335; &#x1f50d; 一、初识plt.bar&#xff1a;条形图的基本概念&#x1f4a1; 二、plt.…

【嵌入式学习】IO网络接口day02.18

1.使用fgets统计给定文件的行数 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, const char *argv[]) {FILE *fpNULL;if((fpfopen("./test1.txt","r"))NULL){perror("错误信息");return -1…

MCU电源控制(PWR)与低功耗

目录 一、STM32 的内核和外设电源系统管理&#xff1a; 二、MCU电源监控&#xff1a; 三、三种低功耗模式&#xff1a; 1、睡眠模式&#xff1a; 2、停止模式&#xff1a; 3、待机模式&#xff1a; 一、STM32 的内核和外设电源系统管理&#xff1a; ① 电池备份区域&#…

通俗易懂地解释OpenAI Sora视频生成的特点有哪些?与Runway Gen2、Pika有什么区别?缺点是什么?

OpenAI的Sora模型是最近两天最火热的模型。它生成的视频无论是清晰度、连贯性和时间上都有非常好的结果。在Sora之前&#xff0c;业界已经有了很多视频生成工具和平台。但为什么Sora可以引起如此大的关注&#xff1f;Sora生成的视频与此前其它平台生成的视频到底有哪些区别&…

2024年2月前端技术新动态:迈向现代化的全速前进

随着技术的不断进步&#xff0c;前端领域每月都有新的变化和挑战。2024年2月&#xff0c;我们见证了几项重大的技术更新&#xff0c;从Deno的性能提升到Turborepo的重大改进&#xff0c;再到jQuery 4.0.0 Beta的发布&#xff0c;这些变化不仅标志着前端开发向着更现代化、更高效…

EXCEL中不错的xlookup函数

excel中一般要经常用vlookup函数&#xff0c;但其实经常麻烦要正序&#xff0c;从左边到右边&#xff0c;还要数列&#xff0c;挺麻烦的&#xff0c;xlookup的函数还不错&#xff0c;有个不错的一套视频介绍,B站的&#xff0c;地址是&#xff1a;XLOOKUP函数基础用法&#xff0…

IDEA2021版热部署配置

第一步 Settings中搜索compiler 勾选上Build project automatically 第二步 按快捷键 CtrlAltShift/ 选择第一个Registry 勾选上 注&#xff1a;2021版IDEA 被迁移到了这里 第三步 第四步 pom.xml中添加 配置文件中添加 #springdevtools spring.devtools.restart.…

Nginx实战:日志按天分割

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、方式1&#xff1a;定时任务执行分割脚本 1.分割日志脚本 2.添加定时任务 二、方式2&#xff1a;logrotate配置分割 1.logrotate简单介绍 2.新增切割ngi…

[C++]二叉搜索树

一、定义 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值它的左右子树也分别…

【Java EE初阶十七】网络原理(二)

2. 传输层 2.2 TCP协议 2.2.2 关于可靠传输 4.滑动窗口 前面的三个机制&#xff0c;都是在保证 tcp 的可靠性&#xff1b; TCP 的可靠传输,是会影响传输的效率的.(多出了一些等待 ack 的时间,单位时间内能传输的数据就少了)&#xff1b; 滑动窗口,就让可靠传输对性能的影响,更…

集团企业大数据应用:突破痛点,释放数据价值

在数字经济日益崛起的背景下&#xff0c;集团企业以其管理范围广泛、业务领域多元化和分支机构复杂化的特性&#xff0c;在市场竞争中扮演着重要角色。为了维持和提升这种竞争力&#xff0c;大数据应用成为了集团企业不可或缺的战略工具。然而&#xff0c;在实际应用中&#xf…

安装部署k8s集群

系统&#xff1a; CentOS Linux release 7.9.2009 (Core) 准备3台主机 192.168.44.148k8s-master92.168.44.154k8s-worker01192.168.44.155k8s-worker02 3台主机准备工作 关闭防火墙和selinux systemctl disable firewalld --nowsetenforce 0sed -i s/SELINUXenforcing/SELI…

Vue中 如何监听键盘事件中的按键

在Web前端开发中&#xff0c;键盘事件的处理是非常常见的需求之一。而在Vue框架中&#xff0c;如何监听键盘事件中的按键是一个相对简单但又很实用的功能。本文将为你介绍如何在Vue中监听键盘事件&#xff0c;并演示一些常用的按键操作。 首先&#xff0c;在Vue中监听键盘事件…