2023-9

2023-09-18 17:40:51

内核向应用层发送netlink单播消息:
nlmsg_unicast -> netlink_unicast -> netlink_sendskb -> __netlink_sendskb -> 把skb链入struct sock 的 sk_receive_queue 链表中,再调用sk->sk_data_ready(sk); -> sock_def_readable -> wake_up_interruptible_sync_poll

sk_sleep 获取对应struct sock的 wait_queue_head_t
sk_wait_data
tcp_recvmsg Linux 内核中用于接收 TCP 数据的函数(发送 TCP 数据的函数是 tcp_sendmsg)

内核向应用层发送netlink多播消息:
nlmsg_multicast -> netlink_broadcast -> netlink_broadcast_filtered -> do_one_broadcast -> netlink_broadcast_deliver -> __netlink_sendskb -> sk->sk_data_ready(sk); -> netlink_data_ready -> BUG();

内核netlink套接字是无论如何也不能发送 / 接收到组播消息的。register_pernet_subsys -> register_pernet_operations -> __register_pernet_operations -> ops_init -> ops->init(net); -> rtnetlink_net_ops.init -> rtnetlink_net_init -> netlink_kernel_create -> __netlink_kernel_create -> sk->sk_data_ready = netlink_data_ready;

__netlink_create -> sock_init_data ?
但是对于应用层netlink套接字,该sk_data_ready()钩子函数在初始化netlink函数sock_init_data()中被注册为sock_def_readable()
二者流程上有什么不同导致了 hook不一样,一个是socket系统调用,一个是内核netlink socket

kobject_uevent -> kobject_uevent_env -> netlink_broadcast_filtered


struct iovec 用于描述一块连续的内存区域,它包含了指向数据缓冲区的指针和缓冲区的大小。

这个结构体有两个成员变量:

void *iov_base:指向数据缓冲区的指针,通常是一个 void * 类型。它指向实际的数据存储区域。
size_t iov_len:指定了数据缓冲区的大小,以字节为单位。


在这里插入图片描述


用户态调用socket时,返回一个fd,在内核会有一个struct socket 和 struct sock 与这个fd对应,这两个对象都是在socket调用时创建并初始化的。

基于这个socket fd找到对应的struct socket过程:
sockfd_lookup_light
fdget 获取到对应的fd (struct fd类型)
sock_from_file :若 struct fd类型的file成员,struct file类型为 socket_file类型,判断f_op是否为socket_file_ops
要找的struct socket即为struct file的private_data成员


进程的fd如何找到对应的文件结构体?

fdget的入参是int,返回的struct fd,其函数内部:首先获取当前函数所在的strut task_struct,在获取其struct files_struct files成员访问进程的打开文件相关信息,struct files_struct files的fdt成员的fd成员,fd成员是一个数组,入参即为数组下标


SP_EL0是ARM处理器中的一个特权级别,用于指向用户态的堆栈指针(Stack Pointer)。
ARM处理器的特权级别分为:EL0(用户态)、EL1(内核态)、EL2(虚拟化扩展)、EL3(安全监管),其中EL0是最低特权级别。

在EL0特权级别下运行的代码是:用户态的应用程序,其访问权限和功能受到一定限制,无法直接访问系统级的资源和特权指令。SP_EL0指针用于指向用户态应用程序的堆栈,用于存储函数调用、局部变量和返回地址等数据。

当处理器从内核态(EL1)切换到用户态(EL0)时,SP_EL0会被设置为用户态的堆栈指针,以便应用程序在用户态下正常运行。
同样,当处理器从用户态切换回内核态时,SP_EL0会被保存,以便在需要时恢复用户态堆栈的状态。

总之,SP_EL0是ARM处理器中用于指向用户态堆栈的特权级别寄存器。它在EL0特权级别下被设置和使用,以支持用户态应用程序的正常运行。

在arm64中,current就是 get_current内联函数宏,会返回一个 struct task_struct指针,这个指针指向的地址就是 sp_el0指向的地址


更多推荐

汽车自适应巡航系统车距控制策略研究

