前言:

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入口。

结尾

作者:江湖评谈

欢迎关注我,带你了解进阶技术。

Arm-Linux子系统的互相Notify的更多相关文章

  1. ARM Linux启动代码分析

    前言 在学习.分析之前首先要弄明白一个问题:为什么要分析启动代码? 因为启动代码绝大部分都是用汇编语言写的,对于没学过或者不熟悉汇编语言的同学确实有一定难度,但是如果你想真正深入地学习Linux,那么 ...

  2. ARM Linux从Bootloader、kernel到filesystem启动流程

    转自:http://www.veryarm.com/1491.html ARM Linux启动流程大致为:bootloader ---->kernel---->root filesyste ...

  3. ARM linux的启动部分源代码简略分析【转】

    转自:http://www.cnblogs.com/armlinux/archive/2011/11/07/2396784.html ARM linux的启动部分源代码简略分析 以友善之臂的mini2 ...

  4. Win10 LTSC 2019 安装和卸载 linux 子系统

    一.开启 二.下载 https://docs.microsoft.com/zh-cn/windows/wsl/install-manual   手动下载适用于 Linux 的 Windows 子系统发 ...

  5. arm linux 支持 wifi (wpa_supplicant)

    背景: 公司用的产品主板支持wifi接口,为了加强产品的功能,做wifi的底层支持. 有关知识点:浅谈 Linux 内核无线子系统 概览 主要的流程如下: 内核配置 + 有关驱动的移植 + 软件的移植 ...

  6. ARM Linux Qt 5.x.x 无标题栏

    /********************************************************************************* * ARM Linux Qt 5. ...

  7. 构建 ARM Linux 4.7.3 嵌入式开发环境 —— BusyBox 构建 RootFS

    上一篇我们已经成功将 ARM Linux 4.7.3 的内核利用 U-BOOT 引导了起来.但是细心的你会发现,引导到后面,系统无法启动,出现内核恐慌 (Kernel Panic). 原因是找不到文件 ...

  8. 构建 ARM Linux 4.7.3 嵌入式开发环境 —— U-BOOT 引导 Kernel

    经过若干天的反复测试,搜索.终于成功利用 Qemu 在 u-boot 下引导 ARM Linux 4.7.3 内核.如下详细解释整个构建过程. 准备环境 运行环境:Ubuntu 16.04 需要的虚拟 ...

  9. ARM Linux 3.x的设备树(Device Tree)

    http://blog.csdn.net/21cnbao/article/details/8457546 宋宝华 Barry Song <21cnbao@gmail.com> 1.     ...

  10. ARM Linux 3.x的设备树(Device Tree)

    1. ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a f*cking pai ...

随机推荐

  1. 畅联新增插件:新增依爱NB烟感

    双美接入,C++版,就是解析Json时稍微有点问题,依爱这边的Json格式,Value字段竟然是单引号....呵呵,反正也解决了. 备注一下:电信模式,AEP平台模式.

  2. 【题解】CF1659E AND-MEX Walk

    题目传送门 位运算 设题目中序列 \(w_1,w_1 \& w_2,w_1 \& w_2 \& w_3,\dots,w_1 \& w_2 \& \dots \& ...

  3. elasticsearch聚合之bucket terms聚合

    目录 1. 背景 2. 前置条件 2.1 创建索引 2.2 准备数据 3. 各种聚合 3.1 统计人数最多的2个省 3.1.1 dsl 3.1.2 运行结果 3.2 统计人数最少的2个省 3.2.1 ...

  4. 第2-3-5章 删除附件的接口开发-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss

    目录 5.4 接口开发-根据id删除附件 5.4.1 接口文档 5.4.2 代码实现 5.4.3 接口测试 5.4.4 测试ALI和FAST_DFS以及MINIO上传和删除的接口 5.4.4.1 阿里 ...

  5. Cache的相关知识(二)

    1. cache背景知识 为什么的CPU内部需要cache单元?   主要的原因是CPU的速度和内存的速度之间严重不匹配,Cpu处理速度极快,而访问内存慢,cache在这个背景下就诞生了.设计人员通过 ...

  6. mingw编译opencv动态链接库和静态链接库及使用方法

    前言 我一直不知道编译的过程以及cmake, make 这些工具是干什么的,所有抽时间研究了一下. 简单来说就是 cmake 是根据 CMakeLists.txt 用来生成 makefile文件的.而 ...

  7. Docker定时删除none镜像

    在使用docker的时候会产生none镜像文件,偶尔没什么,但是比如使用了自动化部署工具那就不一样了,一天没准就上百个none镜像了,非常消耗资源,所以需要定时清理 删除 none 镜像命令 dock ...

  8. js-day05-对象

    为什么要学习对象 没有对象时,保存网站用户信息时不方便,很难区别 对象是什么 1.对象是一种数据类型 2.无序的数据集合 对象有什么特点 1.无序的数据的集合 2.可以详细的描述某个事物' 对象使用 ...

  9. Kubernetes(k8s)存储管理之数据卷volumes(五):动态制备-存储类StorageClass

    目录 一.系统环境 二.前言 三.静态制备和动态制备 四.存储类StorageClass 4.1 存储类StorageClass概览 4.2 StorageClass 资源 五.创建存储类Storag ...

  10. choices参数

    目录 一:choices参数 1.choices参数作用 2.列举: 3.choices效果 二:choices使用 1.创建字段类型 2.验证choices 3.使用测试脚本 4.将manage.p ...