2023-9

内核向应用层发送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指向的地址


相关推荐
dbkx_2911 分钟前
个人自用debian启动
linux·运维·debian
dualven_in_csdn2 小时前
搞了两天的win7批处理脚本问题
java·linux·前端
晨曦backend3 小时前
Vim 匹配跳转与搜索命令完整学习笔记
linux·编辑器·vim
爬呀爬的水滴5 小时前
解决Ubuntu24.04版本,右键没有共享选项的问题
linux·服务器·ubuntu·samba·共享文件夹
IT coke5 小时前
centos7部署AWStats日志分析系统
linux·运维·centos
雾岛心情5 小时前
【黑客与安全】Linux的常用命令之系统架构信息获取系列命令
linux·运维·服务器
杯莫停丶6 小时前
Linux基础指令大全
linux·运维·chrome
卫生纸不够用7 小时前
(三)Linux性能优化-CPU-CPU 使用率
linux·运维·服务器
Clownseven8 小时前
Ubuntu 24.04 LTS 长期支持版发布:对服务器用户意味着什么?新特性、升级建议与性能影响初探
linux·服务器·ubuntu
Xam_d_LM8 小时前
【Linux】服务器反向代理自动续签免费 Let‘s Encrypt 证书报错解决方法
linux·运维·服务器·反向代理·lets encrypt·http-01·证书续签