deepin-anything 源码刨析

前言:

deepin-anything:最初是为了满足快速索引文件列表。
kprobe:内核探针,可在内核调用函数前,埋点执行自定义逻辑。
pt_args:内核探针注册接口参数2,用于获取映射的寄存器值结构体。

内核侧模块 vfs_monitor

文件列表项:

├── arg_extractor.c 		对应架构 pt_args 结构参数获取接口文件
├── arg_extractor.h
├── event.c					缓存VFS事件操作接口文件
├── event.h
├── event_merge.c			VFS事件合并操作接口,屏蔽原生linux Event对最终结果影响,del(X) + new(X) => remove del(X)
├── event_merge.h
├── Makefile
├── module.c				内核模块入口
├── vfs_change_consts.h		文件actions映射枚举
├── vfs_fsnotify.c			vfs文件变动逻辑处理主文件
├── vfs_fsnotify.h
├── vfs_genl.c				vfs_evnet入口操作文件
├── vfs_genl.h
├── vfs_kgenl.h
├── vfs_kretprobes.c		kprobe操作文件
└── vfs_kretprobes.h		

module.c

    vfs_changed_func = vfs_notify_dentry_event;	//来自 vfs_genl.c 文件变动事件操作入口ret = init_vfs_genl();if (ret)goto init_vfs_genl_fail;#ifdef CONFIG_FSNOTIFY_BROADCASTret = init_vfs_fsnotify(get_event_merge_entry(vfs_changed_func)); // 重定向vfs_notify_dentry_event函数指针if (ret)goto init_event_source_fail;
#elseret = init_vfs_kretprobes(get_event_merge_entry(vfs_changed_func)); // 重定向vfs_notify_dentry_event函数指针if (ret)goto init_event_source_fail;
#endif
  • get_event_merge_entry 获取事件合并入口函数,来自 vfs_kretprobes.c
void *get_event_merge_entry(void *vfs_changed_func)
{vfs_changed_entry = vfs_changed_func;return do_event_merge;
}
  • init_vfs_fsnotify
static struct kretprobe *vfs_krps[] = {&do_mount_krp, &sys_umount_krp, &vfs_create_krp,&vfs_unlink_krp, &vfs_mkdir_krp, &vfs_rmdir_krp, &vfs_symlink_krp, &vfs_link_krp,&vfs_rename_krp, &security_inode_create_krp
}; //所有的kprobe结构int init_vfs_kretprobes(void *vfs_changed_func)
{int ret;ret = init_mnt_ns();if (ret)return ret;vfs_changed_entry = vfs_changed_func;ret = register_kretprobes(vfs_krps, sizeof(vfs_krps) / sizeof(void *)); // 注册kprobe流程if (ret < 0) {mpr_info("register_kretprobes failed, returned %d\n", ret);return ret;}mpr_info("register_kretprobes %ld ok\n", sizeof(vfs_krps) / sizeof(void *));return 0;
}
  • kprobe结构,来自 vfs_kretprobes.h
#define _DECL_CMN_KRP(fn, symbol) static struct kretprobe fn##_krp = {\.entry_handler  = on_##fn##_ent,\.handler        = on_##fn##_ret,\.data_size      = sizeof(struct fn##_args),\.maxactive      = 64,\.kp.symbol_name = ""#symbol"",\};#define DECL_CMN_KRP(fn) _DECL_CMN_KRP(fn, fn)

该部分定义 kprobe 结构体应用于注册探针。即do_mount_krp 埋点 path_mount 如下:

#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 9, 0)
DECL_CMN_KRP(do_mount);
#else
_DECL_CMN_KRP(do_mount, path_mount); // do_mount_krp 埋点 函数为  path_mount
#endif#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 17, 0)
DECL_CMN_KRP(sys_umount);
#elif LINUX_VERSION_CODE < KERNEL_VERSION(5, 9, 0) // 内核版本标识
_DECL_CMN_KRP(sys_umount, ksys_umount); // sys_umount_krp 埋点函数为 ksys_umount
#else
_DECL_CMN_KRP(sys_umount, path_umount);
#endif

该部分定义kprobe的函数入口与kprobe操作函数

