【driver6】debugfs,性能优化,

文章目录

  • 1.内核调试手段:debugfs.h中api建立目录/sys/kernel/debug
  • 2.性能优化:裸磁盘无法使用,一般都刷文件系统。驱动加上要考虑磁盘io,内存占用,cpu使用情况
  • 3.Valgrind内存泄漏排查案例:
  • 4.cpu瓶颈:
  • 5.主频设置
  • 6.驱动稳定性
  • 1.platform总线:相对于USB/PCI/I2C/SPI等物理总线来说,platform总线是一种虚拟的总线,实际并不存在,工作是完成总线下的设备和驱动之间的匹配
    • 1.1 of_device_id即of_match_table设备树采用的匹配方式:设备树中的每个设备节点的compatible属性会和of_match_table表中的所有成员比较,查看是否有相同的条目,有的话就表示设备和此驱动匹配,设备和驱动匹配成功后probe函数会执行
    • 1.2 id_table匹配:id_table不存在的话就直接比较驱动和设备name字段
  • 2.platform总线


1.内核调试手段:debugfs.h中api建立目录/sys/kernel/debug

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
内核开发会遇到内核崩溃,如空指针异常,内存访问越界,如下会打印出异常调用栈信息定位。
在这里插入图片描述
在这里插入图片描述

2.性能优化:裸磁盘无法使用,一般都刷文件系统。驱动加上要考虑磁盘io,内存占用,cpu使用情况

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如下网络调试:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.Valgrind内存泄漏排查案例:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如下malloc加个死循环就是内存泄漏。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
dmesg会显示不全,因为环形buffer会覆盖。在这里插入图片描述

4.cpu瓶颈:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
-p pid
在这里插入图片描述

5.主频设置

在这里插入图片描述
在这里插入图片描述

6.驱动稳定性

希望arg有多大
在这里插入图片描述
likely一般用在if判断里,cpu会把当前指令后面指令预取出来,等到执行时就去执行,效率提高,但是也要判断后面那条指令大概率执不执行,执行的话取出来,不执行则跳过。
在这里插入图片描述

1.platform总线:相对于USB/PCI/I2C/SPI等物理总线来说,platform总线是一种虚拟的总线,实际并不存在,工作是完成总线下的设备和驱动之间的匹配

// include/linux/device.h,  Linux系统内核使用bus_type结构体表示总线,  Linux系统中文件的体现形式是在/sys/bus下有spi文件夹里有device和driver文件夹
struct bus_type {
	const char		*name;								/* 总线名字 */
	const char		*dev_name;
	struct device		*dev_root;
	struct device_attribute	*dev_attrs;					/* use dev_groups instead */
	const struct attribute_group **bus_groups;			/* 总线属性 */
	const struct attribute_group **dev_groups;			/* 设备属性 */
	const struct attribute_group **drv_groups;			/* 驱动属性 */
	int (*match)(struct device *dev, struct device_driver *drv);
	int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
	int (*probe)(struct device *dev);
	int (*remove)(struct device *dev);
	void (*shutdown)(struct device *dev);
	int (*online)(struct device *dev);
	int (*offline)(struct device *dev);
	int (*suspend)(struct device *dev, pm_message_t state);
	int (*resume)(struct device *dev);
	const struct dev_pm_ops *pm;
	const struct iommu_ops *iommu_ops;
	struct subsys_private *p;
	struct lock_class_key lock_key;
};

// drivers/base/platform.c
struct bus_type platform_bus_type = {  // platform总线是bus_type的一个具体实例
	.name		= "platform",
	.dev_groups	= platform_dev_groups,
	.match		= platform_match,  //下面定义
	.uevent		= platform_uevent,
	.pm		= &platform_dev_pm_ops,
};

