首页 > 系统相关 >Arm-Linux子系统的互相Notify

Arm-Linux子系统的互相Notify

时间:2023-02-11 08:11:17浏览次数:48  
标签:struct chain 通知 Arm atomic Linux 子系统 notifier Notify

前言:

Linux下面不同的子系统一个个的组成了整个系统的运行环节,为了让这些子系统能够互相通讯,有一种叫做:notify chain(通知链)的东西。本篇看下。



概括

所谓通知链,有通知,就有执行的地方。比如A子系统通知B子系统,麻烦你帮我执行一件事情。这时候,A子系统就会通知B子系统,把需要执行的事情信息同时传递给B子系统,让其帮助执行。

这个过程,首先是需要有执行的事情,所以就需要注册。当注册好了之后,A子系统通知B子系统,B子系统就会找到注册的那个事情进行执行。

这里以原子通知链(Atomic notifier chains)为例,它分别由注册通知链,卸载通知链,以及调用通知链三种函数:

1. int atomic_notifier_chain_register(struct atomic_notifier_head *nh, struct notifier_block *n);  
2. int atomic_notifier_chain_unregister(struct atomic_notifier_head *nh, struct notifier_block *n);  
3. int atomic_notifier_call_chain(struct atomic_notifier_head *nh, unsigned long val, void *v);

还以上面的为例,假如A子系统需要通知B子系统你帮我完成一个事情。那么B子系统首先需要注册一个这个事情,通过函数:atomic_notifier_chain_register来完成。

当A子系统需要通知B子系统执行的时候,A子系统会调用atomic_notifier_call_chain来通知B子系统,你该做事了。

当A子系统不需要B子系统为它做事的时候,可以卸载掉这件事情:atomic_notifier_chain_unregister。

为什么会有卸载这个函数,因为所有的做事情的函数都在一个链表里面,当A子系统通知B子系统做事的时候,有可能会查找整个链表。当成百上千的子系统相互注册的时候,链表非常庞大,卸载这些事情(函数回调),可以很好的提高性能。




elf入口

当Arm32调用用户态的C Main的时候,堆栈里面的ret_from_fork就是通过原子调用链来执行的。

thread #1, stop reason = breakpoint 84.1
frame #0: 0x8010011c vmlinux`ret_from_fork at entry-common.S:142
frame #1: 0x801468b8 vmlinux`atomic_notifier_call_chain [inlined] __rcu_read_unlock at rcupdate.h:74:2
frame #2: 0x801468b4 vmlinux`atomic_notifier_call_chain [inlined] rcu_read_unlock at rcupdate.h:719:2
frame #3: 0x801468b4 vmlinux`atomic_notifier_call_chain(nh=<unavailable>, val=<unavailable>, v=<unavailable>) at notifier.c:199:2

另外一个需要注意的是Arm32的elf入口是通过读取内存异常的中断处理程序来调用用户态Glibc的_start函数入口。
而X64则是通过缺页异常来调用用户态Glibc的_start入口。



结尾

作者:江湖评谈
欢迎关注我,带你了解进阶技术。
image

标签:struct,chain,通知,Arm,atomic,Linux,子系统,notifier,Notify
From: https://www.cnblogs.com/tangyanzhi1111/p/17109577.html

相关文章

  • linux安装 mysql
    在终端中输入命令安装mysqlsudoapt-getinstallmysql-server安装成功后可以在终端中输入下面命令登录mysql不知道为什么,在网上搜索有的会说安装的时候会让你设置......
  • Linux 查看硬盘 smart 信息
    以下以Debian10举例安装smartmontools硬盘的SMART是S.M.A.R.T.的缩写,全称是“Self-Monitoring,AnalysisandReportingTechnology”,翻译为“自我监测分析与报告技......
  • linux002之linux目录结构
    在学习linux目录结构时,建议都是以命令来操作,虽然说它也有可视化界面,但是到企业当中,大部分面对的都是无界面的服务器,况且有界面的话也不用去学习,windows界面谁不会操作。 ......
  • #yyds干货盘点#Linux Curl 命令示例
        CURL是服务器上用于数据传输的命令行工具。CURL支持许多协议,例如:DICT,FILE,FTP,FTPS,GOPHER,HTTP,HTTPS,IMAP,IMAPS,LDAP,LDAPS,POP3,POP3S,RTM......
  • Linux系统配置NTP时钟服务器
    1、需要配置的计算机IP192.168.0.131bznode1192.168.0.134bznode2192.168.0.135b​znode3192.168.0.136bznode4设置IP=192.168.0.131为时钟服务器IP=192.168.0.134服......
  • ARM linux 系统调用实现原理
    https://blog.csdn.net/u013836909/article/details/120962422 LinuxARM系统调用过程分析(一)——Linux编程中的API函数和系统调用的关系LinuxARM系统调用过程分析(二......
  • 嵌入式Linux—文件IO
    文件IO在Linux系统中,一切都是“文件”:普通文件、驱动程序、网络通信等等。所有的操作,都是通过“文件IO”来进行的。所以,很有必要掌握文件操作的常用接口。Linux系......
  • 服役已有6年:Linux Kernel 4.9正式终止支持
    Linux Kernel4.9收到4.9.337更新,并在kernel.org上被标记为EOL,这意味着该版本系统将正式终止支持,不再收到任何维护和安全更新。而这,距离LinuxKernel4.9推出,已经过......
  • linux下查看发行版本和内核版本
    1、查看发行版本cat/etc/*_release如:cat/etc.rocky_release或用lsb_release命令 2、查看内核版本cat/proc/version  或用uname-a ......
  • Linux系统的目录结构
    在Windows下,我们的整个硬盘实际上可以被分为多个磁盘驱动器:而在Linux中,没有C盘D盘这个概念,只有一句经典的话:"在Linux世界里,一切皆文件",而所有的文件都是位于根目录下的,Lin......