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指向的地址


相关推荐
豆是浪个1 小时前
Linux(Centos 7.6)命令详解:usermod
linux·运维·centos
极地星光2 小时前
网络检测:Linux下实时获取WiFi与热点状态
linux·网络
还是奇怪5 小时前
Linux - 安全排查 3
android·linux·安全
NUZGNAW5 小时前
VMware安装Centos 7
linux·运维·centos
Another Iso5 小时前
CentOs 7 MySql8.0.23之前的版本主从复制
linux·mysql·centos
A7bert7776 小时前
【YOLOv8-obb部署至RK3588】模型训练→转换RKNN→开发板部署
linux·c++·人工智能·python·yolo
筑梦之路6 小时前
linux 系统找出磁盘IO占用元凶 —— 筑梦之路
linux·运维·服务器
LiQiang337 小时前
Ubuntu2404修改国内镜像
linux
杰哥技术分享7 小时前
Ubuntu 22.04安装SQL Server指南
linux·运维·ubuntu·sqlserver
遇见火星7 小时前
ubuntu18.04 升级Ubuntu 20.04
linux·运维·ubuntu·系统升级