#define DECL_VFS_KRP(fn, act, de_i) static int on_##fn##_ent(struct kretprobe_instance *ri, struct pt_regs *regs)\{\return common_vfs_ent((struct vfs_event **)&(ri->data), (struct dentry *)get_arg(regs, de_i));\}\\static int on_##fn##_ret(struct kretprobe_instance *ri, struct pt_regs *regs)\{\return common_vfs_ret((struct vfs_event **)&(ri->data), regs, act);\}\\static struct kretprobe fn##_krp = {\.entry_handler  = on_##fn##_ent,\.handler        = on_##fn##_ret,\.data_size      = sizeof(struct vfs_event *),\.maxactive      = 64,\.kp.symbol_name = ""#fn"",\};

宏调用如下

DECL_VFS_KRP(vfs_create, ACT_NEW_FILE, 3); // 参数1为埋点符号,参数2文件操作,参数3获取参数寄存器 return regs->dx;
DECL_VFS_KRP(vfs_unlink, ACT_DEL_FILE, 3);
DECL_VFS_KRP(vfs_mkdir, ACT_NEW_FOLDER, 3);
DECL_VFS_KRP(vfs_rmdir, ACT_DEL_FOLDER, 3);
DECL_VFS_KRP(vfs_symlink, ACT_NEW_SYMLINK, 3);
DECL_VFS_KRP(security_inode_create, ACT_NEW_FILE, 2); // return regs->si;

vfs_changed_entry 函数绑定到 do_event_merge,init_vfs_kretprobes函数中:

vfs_changed_entry = vfs_changed_func;

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

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

相关文章

5个GitHub热门算法岗面试攻略,附资源下载

最近听行内的大佬们讨论&#xff0c;说今年的秋招情况依旧卷的激烈&#xff0c;不知道大家有没有都拿到满意的offer&#xff1f; 已经拿到的同学我先给赞个&#xff0c;还没有获得心仪offer的同学也不要着急&#xff0c;当下最该做的就是抓紧时间提升自己的硬实力&#xff0c;…

openssl创建CA证书教程

配置生成CA证书 总示意图&#xff1a; (1)&#xff0c;通过openssl创建CA证书 第一步&#xff1a;创建一个秘钥&#xff0c;这个便是CA证书的根本&#xff0c;之后所有的东西都来自这个秘钥 # 通过rsa算法生成2048位长度的秘钥 openssl genrsa -out myCA.key 2048 第二步&#…

小谈设计模式(5)—开放封闭原则

小谈设计模式&#xff08;5&#xff09;—开放封闭原则 专栏介绍专栏地址专栏介绍 开放封闭原则核心思想关键词概括扩展封闭 解释抽象和接口多态 代码示例代码解释 优缺点优点可扩展性可维护性可复用性高内聚低耦合 缺点抽象设计的复杂性需要预留扩展点可能引入过度设计 总结 专…

uniapp 使用subNVue原生子窗体显示弹框或悬浮框

效果展示 在uniapp中&#xff0c;我们可以使用subNVue原生子窗体来解决web-view等原生页面中弹框无法显示的问题。 subNVue原生子窗体是uniapp提供的一种原生组件&#xff0c;可以在uniapp中嵌入原生页面&#xff0c;并且可以与uniapp页面进行通信。我们可以在原生页面中使用…

前后端分离的低代码快速开发框架

低代码开发正逐渐成为企业创新的关键工具。通过提高开发效率、降低成本、增强灵活性以及满足不同用户需求&#xff0c;低代码开发使企业能够快速响应市场需求&#xff0c;提供创新解决方案。选择合适的低代码平台&#xff0c;小成本组建一个专属于你的应用。 项目简介 这是一个…

什么是硬编码

2023年9月21日&#xff0c;周四下午 昨天在某个地方看到了“硬编码”&#xff0c;当时不明白是什么意思&#xff0c;于是今天就研究了一下 目录 硬编码定义缺点举例说明什么是硬编码1. 直接在代码中写入文件路径&#xff1a;2. 在代码中直接指定常量值&#xff1a;3. 将固定的…

Vue.js的服务器端渲染(SSR):为什么和如何

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

开户期权必看!期权有什么好的平台,优势在哪里?

有50W满足上述期权开户条件的可以选择在证券或者期货券商端口开通,不过都只能线下去柜台营业部开通。不满足可以选择第三方期权分仓开户,下文介绍开户期权必看&#xff01;期权有什么好的平台&#xff0c;优势在哪里&#xff1f;本文来自&#xff1a;期权酱 一、开户期权基础知…

