Arm-Linux子系统的互相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入口。
结尾
作者:江湖评谈
欢迎关注我,带你了解进阶技术。
Arm-Linux子系统的互相Notify的更多相关文章
- ARM Linux启动代码分析
前言 在学习.分析之前首先要弄明白一个问题:为什么要分析启动代码? 因为启动代码绝大部分都是用汇编语言写的,对于没学过或者不熟悉汇编语言的同学确实有一定难度,但是如果你想真正深入地学习Linux,那么 ...
- ARM Linux从Bootloader、kernel到filesystem启动流程
转自:http://www.veryarm.com/1491.html ARM Linux启动流程大致为:bootloader ---->kernel---->root filesyste ...
- ARM linux的启动部分源代码简略分析【转】
转自:http://www.cnblogs.com/armlinux/archive/2011/11/07/2396784.html ARM linux的启动部分源代码简略分析 以友善之臂的mini2 ...
- Win10 LTSC 2019 安装和卸载 linux 子系统
一.开启 二.下载 https://docs.microsoft.com/zh-cn/windows/wsl/install-manual 手动下载适用于 Linux 的 Windows 子系统发 ...
- arm linux 支持 wifi (wpa_supplicant)
背景: 公司用的产品主板支持wifi接口,为了加强产品的功能,做wifi的底层支持. 有关知识点:浅谈 Linux 内核无线子系统 概览 主要的流程如下: 内核配置 + 有关驱动的移植 + 软件的移植 ...
- ARM Linux Qt 5.x.x 无标题栏
/********************************************************************************* * ARM Linux Qt 5. ...
- 构建 ARM Linux 4.7.3 嵌入式开发环境 —— BusyBox 构建 RootFS
上一篇我们已经成功将 ARM Linux 4.7.3 的内核利用 U-BOOT 引导了起来.但是细心的你会发现,引导到后面,系统无法启动,出现内核恐慌 (Kernel Panic). 原因是找不到文件 ...
- 构建 ARM Linux 4.7.3 嵌入式开发环境 —— U-BOOT 引导 Kernel
经过若干天的反复测试,搜索.终于成功利用 Qemu 在 u-boot 下引导 ARM Linux 4.7.3 内核.如下详细解释整个构建过程. 准备环境 运行环境:Ubuntu 16.04 需要的虚拟 ...
- ARM Linux 3.x的设备树(Device Tree)
http://blog.csdn.net/21cnbao/article/details/8457546 宋宝华 Barry Song <21cnbao@gmail.com> 1. ...
- 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 ...
随机推荐
- redis的缓存穿透、击穿、雪崩以及实用解决方案
今天来聊聊redis的缓存穿透.击穿.雪崩以及解决方案,其中解决方案包括类似于布隆过滤器这种网上一搜一大片但是实际生产部署有一定复杂度的,也有基于spring注解通过一行代码就能解决的,其中各有优劣, ...
- 【笔记】入门DP(Ⅱ)
0X00 P1433 吃奶酪 状压 \(DP\),把经过的点压缩成01串.若第 \(i\) 位为 \(0\) 表示未到达,为 \(1\) 则表示已到达. 用 \(f[i][j]\) 表示以 \(i\) ...
- Linux C++目标中添加git版本信息
项目代码根目录下添加一个cmake文件git_version.cmake,内容如下: # get git hash macro(get_git_hash _git_hash) set(ENV{GIT_ ...
- 【Linux】/proc/stat解析
一. 概述 1.1 CPU时间 cpu指标 含义user 用户态时间nice 用户态时间(低优先级,nice>0)system 内核态时间idle 空闲时间iowait I/O等待时间irq 硬 ...
- AIBOX视频边缘计算终端,助力识别人员违规行为!
目前,制造业工厂工作区布局分散,生产安全质量控制难度较大.人员擅自离岗.玩手机.区域入侵.吸烟.未穿反光衣.异物占位等违法行为不能及时控制,安全风险十分巨大.如果手动检查或通过人眼检查监控录像,不仅产 ...
- 论文解读(PCL)《Probabilistic Contrastive Learning for Domain Adaptation》
论文信息 论文标题:Probabilistic Contrastive Learning for Domain Adaptation论文作者:Junjie Li, Yixin Zhang, Zilei ...
- 一个简单的工具开发:从学生端更新程序部署工具说起,浅谈qt中自定义控件制作和调用、TCP协议下文件的收发 、以及可执行文件的打包
一个简单的工具开发:从学生端更新程序部署工具说起,浅谈qt中ui的使用和TCP协议下文件的收发.以及可执行文件的打包 写在前面,Qt Designer是一个非常操蛋的页面编辑器,它非常的...怎么说呢 ...
- PTA散列表平方探测法解决冲突
PTA散列表平方探测法解决冲突 核心问题 当所有的位置都被填上了,且不能插入关键词,要进入死循环了怎么办? 题目 本题的任务很简单:将给定的无重复正整数序列插入一个散列表,输出每个输入的数字在 ...
- SQLMap入门——判断文本中的请求是否存在注入
从文件中加载HTTP请求,SQLMap可以从一个文本文件中获取HTTP请求,这样就可以不设置其他参数(如cookie.POST数据等),txt文件中的内容为Web数据包 文本文件如图(请求数据可以通过 ...
- 教你用JavaScript实现计数器
案例介绍 欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个计数器.点击按钮数字改变,点击重置数字归0.通过实战我们将学会forEach循环.c ...