摘要:由于汽车自适应巡航控制系统的非线性和不确定性等问题,传统的非线性系统等效线性化方法难以满足系统的精度、稳定度和快速性的要求,因此提出了一种基于模糊控制理论的自适应巡航控制器的设计方法。通过对汽车距离差和相对速度的计算和推理,实时调整本车加速度,保证本车能够在一定的安全车距下跟随前车。通过在Matlab/Simul

虹科案例 | LIN/CAN总线汽车零部件测试方案

文章来源:虹科汽车电子点此阅读原文虹科的LIN/CAN总线汽车零部件测试方案是一款优秀的集成套装,基于Baby-LIN系列产品,帮助客户高效完成在测试、生产阶段车辆零部件质量、功能、控制等方面的检测工作。1、汽车零部件测试的重要性?汽车零部件的测试对于确保汽车的安全性、功能性和可靠性起着至关重要的作用。LIN/CAN通

驱动开发DAY4

驱动代码#include<linux/init.h>#include<linux/module.h>#include<linux/cdev.h>#include<linux/fs.h>#include<linux/device.h>#include<linux/uaccess.h>#include<linux/slab

【Pytest实战】Pytest+Allure+Jenkins自动化测试框架搭建

😄作者简介:小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊座右铭:不想当开发的测试,不是一个好测试✌️。如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍之前分享过Pytest基础知识,可参考Pytest实战专栏

创建Scrapy项目

创建Scrapy项目的步骤如下:安装Scrapy:在终端或命令提示符中运行以下命令来安装Scrapy:pipinstallscrapy创建Scrapy项目:在终端或命令提示符中,使用以下命令创建一个新的Scrapy项目:scrapystartproject<project_name>其中,<project_name>是

【详细教程hexo博客搭建】1、从零开始搭建一个能用的博客

1、开始2.环境与工具准备本教程主要面对的是Windows用户操作系统:Windows10NodeGitHexo文本编辑器(强烈推荐VSCODE)GitHub帐号一个域名(强烈推荐买个域名)云服务器(可选)3.Node的安装打开Node官网,下载和自己系统相配的Node的安装程序,否则会出现安装问题。下载地址:Down

Vue-devTools安装—创建项目方法2 ui创建——Vue指令综合案例——汽车品牌管理

目录项目源代码:一、vue-devTools安装二、案例功能实现1、新建项目(ui创建)2、cnpm导入项目依赖库3、删除不需要的代码结构:4、修改代码结构5、添加汽车品牌插件安装bootstrap的提示功能添加bootstrap样式6、删除汽车品牌7、查询汽车品牌(过滤)项目源代码:Vue指令综合案例——汽车品牌管理

(二十九)大数据实战——kafka集群节点服役与退役案例实战

前言本节内容是关于kafka集群节点的服役与退役,从而实现kafka集群的缩容与扩容。在开始本节内容之前,我们要预先安装好kafka集群,并准备一台空余的服务器用来完成我们扩容与缩容的案例。关于kafka集群的安装内容这里不在赘述,相关内容请查看作者往期博客内容。正文从hadoop103克隆一台空闲服务器hadoop1

QT信号槽实现原理

定义Q_OBJECT宏在宏中声明了几个重要的成员变量及成员函数,包括声明了一个只读的静态成员变量staticMetaObject,以及3个public的成员函数staticconstQMetaObjectstaticMetaObject;virtualconstQMetaObject*metaObject()const

低代码之IVX

低代码之IVX一、如何去分析不同的低代码平台🧝‍♂️1.看自己的网站和平台是不是通过自己的低代码/无代码平台生成的2.生成源代码的能力3.可视化的逻辑编排二、低代码平台未来的发展方向👨‍🌾三、优质低代码平台介绍👨‍💼1.什么是iVX:2.iVX和其它低代码平台的区别上手步骤1.1iVX线上集成环境进入1.2创

python爬虫——爬取豆瓣top250电影数据(适合初学者)

前言:爬取豆瓣top250其实是初学者用于练习和熟悉爬虫技能知识的简单实战项目,通过这个项目,可以让小白对爬虫有一个初步认识,因此,如果你已经接触过爬虫有些时间了,可以跳过该项目,选择更有挑战性的实战项目来提升技能。当然,如果你是小白,这个项目就再适合不过了。那么就让我们开始吧!目录一、实战1.对豆瓣网网站进行Ajax

热文推荐