js中如何实现一个简单的防抖函数?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 防抖函数⭐ 使用示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏…

并发编程——Future CompletableFuture

文章目录 Future介绍FutureTask使用FutureTask 分析CompletableFutureCompletableFuture的应用CompletableFuture 示例 总结 Future介绍 Java创建线程的方式&#xff0c;一般常用的是Thread&#xff0c;Runnable。如果需要当前处理的任务有返回结果的话&#xff0c;需要使用Ca…

Linux——(第十一章)软件包管理

目录 一、RPM 1.概述 2.RPM查询指令 3.RPM卸载指令 4.RPM安装命令 二、YUM 1.概述 2.YUM常用命令 一、RPM 1.概述 RPM&#xff08;RedHat Package Manager&#xff09;&#xff0c;RedHat软件包管理工具&#xff0c;类似windows里面的setup.exe是Linux这系列操作系统里…

Hadoop初识及信息安全(大数据的分布式存储和计算平台)

目录 什么是Hadoop Hadoop的特点 Hadoop优点 Hadoop的缺点 Hadoop的重要组成 信息安全 什么是Hadoop Hadoop 是一个适合大数据的分布式存储和计算平台。 Hadoop的广义和狭义区分&#xff1a; 狭义的Hadoop:指的是一个框架&#xff0c;Hadoop是由三部分组成&#xff1a;H…

机器视觉-标定篇

3D结构光标定 结构光视觉的优点&#xff1a; 非接触、信息量大、测精度高、抗干扰能力强。 结构光视觉传感器参数的标定包括&#xff1a;摄像机参数标定、结构光平面参数标定。 结构光视觉测量原理图 我们不考虑镜头的畸变&#xff0c;将相机的成像模型简化为小孔成像模型…

ClickHouse面向列的数据库管理系统(原理简略理解)

目录 官网 什么是Clickhouse 什么是OLAP 面向列的数据库与面向行的数据库 特点 为什么面向列的数据库在OLAP场景中工作得更好 为什么ClickHouse这么快 真实的处理分析查询 OLAP场景的关键属性 引擎作用 ClickHouse引擎 输入/输出 CPU 官网 https://clickhouse.com…

Flink-CDC 抽取SQLServer问题总结

Flink-CDC 抽取SQLServer问题总结 背景 flink-cdc 抽取数据到kafka 中&#xff0c;使用flink-sql进行开发&#xff0c;相关问题总结flink-cdc 配置SQLServer cdc参数 1.创建CDC 使用的角色, 并授权给其查询待采集数据数据库 -- a.创建角色 create role flink_role;-- b.授权…

Direct3D融合技术

该技术能使我们将当前要进行光栅化的像素的颜色与先前已已光栅化并处于同一位置的像素的颜色进行合成&#xff0c;即将正在处理的图元颜色值与存储在后台缓存中的像素颜色值进行合成(混合)&#xff0c;利用该技术我们可得到各种各样的效果&#xff0c;尤其是透明效果。 在融合…

zookeeper未授权漏洞复现及处理

一、漏洞详情 Zookeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服…

华为云云耀云服务器L实例评测|云耀云服务器L实例的购买及使用体验

华为云云耀云服务器L实例评测&#xff5c;云耀云服务器L实例的购买及使用体验 一、云耀云服务器L实例介绍1.1 云耀云服务器L实例简介1.2 云耀云服务器L实例特点1.3 云耀云服务器L实例使用场景 二、云耀云服务器L实例支持的镜像2.1 镜像类型2.2 系统镜像2.3 应用镜像 三、购买云…

前端悬浮菜单的实现方法及完整代码示例

前言 悬浮菜单作为网页设计中常见的交互元素&#xff0c;通常被用于展示常用功能或导航链接。 在前端开发领域中&#xff0c;我们可以利用纯CSS技术实现一个简单的悬浮菜单。 本文将详细介绍实现悬浮菜单的方法&#xff0c;并提供一个完整的代码示例。 实现方法 要实现一个悬浮…

nginx中的location指令用法

在Nginx中&#xff0c;location指令用于定义如何处理特定类型的请求。它通常用于定义不同的URL匹配规则和相应的处理方式。 以下是location指令的一般用法 location [|~|~*|^~] /uri/ {# 处理指令 }&#xff1a;表示精确匹配。只有当请求的URL与指定的URL完全匹配时&#xff…