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


相关推荐
achene_ql10 分钟前
select、poll、epoll 与 Reactor 模式
linux·服务器·网络·c++
藥瓿亭11 分钟前
K8S认证|CKS题库+答案| 9. 网络策略 NetworkPolicy
linux·运维·docker·云原生·容器·kubernetes·cks
千千寰宇26 分钟前
[数据传输/网络传输/序列化/计算机组成原理] 字节序/大小端
linux·计算机组成原理/硬件/半导体
LFloyue34 分钟前
Linux离线(zip方式)安装docker
linux·docker
Blue桃之夭夭1 小时前
深入理解Optional:处理空指针异常
linux·windows·microsoft
什么半岛铁盒2 小时前
Linux线程与进程关系及底层实现
java·linux·运维
简朴-ocean3 小时前
如何删除linux空的文件夹
linux·运维·服务器
Code Warrior3 小时前
【Linux】Linux基础指令3
linux·服务器
南朝雨3 小时前
linux下安装elasticsearch及ik分词器
linux·elasticsearch·全文检索
leblancAndSherry3 小时前
Gitlab + Jenkins 实现 CICD
linux·运维·docker·kubernetes·gitlab·jenkins