当前位置: 首页 > news >正文

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


http://www.lryc.cn/news/174929.html

相关文章:

  • 软考高级+系统架构设计师教程+第二版新版+电子版pdf
  • 【产品运营】如何提升B端产品竞争力(下)
  • uniapp 微信小程序使用echarts
  • 【漏洞复现】企望制造 ERP命令执行
  • 2023 “华为杯” 中国研究生数学建模竞赛(E题)深度剖析|数学建模完整代码+建模过程全解全析
  • 【腾讯云国际站】CDN内容分发网络特性介绍
  • 【工业机器人视觉】
  • 跨域(浏览器)
  • Leetcode 2866. Beautiful Towers II
  • 电脑C盘爆红怎么办?(小白篇)
  • Office Xml 2003转XLSX
  • skyWalking搭建(一)
  • Golang开发--sync.WaitGroup
  • Linux命令教程:使用cat命令查看和处理文件
  • Websocket集群解决方案以及实战(附图文源码)
  • 科技的成就(五十一)
  • Tomcat8 任意写文件PUT方法 (CVE-2017-12615)
  • SAP服务器修改主机名操作手册
  • 【大数据】Doris 构建实时数仓落地方案详解(一):实时数据仓库概述
  • C++ list容器的实现及讲解
  • 前端项目练习(练习-002-NodeJS项目初始化)
  • C++QT day11
  • Stable DIffusion 炫酷应用 | AI嵌入艺术字+光影光效
  • C#通过重写Panel改变边框颜色与宽度的方法
  • Vue2+ElementUI 静态首页案例
  • Linux的socket通信
  • MySQL学习大纲
  • 【Ambari】银河麒麟V10 ARM64架构_安装Ambari2.7.6HDP3.3.1(HiDataPlus)
  • 驱动开发练习,platform实现如下功能
  • QT之QString的用法介绍