static int platform_match(struct device *dev, struct device_driver *drv) 
{
	struct platform_device *pdev = to_platform_device(dev); 
	struct platform_driver *pdrv = to_platform_driver(drv);
	/* When driver_override is set, only bind to the matching driver */
	if (pdev->driver_override)
		return !strcmp(pdev->driver_override, drv->name);

	// 如下4种设备和驱动匹配方式:
	/* 1. Attempt an OF style match first */
	if (of_driver_match_device(dev, drv))
		return 1;
		
	/* 2. Then try ACPI style match */
	// 从device中找到acpi_device设备后就可匹配了,of_driver_match_device没有匹配到,则用这种
	if (acpi_driver_match_device(dev, drv))  
		return 1;
		
	/* 3. Then try to match against the id table */
	if (pdrv->id_table)
		return platform_match_id(pdrv->id_table, pdev) != NULL;
		
	/* 4. fall-back to driver name match */
	return (strcmp(pdev->name, drv->name) == 0);
}

platform总线管理下的platform_device和platform_driver(任何一种Linux设备驱动模型下的总线都由这两个部分组成)。

// include/linux/platform_device.h
struct platform_device {   
	const char	*name;
	int		id;
	bool		id_auto;
	struct device	dev;
	u32		num_resources;
	struct resource	*resource;
	const struct platform_device_id	*id_entry;
	char *driver_override; /* Driver name to force a match */
	/* MFD cell pointer */
	struct mfd_cell *mfd_cell;
	/* arch specific additions */
	struct pdev_archdata	archdata;
};

struct platform_driver { 
	int (*probe)(struct platform_device *); /// 当驱动与设备匹配成功以后 probe 函数就会执行
	int (*remove)(struct platform_device *);
	void (*shutdown)(struct platform_device *);
	int (*suspend)(struct platform_device *, pm_message_t state);
	int (*resume)(struct platform_device *);
	struct device_driver driver;   device_driver基类下面定义
	const struct platform_device_id *id_table;  // id_table是个表(也就是数组),每个元素的类型为 platform_device_id,下面定义
	bool prevent_deferred_probe;
};

//struct platform_device_id {
//	char name[PLATFORM_NAME_SIZE];
//	kernel_ulong_t driver_data;
//};

1.1 of_device_id即of_match_table设备树采用的匹配方式:设备树中的每个设备节点的compatible属性会和of_match_table表中的所有成员比较,查看是否有相同的条目,有的话就表示设备和此驱动匹配,设备和驱动匹配成功后probe函数会执行

// include/linux/of_device.h
static inline int of_driver_match_device(struct device *dev,   // platform_match函数中调用
					 const struct device_driver *drv)  device_driver下面定义
{
	return of_match_device(drv->of_match_table, dev) != NULL; 
}

struct device_driver { //基类,platform_driver继承了这个基类
	const char		*name;
	struct bus_type		*bus;
	struct module		*owner;
	const char		*mod_name;	/* used for built-in modules */
	bool suppress_bind_attrs;	/* disables bind/unbind via sysfs */
	const struct of_device_id	*of_match_table;   of_device_id下面定义	
	const struct acpi_device_id	*acpi_match_table;
	int (*probe) (struct device *dev);
	int (*remove) (struct device *dev);
	void (*shutdown) (struct device *dev);
	int (*suspend) (struct device *dev, pm_message_t state);
	int (*resume) (struct device *dev);
	const struct attribute_group **groups;
	const struct dev_pm_ops *pm;
	struct driver_private *p;
};

//struct of_device_id {  //include/linux/mod_devicetable.h
//	 char name[32];
//	 char type[32];
//	 char compatible[128];
//	 const void *data;
//};

如下不是设备树,spi_driver相当于device_driver。
在这里插入图片描述

1.2 id_table匹配:id_table不存在的话就直接比较驱动和设备name字段

在这里插入图片描述

2.platform总线

