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


相关推荐
weixin_511255219 小时前
NGINX常用配置
linux·服务器·nginx
昌原的儿子LEO10 小时前
进程和线程(2)
linux·服务器·网络
会飞的土拨鼠呀11 小时前
Linux 真实内存使用率的核心计算标准
linux·运维·服务器
陈年老古董12 小时前
CentOS编译安装Python3.11完整教程
linux·笔记·学习·centos·python3.11
深念Y12 小时前
为什么选 Go:直观、可维护、AI 友好
linux·开发语言·人工智能·golang·agent·harness
笨笨饿12 小时前
#111_关于FreeRTOS面试的一些题目
linux·ubuntu·面试·职场和发展·centos·rtos
当代红领巾12 小时前
VMware 里装好 Linux 系统没有 ipv4 地址?
linux·运维·服务器
老当益壮梁奶奶12 小时前
Linux 软件编程学习笔记(六):线程编程入门与实践
linux·c语言·c++·笔记·学习
2401_8685347813 小时前
运维工程师大厂 Nginx 面试题(二)
linux·网络协议
M78佐菲13 小时前
Linux学习笔记:文件IO
linux·笔记·学习·算法