关键词: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(用户空间操作内核地址导致的异常)的更多相关文章

  1. 深入理解linux网络技术内幕读书笔记(三)--用户空间与内核的接口

    Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sy ...

  2. 用户空间和内核空间通讯之【Netlink 上】

    原文地址:用户空间和内核空间通讯之[Netlink 上] 作者:wjlkoorey258 引言 Alan Cox在内核1.3版本的开发阶段最先引入了Netlink,刚开始时Netlink是以字符驱动接 ...

  3. 深入理解Linux网络技术内幕——用户空间与内核空间交互

    概述:     内核空间与用户空间经常需要进行交互.举个例子:当用户空间使用一些配置命令如ifconfig或route时,内核处理程序就要响应这些处理请求.     用户空间与内核有多种交互方式,最常 ...

  4. Operating System-Thread(3)用户空间和内核空间实现线程

    http://www.cnblogs.com/Brake/archive/2015/12/02/Operating_System_Thread_Part3.html 本文主要内容: 操作系统用户空间和 ...

  5. 用户空间与内核驱动的交互过程 — ioctl

    在Linux内核模块的开发过程中,经常涉及到运行在用户空间上的应用程序与内核模块进行交互,ioctl系统调用是常用的一种方式.本文并不涉及vlan的具体原理,仅通过vconfig与vlan内核模块进行 ...

  6. 如何看待Linux操作系统的用户空间和内核空间

    作为中央核心处理单元的CPU,除了生产工艺的不断革新进步外,在处理数据和响应速度方面也需要有权衡.稍有微机原理基础的人都知道Intel X86体系的CPU提供了四种特权模式ring0~ring3,其中 ...

  7. 用户空间和内核空间通讯之【Netlink 中】

    原文地址:用户空间和内核空间通讯之[Netlink 中] 作者:wjlkoorey258 今天我们来动手演练一下Netlink的用法,看看它到底是如何实现用户-内核空间的数据通信的.我们依旧是在2.6 ...

  8. Linux系统调用具体解释(怎样从用户空间进入内核空间)

    系统调用概述 计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同一时候执行的多个进程都须要訪问这些资源,为了更好的管理这些资源进程是不同意直接操作的,全部对这些资源的訪问都必须有操作系统控制. ...

  9. Linux用户空间与内核空间(理解高端内存)

    Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数 ...

随机推荐

  1. C语言搬书学习第一记 —— 认识一个简单程序的细节

    #include<stdio.h> /*告诉编译器把stdio.h 中的内容包含在当前程序中,stdio.h是C编译器软件包的标准部分,它提供键盘输入和 屏幕输入的支持studio.h文件 ...

  2. Hyperledger Fabric:最简单的方式测试你的链码

    一直以来,写完链码进行测试都要先搭建一个Fabric环境,然后安装链码进行测试,实际上Fabric提供了最为简单的方式可以允许我们对编写的应用链码进行功能测试,不需要搭建一个完整的Fabeic环境.而 ...

  3. MySql报错(持续更新)

    目录 MySql报错 1. 重复键报错1062- duplicate entry '0' for key 'xxx' 1.1 报错场景 1.2 报错原因 1.3 解决方法 1.4 具体举例 2. VS ...

  4. Provide Several View Variants for End-Users 为最终用户提供多个视图变体

    In this lesson, you will learn how to provide several customized variants of the same View, and allo ...

  5. OSG绘制空间凹多边形并计算其面积

    目录 1. 思路 1) 多边形分格化 2) 几何图元遍历 2. 实现 3. 参考 1. 思路 这个问题其实涉及到OSG中的两个问题:多边形分格化和几何图元遍历. 1) 多边形分格化 在OpenGL/O ...

  6. jeecg代码生成器配置及常见问题

    jeecg_database.properties 以mysql为例: diver_name=com.mysql.jdbc.Driver url=jdbc:mysql://192.168.*.*:33 ...

  7. 深入解析ReentrantReadWriteLock

    前言: 在Java的锁中很多锁都是同一时刻只允许一个线程访问,今天就来看看一个特殊的锁——读写锁.它的特殊之处就在于同一时刻可以运行多个读线程访问或者有一个写线程在访问.能够大大的提高并发性和吞吐量 ...

  8. OpenTSDB 简单使用 .NET

    OpenTSDB是基于Hbase的时序数据库[时间序列数据库].不具备通用性,主要针对具有时间特性和需求的数据,如监控数据.温度变化数据等. 1.安装OpenTSDB 安装前一定要安装HBase,相关 ...

  9. (办公)记事本_Linux的In命令

    参考菜鸟教程Linux:https://www.runoob.com/linux/linux-comm-ln.html linux的ln命令. Linux ln命令是一个非常重要命令,它的功能是为某一 ...

  10. Java入门总结

    1. 一个Java源码只能定义一个public类型的class,并且class名称和文件名要完全一致: 使用javac可以将.java源码编译成.class字节码: 使用java可以运行一个已编译的J ...