实际存在的总线通过cpu bus直接寻址,访问对应的i2c设备对应的寄存器,linux基于这个共性,在内核的设备模型基础上也就是device,device_driver进一步的封装成platform_bus,platform_device,platform_driver,便于开发,platform总线为实际的总线服务,挂在platform bus不单单是一个虚拟总线,probe里还会注册如i2c_board_info,gpio控制器等实际总线设备驱动,在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如下包含device_driver
在这里插入图片描述
注册相当于链表
在这里插入图片描述
platform_device接触的不多,因为有设备树,设备树里只要写了兼容性名字,都会被内核解析成platform_device,最早没有设备树前,platform_device要自己注册,现在不用。资源具有独占性,如这个中断不允许多个设备同时使用,因为在内核提供很多api用于分配和管理资源,
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
match是由每个bus自己实现,如以太网有自己的match,最重要工作是driver和device的匹配,规则可以自己定的如下,如以太网的match以phyid进行匹配规则,of开头都是设备树解析函数,所以每个设备树有自己的兼容性名字并且ok,都会在内核初始化时解析成platform_device。所以bus在driver注册时会去扫platform_device链表,反之一样,扫描时调的匹配规则就是下面函数,匹配成功后调用platform_driver里probe函数进行注册自己对应的i2c,spi,i2c_board_info填充,spi_board_info填充,把设备树里设备信息通过获取资源方法拿出来进行解析。
在这里插入图片描述

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

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

相关文章

ArrayList的深拷贝与浅拷贝

