linux arm panic,ARM Linux 内核 panic 之cache 一致性 ——Cortex-A9多核cache和TLB一致性广播...
ARM Linux 内核 panic 之cache 一致性 ——Cortex-A9多核cache和TLB一致性广播
Cortex-A9的多喝CPU可以接收和执行一致性广播操作,当其使能并处于SMP模式时。本文以内核的panic为例,在给出内核panic后的真正原因后,讨论Cortex-A9多核的cache和TLB的一致性广播,实际使用中应该怎么设置。
1 多核启动android失败
内核版本:3.0.15 CPU:Freescale Imx6Q(Cortex-A9四核)
芯片特点:支持ARM TrustZone
操作步骤:主核CPU0以Secure模式启动后,切换到NS模式,然后启动内核。内核启动其它的三个CPU,它们也会切换到NS模式,最后启动Android系统。
但是启动失败了,后来发现内核只是panic,并没有彻底死机。为了确认panic后的状态,在内核的 arch/arm/kernel/smp.c文件,do_local_timer函数中,打印CPU的ID和时钟节拍,发现panic后,这个中断患有,信息还可以打印出来。
原始日志如下:
[ 24.707074] request_suspend_state: wakeup (3->0) at 24564020006 (1970-01-02 00:14:26.233322336 UTC)
[ 24.719704] in panic, line:75 cpu:3
[ 24.726012] Kernel panic - not syncing: Attempted to kill init!
[ 24.732338] [] (unwind_backtrace+0x0/0xfc) from [] (panic+0x88/0x1b4)
[ 24.740586] [] (panic+0x88/0x1b4) from [] (do_exit+0x664/0x710)
[ 24.748278] [] (do_exit+0x664/0x710) from [] (do_group_exit+0x3c/0xbc)
[ 24.756581] [] (do_group_exit+0x3c/0xbc) from [] (get_signal_to_deliver+0x1f8/0x430)
[ 24.766107] [] (get_signal_to_deliver+0x1f8/0x430) from [] (do_signal+0x94/0x534)
[ 24.775440] [] (do_signal+0x94/0x534) from [] (do_notify_resume+0x38/0x44)
[ 24.784162] [] (do_notify_resume+0x38/0x44) from [] (work_pending+0x24/0x28)
[ 24.792971]CPU1: stopping
[ 24.795700] [] (unwind_backtrace+0x0/0xfc) from [] (do_IPI+0x188/0x1bc)
[ 24.804064] [] (do_IPI+0x188/0x1bc) from [] (__irq_svc+0x4c/0xe8)
[ 24.811895] Exception stack(0xd7551d78 to 0xd7551dc0)
[ 24.816948] 1d60: 4657775f 00000001
[ 24.825130] 1d80: 00000101 00000101 cbf48cc0 d6c4a758 40464000 cbecaee0 4657775f d6c0d190
[ 24.833313] 1da0: c07dde00 0004a466 c0771c80 d7551dc0 c00de290 c0050688 60000113 ffffffff
[ 24.841505] [] (__irq_svc+0x4c/0xe8) from [] (__sync_icache_dcache+0x14/0xa0)
[ 24.850385] [] (__sync_icache_dcache+0x14/0xa0) from [] (0xd6c0d000)
[ 24.858482] CPU0: stopping
[ 24.861209] [] (unwind_backtrace+0x0/0xfc) from [] (do_IPI+0x188/0x1bc)
[ 24.869573] [] (do_IPI+0x188/0x1bc) from [] (__irq_svc+0x4c/0xe8)
[ 24.877405] Exception stack(0xd752bec8 to 0xd752bf10)
[ 24.882460] bec0: d7610180 00100073 00000000 00000000 d7610180 00000000
[ 24.890642] bee0: 4ae957df d76cf208 cbaed9ec 40083000 d6739000 40082fff 00000001 d752bf10
[ 24.898821] bf00: c00e5d80 c00e5d80 60000013 ffffffff
[ 24.903884] [] (__irq_svc+0x4c/0xe8) from [] (mprotect_fixup+0x318/0x410)
[ 24.912417] [] (mprotect_fixup+0x318/0x410) from [] (sys_mprotect+0x11c/0x1c0)
[ 24.921385] [] (sys_mprotect+0x11c/0x1c0) from [] (ret_fast_syscall+0x0/0x30)
[ 24.930264] CPU2: stopping
[ 24.932988] [] (unwind_backtrace+0x0/0xfc) from [] (do_IPI+0x188/0x1bc)
[ 24.941349] [] (do_IPI+0x188/0x1bc) from [] (__irq_usr+0x48/0xe0)
[ 24.949181] Exception stack(0xd75e9fb0 to 0xd75e9ff8)
[ 24.954236] 9fa0: 405923ec 401d9688 01010101 07000000
[ 24.962418] 9fc0: 78635f5f 5f5f0076 4058ecb4 4058e344 40590bd4 401d9686 401d9686 40238a60
[ 24.970598] 9fe0: 00005f5f becb84a8 b0003c5b b0001774 60000010 ffffffff
[ 25.073049]in do_local_timer, line:453 cpu:3
[ 26.073044] in do_local_timer, line:453 cpu:3
跟踪内核发现,这个panic的执行流程是这样的。
work_pending -> do_notify_resume -> do_signal -> get_signal_to_deliver -> do_group_exit ->
do_exit -> exit_notify -> forget_original_parent -> find_new_reaper -> panic("Attempted to kill init!");
涉及到线程、进程的退出,以及线程父子之间的关系,暂时无法分析出来。
怎么会走到kill init这一步,考虑到是多核环境下出现的,则尝试改为单核启动系统,然后再手动启动其它CPU,见下节描述。
2 手动启动其它的CPU
单核启动Android不死机,此时手动用命令启动其它CPU。
echo 1 > /sys/devices/system/cpu/cpu1/online
这样CPU1就可以起来,一段时间后,内核又panic了,日志如下。
[ 88.604151] XXXXXXXXXX in panic, line:75 cpu:0
[ 88.610321]Kernel panic - not syncing: Attempted to kill init!
[ 88.619172] [] (unwind_backtrace+0x0/0xfc) from [] (panic+0x88/0x1b4)
[ 88.627741] [] (panic+0x88/0x1b4) from [] (do_exit+0x664/0x710)
[ 88.635424] [] (do_exit+0x664/0x710) from [] (do_group_exit+0x3c/0xbc)
[ 88.643713] [] (do_group_exit+0x3c/0xbc) from [] (get_signal_to_deliver+0x1f8/0x430)
root@android:/ # [ 88.653215] [] (get_signal_to_deliver+0x1f8/0x430) from [] (do_signal+0x94/0x534)
[ 88.663905] [] (do_signal+0x94/0x534) from [] (do_notify_resume+0x38/0x44)
[ 88.672545] [] (do_notify_resume+0x38/0x44) from [] (work_pending+0x24/0x28)
[ 88.681352] CPU1: stopping
[ 88.684082] [] (unwind_backtrace+0x0/0xfc) from [] (do_IPI+0x188/0x1bc)
[ 88.692449] [] (do_IPI+0x188/0x1bc) from [] (__irq_svc+0x4c/0xe8)
[ 88.700281] Exception stack(0xd2cf1f90 to 0xd2cf1fd8)
[ 88.705337] 1f80: 00000020 c0771aa4 d2cf1fd8 00000000
[ 88.713520] 1fa0: d2cf0000 c07d0624 c0567c74 c077a0f4 1000406a 412fc09a 00000000 00000000
[ 88.721702] 1fc0: 00000001 d2cf1fd8 c0053aec c00471dc 60000013 ffffffff
[ 88.728328] [] (__irq_svc+0x4c/0xe8) from [] (default_idle+0x24/0x28)
[ 88.736514] [] (default_idle+0x24/0x28) from [] (cpu_idle+0xbc/0xfc)
[ 88.744612] [] (cpu_idle+0xbc/0xfc) from [<10560094>] (0x10560094)
[ 89.321214] in do_local_timer, line:453 cpu:0
[ 90.291213] in do_local_timer, line:453 cpu:0
[ 91.291213] in do_local_timer, line:453 cpu:0
panic的信息跟上一节是一样的,都是按照那样的流程,最后走入了kill init那一步。
3 为何多核SMP会panic
既然能够定位到是多核导致的,只能将多核相关的寄存器仔细查看了。
3.1 NS访问控制寄存器
NSACR寄存器的描述如下图所示。这个寄存器在S模式是可以读写的,NS模式则为只读。
它的NS_SMP位可以决定NS模式下,能否修改辅助控制寄存器的SMP位。
DSC0000.jpg (63.97 KB, 下载次数: 0)
2015-10-28 10:08 上传
DSC0001.jpg (43.16 KB, 下载次数: 0)
2015-10-28 10:08 上传
3.2 辅助控制寄存器
辅助控制寄存器如下所述,相关的是。
一致性模式,SMP或者AMP;
广播cache、分支预测、TLB的一致性操作。
S模式下可以读写;
NS下只读,若NSACR.NS_SMP是0;若这个位变成1,则NS下可以读写,这种情况下,其它位都是写忽略的,除了SMP位。
DSC0002.jpg (56.12 KB, 下载次数: 0)
2015-10-28 10:08 上传
DSC0003.jpg (89.12 KB, 下载次数: 0)
2015-10-28 10:08 上传
DSC0004.jpg (83.36 KB, 下载次数: 0)
2015-10-28 10:08 上传
DSC0005.jpg (99.68 KB, 下载次数: 0)
2015-10-28 10:08 上传
根据这个寄存器的描述,就是不管是否设置了它的FW位,它都可以从同簇的其它CPU那里,发送或者接收对内部共享的写回、写分配的一致性请求。
言外之意:我的理解是,若是设置了SMP bit,则必须设置FW bit。
基于这个推测,结合上面这个寄存器的描述,CPU这样设置。
在S模式,首先设置NSACR的NS_SMP位是1,然后设置辅助控制寄存器的SMP、FW位也是1,这样切换到NS模式后,也能修改辅助控制寄存器的SMP位,而它的FW位也是1。
经过这样设置,多核启动Android成功了,系统没有再出现panic。
4 后续问题怎么解决
上面的问题,是在定位到是多核导致后,经过修改寄存器,然后解决的。
至于怎么根据panic的Kill init信息去跟踪,然后推导出是cache一致性没有处理好,最后内核奔溃的,没有好的思路。
就是出现 Kernel panic - not syncing: Attempted to kill init!
这个问题还是没有找到根本的解决思路。
linux arm panic,ARM Linux 内核 panic 之cache 一致性 ——Cortex-A9多核cache和TLB一致性广播...相关推荐
- ARM Linux 内核 panic 之cache 一致性 ——cci-400 cache一致互联
ARM Linux 内核 panic 之cache 一致性 --cci-400 cache一致互联 CCI-400 集合了互联和一致性功能,有 2 个 ACE slave 接口和 3 个 ACE-Li ...
- 空指针引用,导致linux内核panic(重启)
这个bug搞了我整整两天,看了好多贴,调试了好多遍,终于解决了:复盘记录下. 先贴上重启打印日志. 1.重启打印日志 PC is at 0x0 LR is at devinet_ioctl+0x31c ...
- 为 QEMU ARM 仿真器编译 Linux 内核:QEMU 模拟 ARM 环境
QEMU 是一套由法布里斯·贝拉(Fabrice Bellard)所编写的以 GPL 许可证分发源码的模拟处理器,在GNU/Linux 平台上使用广泛.简单来说,QEMU 是一个虚拟机,与常见的 Vm ...
- Linux 进内核,arm linux 启动流程之 进入内核
原标题:arm linux 启动流程之 进入内核 还是从编译链接生成vm 的过程来看吧,由一大堆.o文件链接而成,第一个就是 kernel/arch//kernel/head-armv.o ,而且我们 ...
- linux内核panic
1. Linux Kernel Panic的产生的原因 panic是英文中是惊慌的意思,Linux Kernel panic正如其名,linux kernel不知道如何走了,它会尽可能把它此时能获取的 ...
- ARM在嵌入式linux内核裁剪与移植的应用
微处理器用一片或少数几片大规模集成电路组成的中央处理器.这些电路执行控制部件和算术逻辑部件的功能.微处理器与传统的中央处理器相比,具有体积小,重量轻和容易模块化等优点.微处理器的基本组成部分有:寄存器 ...
- uda1341声卡的linux 2.6.29版本内核驱动在arm s3c2440上的移植
平台信息: 目标板 :2440 OS :Redhat9 编译器 :arm-linux-gcc-4.3.3 移植步骤: 1.获 ...
- ARM的嵌入式Linux移植体验之操作系统
转自:[url]http://dev.yesky.com/153/2527653.shtml[/url] 06-08-13 08:00 作者: 宋宝华 出处: 天极开发 责任编辑:方舟 在笔者撰写的& ...
- 基于ARM的嵌入式Linux移植真实体验(3)――操作系统
基于ARM的嵌入式Linux移植真实体验(3)――操作系统 宋宝华[email]21cnbao@21cn.com[/email] 出处:dev.yesky.com 在笔者撰写的<C语言嵌入式系统 ...
最新文章
- mybatis中sqlSession的设计与实现
- centos 6.5 搭建lnmp环境
- 洛谷P2038 无线网络发射器选址
- 使用指定的Action,Category调用系统Activity
- Win8下在Vmware11中安装使用苹果系统OS X 10.10
- django05:ORM示例--person 增删改查
- QString与中文问题
- Docker学习总结(36)——利用Google开源Java容器化工具Jib构建镜像
- SAP 录屏BDC使用—实例 \
- ftp文件服务器坑,Java实现FTP上传文件到Linux服务器的那些坑
- mysql联合索引原理
- 【luogu/字符串】多项式输出(所有情况一起处理)
- 个人任务五——事后诸葛亮项目回顾
- gmx solvate命令
- switch游戏服务器设置
- java espresso车架_Espresso UI自动化测试框架
- fiddler扩展模拟弱网络环境设置
- 腾讯微信公众平台账号类型说明
- 阿里巴巴实习一年之后的感悟
- 关于 用无线路由器组成的局域网内共享文件_习惯累积沉淀_新浪博客
热门文章
- Linux解决mysql登录密码错误(明明是对的)
- Ubuntu18.04 将可执行文件添加桌面或收藏夹,使点击运行
- 二、JavaWeb基础(BootStrap前端框架)
- 贼全面的计算机考研数据结构算法题集合(408+自命题均可)
- 安装 VS 2015 Update 2 + Windows SDK Tools 1.3.1 + Windows SDK 10586.212 后提示找不到 10586.0 SDK 问题的解决方法...
- upGrad设定2022年3月达成5亿美元年营收运转率的目标
- PS/2 标准键盘带感叹号,笔记本自带键盘不可用
- gg修改器修改内购_时空猎人各种修改
- linux pssh用法,pssh命令_Linux pssh 命令用法详解:批量管理执行
- Pyqt5在程序中动态修改多界面的语言(英语转中文或者中文转英语)