CK:User mode Bus Error(用户空间操作内核地址导致的异常)
关键词:VEC_ACCESS、coredump、LR、PC等。
CK中存在一种VEC_ACCESS异常,可能原因是用户空间访问了内核空间,还有一种是内核访问不存在的总线地址。
下面简单构造VEC_ACCESS异常,包括变量指针异常和函数指针异常并分析。
1. 变量指针异常
#include <stdio.h> void main(void)
{
char *p = (char *)0xfffffffe; *p = ;
}
执行后异常输出如下,并生成了coredump文件。
[ 1601.325926] User mode Bus Error
[ 1601.329105]
[ 1601.329105] CURRENT PROCESS:
[ 1601.329105]
[ 1601.334955] COMM=buserror PID=
[ 1601.338280] TEXT=-000085c0 DATA=00009f1c-0000a018 BSS=0000a018-0000b000
[ 1601.345596] USER-STACK=7fb0de10 KERNEL-STACK=be829180
[ 1601.345596]
[ 1601.352229] PC: 0x000084ec (0x84ec)----------------------异常点代码位置。
[ 1601.355724] LR: 0x2aae22aa (0x2aae22aa)
[ 1601.359564] SP: 0xbf0b1f68
[ 1601.362362] orig_a0: 0x00000001
[ 1601.365506] PSR: 0x00020340
[ 1601.368308] a0: 0x00000001 a1: 0x7fb0de14 a2: 0x00000001 a3: 0xfffffffe
[ 1601.375539] r4: 0x00008500 r5: 0x00000000 r6: 0x00000000 r7: 0x00000000
[ 1601.382770] r8: 0x7fb0dd3c r9: 0x000c873c r10: 0x00008380 r11: 0x00000000
[ 1601.390000] r12: 0x001030dc r13: 0x001030ac r15: 0x2aae22aa
[ 1601.395753] r16: 0xffffffff r17: 0x00000000 r18: 0x2abfa20c r19: 0x00000000
[ 1601.402984] r20: 0x00000000 r21: 0x00000000 r22: 0x7fb0da10 r23: 0x2aaa8736
[ 1601.410215] r24: 0x2aacdb9c r25: 0x00000000 r26: 0x00000000 r27: 0x7fb0dd50
[ 1601.417445] r28: 0x2abf7000 r29: 0x00000000 r30: 0x00000000 tls: 0x2aac8a18
[ 1601.424673] hi: 0x00000000 lo: 0x00000000
[ 1601.429034]
CODE:
000084ac: e9031066 7bcdfffa 000007f7
000084bc: 000014d0 00009f2c
000084cc: dd0e1421 6e3b2000 e4481421
000084dc: b2602b01 1003e468
000084ec: db63a340 6c000000 d90e6fa3
000084fc: 0000783c 0116ebe0 0012ea8d 0002cf8c
0000850c: 003cc5bc d07c1070 6dc30823 6e4b6e07
0000851c: 7bcd10ae 614e106e c78355a2 e9050026
0000852c: 3400000c 0883d086 6c636ca7 24006c1f
0000853c: 65167bcd ebc00bf8 0000783c
0000854c: 00001af4 0000000c ffffff1c ffffff1c
0000855c: db6e14d2 654e2d00
0000856c: 2c030c06 94607bcd 0bfc654e
0000857c: 000014d0 00009f1c
0000858c: ddee1422 db6e2000
0000859c: ff4ce3ff 4820c400
[ 1601.498888]
KERNEL STACK:
bf0b1f28: bea0e9b4 bf0b1f58 bf0b1f5c 806a1426
bf0b1f38: bf0b1f68 7fb0de14
bf0b1f48: bf0b1f5c 8004afec bf0b1f68
bf0b1f58: 7fb0dd3c 8004a418
bf0b1f68: 2aac8a18 2aae22aa 000084ec
bf0b1f78: 7fb0dd38 7fb0de14
bf0b1f88: fffffffe
bf0b1f98: 7fb0dd3c 000c873c
bf0b1fa8: 001030dc 001030ac
bf0b1fb8: ffffffff 2abfa20c
bf0b1fc8: 7fb0da10 2aaa8736
bf0b1fd8: 2aacdb9c 7fb0dd50
[ 1601.552499]
Call Trace:
Segmentation fault (core dumped)
分析生成的core文件,可以发下问题点在*p = 1;:
# 0x000084ec in main () at buserror.c:
p = 0xfffffffe <error: Cannot access memory at address 0xfffffffe>
再结合objdump和CODE段验证对比,同样结果。
000084d0 <main>:
#include <stdio.h> void main(void)
{
84d0: subi sp, sp,
84d2: dd0e2000 st.w r8, (sp, )
84d6: 6e3b mov r8, sp
84d8: subi sp, sp,
char *p = (char *)0xfffffffe;
84da: e4481003 subi r2, r8,
84de: movi r3,
84e0: 2b01 subi r3,
84e2: b260 st.w r3, (r2, ) *p = ;
84e4: e4681003 subi r3, r8,
84e8: ld.w r3, (r3, )
84ea: movi r2,
84ec: a340 st.b r2, (r3, 0)
84ee: db630000 ld.b r27, (r3, )
}
2. 函数指针异常
构造函数指针异常,即函数指针指向了内核一段空间。
#include <stdio.h> void main(void)
{
void *(*pf)(void);
pf = 0xfffffffe;
pf();
printf("EOP");
}
执行后异常输出如下:
[ 3818.626608] User mode Bus Error
[ 3818.629786]
[ 3818.629786] CURRENT PROCESS:
[ 3818.629786]
[ 3818.635635] COMM=buserror PID=
[ 3818.638960] TEXT=- DATA=00009f1c-0000a018 BSS=0000a018-0000b000
[ 3818.646276] USER-STACK=7fcf3e10 KERNEL-STACK=be829700
[ 3818.646276]
[ 3818.652907] PC: 0xfffffffe (0xfffffffe)-------------------------------这里的PC指针并没有指向代码段,也即函数跳转到内核空间了。
[ 3818.656750] LR: 0x00008524 (0x8524)-----------------------------------重点需要查看LR指针指向的位置。
[ 3818.660241] SP: 0xbf197f68
[ 3818.663038] orig_a0: 0x00000001
[ 3818.666183] PSR: 0x00020340
[ 3818.668986] a0: 0x00000001 a1: 0x7fcf3e14 a2: 0x7fcf3d34 a3: 0xfffffffe
[ 3818.676218] r4: 0x00008548 r5: 0x00000000 r6: 0x00000000 r7: 0x00000000
[ 3818.683448] r8: 0x7fcf3d38 r9: 0x000c873c r10: 0x000083b0 r11: 0x00000000
[ 3818.690677] r12: 0x001030dc r13: 0x001030ac r15: 0x00008524
[ 3818.696430] r16: 0xffffffff r17: 0x00000000 r18: 0x2abfa20c r19: 0x00000000
[ 3818.703662] r20: 0x00000000 r21: 0x00000000 r22: 0x7fcf3a10 r23: 0x2aaa8736
[ 3818.710892] r24: 0x2aacdb9c r25: 0x00000000 r26: 0x00000000 r27: 0xfffffffe
[ 3818.718122] r28: 0x2abf7000 r29: 0x00000000 r30: 0x00000000 tls: 0x2aac8a18
[ 3818.725350] hi: 0x00000000 lo: 0x00000000
[ 3818.729709]
CODE:
ffffffc0: [ 3818.732827] Unable to handle kernel paging request at virtual address 0xfffff000, pc: 0x8004bdc4
[ 3818.741647] Oops:
[ 3818.744373]
[ 3818.744373] CURRENT PROCESS:
[ 3818.744373]
[ 3818.750233] COMM=buserror PID=
[ 3818.753568] TEXT=- DATA=00009f1c-0000a018 BSS=0000a018-0000b000
[ 3818.760899] USER-STACK=7fcf3e10 KERNEL-STACK=be829700
[ 3818.760899]
[ 3818.767549] PC: 0x8004bdc4 (show_regs+0x188/0x340)
[ 3818.772374] LR: 0x8004beb8 (show_regs+0x27c/0x340)
[ 3818.777183] SP: 0xbf197e0c
[ 3818.779993] orig_a0: 0x0000000b
[ 3818.783137] PSR: 0x80140300
[ 3818.785951] a0: 0x0000000b a1: 0x00000000 a2: 0x808fec04 a3: 0x00000000
[ 3818.793196] r4: 0x00000000 r5: 0xffffffc0 r6: 0xbf197f68 r7: 0x808494c4
[ 3818.800441] r8: 0xbf197eb0 r9: 0x808494b8 r10: 0x000083b0 r11: 0x00000000
[ 3818.807684] r12: 0x00000004 r13: 0x8007f6c8 r15: 0x8004beb8
[ 3818.813457] r16: 0xffffffff r17: 0x00000000 r18: 0xbf1add8c r19: 0x0000027f
[ 3818.820702] r20: 0x00000004 r21: 0xffffffe4 r22: 0x00000000 r23: 0x0000001b
[ 3818.827945] r24: 0x00000000 r25: 0x80718358 r26: 0x8004f940 r27: 0x00000020
[ 3818.835190] r28: 0x2abf7000 r29: 0x00000000 r30: 0x00000000 tls: 0x00000000
[ 3818.842434] hi: 0x000000f8 lo: 0xd57a2000
[ 3818.846807]
CODE:
8004bd84: d8464820 d8262024 051ae005
8004bd94: 4820c400 e0051200 c4000515 96a24820
8004bda4: e4652d3f 3b402003 0503c400 614c4361
8004bdb4: ea893400 11fa003a 200fe464 0078e903
8004bdc4: 6c1f9520 e0052403 c40004fd eb444820
8004bdd4: 11130bf2 04f4e005 4820c400
8004bde4: e0051111 c40004ef e4a64820 3400103f
8004bdf4: 002aea89 e46411ea e903200f
8004be04: 24036c1f 04dee005 4820c400 00c0eb44
8004be14: 0bf22503 e0051103 c40004d5 962e4820
8004be24: e0003000 c40000f9 6fa34820 2006d92e
8004be34: 98c498e5 988298a3 2001d9ee 2000d90e
8004be44: 783c1407 8004f950 800607b0
8004be54: 808491d4 800ec7c4 808491ec
8004be64: 808492ac
8004be74: 808492bc 808492f8
[ 3818.916915]
KERNEL STACK:
bf197dcc: bf1add8c 0000027f ffffffe4
bf197ddc: 0000001b bf197eb0
bf197dec: 80049f68 ffffffc0 bf197f68
bf197dfc: 808494c4 808494b8 000083b0
bf197e0c: 8004beb8 8004bdc4
bf197e1c: 7fcf3d34 0000000b 0000000b
bf197e2c: 808fec04 ffffffc0
bf197e3c: bf197f68 808494c4 bf197eb0 808494b8
bf197e4c: 000083b0 8007f6c8
bf197e5c: ffffffff bf1add8c 0000027f
bf197e6c: ffffffe4 0000001b
bf197e7c: 8004f940
[ 3818.970702]
Call Trace:
[<8004af18>] buserr+0x54/0x80
[<8004afec>] trap_c+0xa8/0xe4
[<8004a418>] csky_trap+0x68/0x70
Segmentation fault
从错误log看出LR指向0x00008524 ,也即printf(""EOP);。所以问题出在pf();。
void main(void)
{
: subi sp, sp,
: dd0e2000 st.w r8, (sp, )
: ddee2001 st.w r15, (sp, 0x4)
850a: 6e3b mov r8, sp
850c: subi sp, sp,
void *(*pf)(void);
pf = 0xfffffffe;
850e: e4481003 subi r2, r8,
: movi r3,
: 2b01 subi r3,
: b260 st.w r3, (r2, )
: db622000 ld.w r27, (r2, )
pf();
851c: e4681003 subi r3, r8,
: ld.w r3, (r3, )
: 7bcd jsr r3
printf("EOP");
: lrw r0, 0x85fc // 8540 <main+0x40>
: eae00008 jsri 0x0 // from address pool at 0x8544
852a: c4004820 lsli r0, r0,
}
3.小结
综上所述遇到“User mode Bus Error”类型的错误,可以通过查看PC指针。
如果PC明显不是指向代码段,查看LR地址。这样就可以大概找出问题点。
期间需要借助objdump、hexdump等工具。
CK:User mode Bus Error(用户空间操作内核地址导致的异常)的更多相关文章
- 深入理解linux网络技术内幕读书笔记(三)--用户空间与内核的接口
Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sy ...
- 用户空间和内核空间通讯之【Netlink 上】
原文地址:用户空间和内核空间通讯之[Netlink 上] 作者:wjlkoorey258 引言 Alan Cox在内核1.3版本的开发阶段最先引入了Netlink,刚开始时Netlink是以字符驱动接 ...
- 深入理解Linux网络技术内幕——用户空间与内核空间交互
概述: 内核空间与用户空间经常需要进行交互.举个例子:当用户空间使用一些配置命令如ifconfig或route时,内核处理程序就要响应这些处理请求. 用户空间与内核有多种交互方式,最常 ...
- Operating System-Thread(3)用户空间和内核空间实现线程
http://www.cnblogs.com/Brake/archive/2015/12/02/Operating_System_Thread_Part3.html 本文主要内容: 操作系统用户空间和 ...
- 用户空间与内核驱动的交互过程 — ioctl
在Linux内核模块的开发过程中,经常涉及到运行在用户空间上的应用程序与内核模块进行交互,ioctl系统调用是常用的一种方式.本文并不涉及vlan的具体原理,仅通过vconfig与vlan内核模块进行 ...
- 如何看待Linux操作系统的用户空间和内核空间
作为中央核心处理单元的CPU,除了生产工艺的不断革新进步外,在处理数据和响应速度方面也需要有权衡.稍有微机原理基础的人都知道Intel X86体系的CPU提供了四种特权模式ring0~ring3,其中 ...
- 用户空间和内核空间通讯之【Netlink 中】
原文地址:用户空间和内核空间通讯之[Netlink 中] 作者:wjlkoorey258 今天我们来动手演练一下Netlink的用法,看看它到底是如何实现用户-内核空间的数据通信的.我们依旧是在2.6 ...
- Linux系统调用具体解释(怎样从用户空间进入内核空间)
系统调用概述 计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同一时候执行的多个进程都须要訪问这些资源,为了更好的管理这些资源进程是不同意直接操作的,全部对这些资源的訪问都必须有操作系统控制. ...
- Linux用户空间与内核空间(理解高端内存)
Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数 ...
随机推荐
- 计算机组成原理——I/O接口以及I/O设备数据传送控制方式
接口可以看作是两个部件之间交接的部分.硬件与硬件之间有接口,硬件与软件之间有接口,软件与软件之间也有接口. 这里我们所说的I/O接口,一边连接着主机,一边连接着外设. I/O接口的功能 I/O接口的基 ...
- default(T);
在泛型类型中,由于泛型类型即可以是引用类型也可以是值类型,所以不能用null来表示默认值.这里通过default来进行.引用类型的default将泛型类型初始化null,值类型的default将泛型类 ...
- DispatchProxy实现动态代理及AOP
DispatchProxy类是DotnetCore下的动态代理的类,源码地址:Github,官方文档:MSDN.主要是Activator以及AssemblyBuilder来实现的(请看源码分析),园子 ...
- HTML入门(转义字符、行内样式和块级元素、定位、锚点、跑马灯标签、图片标签、表格标签的讲解)
一.转义字符由特殊字符包裹的文本 会当做标签去解析 对应不换行空格 对应全角空格 em是字体排印学的计量单位,相当于当前指定的点数.其占据的宽度正好是1个中文宽度,而且基本上不受字体影响.<对应 ...
- CSS 学习手册
目录 CSS 简介 1.CSS 简介 CSS 概述 层叠次序 2.CSS 基础语法 CSS 语法 值的不同写法和单位 记得写引号 多重声明: 空格和大小写 3.CSS 高级语法 选择器的分组 继承及其 ...
- InnoDB On-Disk Structures(二)--Indexes (转载)
转载.节选于 https://dev.mysql.com/doc/refman/8.0/en/innodb-indexes.html This section covers topics relate ...
- VMware Workstation虚拟机安装CentOS-7-Minimal经验分享
本文主要为0基础的小白准备,有一定经验的大神请忽略.因为最近刚接触linux,在其中也是遇到无数的弯路,本着互惠互利原则,特写这个博客,希望后来人能少走点弯路,更快的进入状态.话不多说,上货. 一,首 ...
- 检测服务器是否开启重协商功能(用于CVE-2011-1473漏洞检测)
背景 由于服务器端的重新密钥协商的开销至少是客户端的10倍,因此攻击者可利用这个过程向服务器发起拒绝服务攻击.OpenSSL 1.0.2及以前版本受影响. 方法 使用OpenSSL(linux系统基本 ...
- 【tf.keras】tensorflow datasets,tfds
一些最常用的数据集如 MNIST.Fashion MNIST.cifar10/100 在 tf.keras.datasets 中就能找到,但对于其它也常用的数据集如 SVHN.Caltech101,t ...
- yii2 提示
控制器中: Yii::$app->getSession()->setFlash('success', "描述!"); Yii::$app->getSession( ...