1、深拷贝 通过以下代码进行理解 import java.util.ArrayList; import java.util.List;public class Demo {public static void main(String[] args) {List<Integer> c new ArrayList<>();c.add(1);c.add(2);c.add(3);List<Integer> c1 new ArrayList<…

部署Discuz论坛项目

DIscuz 是由 PHP 语言开发的一款开源社交论坛项目。运行在典型的LNMP/LAMP 环境中。 安装MySQL数据库5.7 主机名IP地址操作系统硬件配置discuz-db192.168.226.128CentOS 7-mini-20092 Core/4G Memory 修改主机名用来自己识别 hostnamectl set-hostname discuz-db #重连远程…

海外仓管理优化策略:花更少的钱,收获更大的收益

海外仓成本确实越来越高了。 仓储成本和人力成本几乎占据了海外仓经营成本的一大部分&#xff0c;这严重的影响了海外仓企业的盈利能力。如果你正打算开设海外仓业务或者已经在经营海外仓业务&#xff0c;那这个问题一定不能忽视&#xff0c;毕竟成本越高&#xff0c;就意味着你…

中北机械有限公司将参加2024长三角快递物流供应链与技术装备展览会

参展企业介绍 浙江中北机械有限公司总部位于浙江杭州&#xff0c;生产基地位于浙江桐乡。是一家有着十几年金属制品及仓储物流设施设备生产经验&#xff0c;专业设计、生产、制造各类物流钢制托盘&#xff0c;物流手推车&#xff0c;仓储货架及门店展架&#xff0c;宣传展架等物…

力扣HOT100 - 198. 打家劫舍

解题思路&#xff1a; 动态规划 class Solution {public int rob(int[] nums) {int len nums.length;if (nums null || len 0) return 0;if (len 1) return nums[0];int[] dp new int[len];dp[0] nums[0];dp[1] Math.max(nums[0], nums[1]);for (int i 2; i < len;…

zookeeper集群部署以及zookeeper原理

文章目录 简介工作原理特性官网地址准备节点准备环境准备JAVA主机映射 部署 简介 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服…

宝塔纯净版 7.6.0版本无需手机登录 [稳定版本/推荐]

下载地址&#xff1a;宝塔纯净版 7.6.0版本无需手机登录.zip 宝塔纯净版介绍 无需手机登录&#xff1a;不再有手机登录提示&#xff0c;或按照提示输入任意手机号密码即可模拟绑定&#xff1b; 安全&#xff1a;剥离了所有与宝塔官方的通信、上报、下发&#xff1b;并且不与…

Vue Excel 文件流导出乱码快速解决方案

今日在开发一个导出功能&#xff0c;原本一个非常简单的功能&#xff0c;却没想里面藏了陷阱&#xff01; 背景 前端导出的文件流乱码&#xff0c;此时确定非后端问题&#xff08;可以在postman导出是否正常来判断&#xff09;。 前端导出&#xff1a; 后端正常数据&#xf…

黑马基于Web-socket的java聊天室基本解析

要是用Web-socket协议&#xff0c;我们要前端upgrade升级成web-socket协议 首先我们要引入springboot的websocket起步依赖&#xff0c;这样子方便使用&#xff0c;自己指定版本注意 <dependency><groupId>org.springframework.boot</groupId><artifactId&…

2种方法教你快速完成图片格式转换!

在数字世界中&#xff0c;图片是我们传递信息和表达创意的重要媒介。然而&#xff0c;不同的应用场景需要不同格式的图片。例如&#xff0c;网页设计可能需要使用PNG格式&#xff0c;而打印则需要使用JPG或PDF格式。这就需要我们经常进行图片格式转换。 下文小编将分享2种方法…

Ubuntu搭建VsCode C++ 开发环境

Ubuntu搭建VsCode C 开发环境 安装VS Code 使用命令来安装VS Code&#xff1a;他会下载vscode的最新版本。 sudo snap install --classic code如果不使用命令 的方式 在官网下载vscode安装包&#xff08; 后缀为 .deb的包 &#xff09;之后&#xff08;可以选择版本 &#x…

【JavaEE精炼宝库】多线程1(认识线程 | 创建线程 | Thread 类)

目录 一、认识线程 1.1 线程的概念&#xff1a; 1.2 为什么需要线程&#xff1a; 1.3 面试题.谈谈进程和线程的区别&#xff1a; 1.4 Java的线程和操作系统线程的关系&#xff1a; 二、创建线程 2.1 创建线程的5种写法&#xff1a; 2.1.1 写法1.继承 Thread 类&#xf…

codeforces round944(div4)A~F题解

文章目录 [A. My First Sorting Problem](https://codeforces.com/contest/1971/problem/A)[B. Different String](https://codeforces.com/contest/1971/problem/B)[C. Clock and Strings](https://codeforces.com/contest/1971/problem/C)[D. Binary Cut](https://codeforces…

5.10.10 用于图像识别的深度残差学习

1. 介绍 深度卷积神经网络为图像分类带来了一系列突破。深度网络自然地以端到端的多层方式集成低/中/高级特征和分类器&#xff0c;并且特征的“级别”可以通过堆叠层的数量&#xff08;深度&#xff09;来丰富。 学习更好的网络是否像堆叠更多层一样容易&#xff1f; 这个问…

网络工程师----第二十七天

计算机基 第四章&#xff1a;网络层 网络层提供服务的特点&#xff1a;网络层向上只提供简单的、无连接的、尽最大努力交付的数据报服务&#xff0c;不保证可靠通信。 网际协议IP&#xff1a; *地址解析协议ARP(Address Resolution Protocol) *网际控制报文协议ICMP(Inter…

分享一个非常好用的安装包下载网站

当我们需要下载linux下的某些包,以便在自己的环境下进行编译自己的安装包的时候,可能需要用到一些各种版本的依赖包,从网上 百度会很麻烦。 这里分享一个很好用的安装包下载网站,记得点赞收藏 网站: Red Hat Enterprise Linux Repositories - pkgs.org 找到对应系统,然…

【Java的抽象类和接口】

1. 抽象类 1.1 抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果 一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 以上代码中…

4.Jmeter阶梯加压Stepping Thread Group

1. 先去Jmeter下载地址下载PluginsManager&#xff0c;放置在Jmeter的lib/ext 目录下 &#xff0c;重启Jmeter 2. 在插件管理器查找并安装jpgc - Standard Set,重启Jmeter 3.右键测试计划->添加->Threads(Users)->jpgc - Stepping Thread Group 然后设置阶梯加压参数…

【保姆级教程】如何将火爆全网的Kimi接入微信公众号,成为你的专属AI智能客服

【保姆级教程】如何将火爆全网的Kimi接入微信公众号&#xff0c;成为你的专属AI智能客服 在数字化转型的浪潮中&#xff0c;企业越来越重视利用人工智能技术提升客户服务的效率和质量。Kimi 作为一款功能强大的AI智能助手&#xff0c;能够理解自然语言、提供信息搜索、解析网址…

图像/视频恢复和增强CodeFormer

github&#xff1a;https://github.com/sczhou/CodeFormer 尝试增强旧照片/修复人工智能艺术 面部修复 面部色彩增强和恢复 脸部修复