免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 8184 | 回复: 37

[实践] init进程出错 [复制链接]

论坛徽章:
0
发表于 2013-09-17 01:30 |显示全部楼层
[    9.840000] linuxrc/1: potentially unexpected fatal signal 11.
[    9.840000]
[    9.840000]
[    9.840000] Pid: 1, comm:              linuxrc
[    9.850000] CPU: 0    Not tainted  (2.6.32.61 #4)
[    9.850000] PC is at 0x4000d470
[    9.860000] LR is at 0x40013d30
[    9.860000] pc : [<4000d470>]    lr : [<40013d30>]    psr: 20000010
[    9.860000] sp : befe5eb0  ip : 0000004c  fp : 00000000
[    9.870000] r10: 00000000  r9 : 000c0098  r8 : 40025940
[    9.880000] r7 : 00000000  r6 : 40025000  r5 : 00000000  r4 : 00000000
[    9.880000] r3 : 00008e5c  r2 : 4001e160  r1 : 0d696914  r0 : 0000a5bc
[    9.890000] Flags: nzCv  IRQs on  FIQs on  Mode USER_32  ISA ARM  Segment user
[    9.900000] Control: 00c5387d  Table: 672f0008  DAC: 00000015
[    9.920000] Kernel panic - not syncing: Attempted to kill init!
[    9.920000] [<c0020a0c>] (unwind_backtrace+0x0/0xd0) from [<c01b2104>] (panic+0x3c/0x10
[    9.920000] [<c01b2104>] (panic+0x3c/0x10 from [<c0035144>] (do_exit+0x68/0x5f
[    9.930000] [<c0035144>] (do_exit+0x68/0x5f from [<c0035998>] (do_group_exit+0x90/0xc4)
[    9.940000] [<c0035998>] (do_group_exit+0x90/0xc4) from [<c003e530>] (get_signal_to_deliver+0x2dc/0x314)
[    9.950000] [<c003e530>] (get_signal_to_deliver+0x2dc/0x314) from [<c001d668>] (do_signal+0x50/0x5f4)
[    9.960000] [<c001d668>] (do_signal+0x50/0x5f4) from [<c001e128>] (do_notify_resume+0x18/0x4
[    9.970000] [<c001e128>] (do_notify_resume+0x18/0x4 from [<c001ae8c>] (work_pending+0x1c/0x20)

编译的busybox执行总是出错。从发送的信号来看是 非法访问,我换了两个版本的busybox都是这个错误。搞了几天了没一点进展,就只差换编译器了。

在编译的时候给出了很多
util-linux/fsck_minix.c: In function 'check_counts2':
util-linux/fsck_minix.c:1142:19: warning: dereferencing type-punned pointer will break strict-aliasing rules
util-linux/fsck_minix.c:1173:11: warning: dereferencing type-punned pointer will break strict-aliasing rules
util-linux/fsck_minix.c:1173:26: warning: dereferencing type-punned pointer will break strict-aliasing rules
util-linux/fsck_minix.c:1173:26: warning: dereferencing type-punned pointer will break strict-aliasing rules
util-linux/fsck_minix.c:1174:8: warning: dereferencing type-punned pointer will b
这种警告。

我想问的是倒是busybox的问题还是编译器的问题,还有两个有点不相配。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2013-09-18 22:43 |显示全部楼层
啥版本的gcc?
kernel里的eabi选上了吗?
c库拷贝到rootfs里了吗?
cmdline里指定了init=吗?


论坛徽章:
0
发表于 2013-09-19 01:28 |显示全部楼层
本帖最后由 要有上进心 于 2013-09-19 01:29 编辑

eabi oabi这两个选项都按烂了哦。

我用 print-fatal-signals=1 发现接收到的信号是11,非法访问。

目前调试有了新的发现。

出错代码位于 glibc-2.9/malloc./arena.c文件里。 ptmalloc_init()这个函数出错了。我反汇编看了一下:

    c08c:        ee1dcf70         mrc        15, 0, ip, cr13, cr0, {3}
    c090:        e78c3001         str        r3, [ip, r1]

在c090处发生内存非法访问,当时ip=0. r1 =0x24.

我就很奇怪。glibc怎么可能编译出一条访问协处理器的代码,而且cr13是快速上下文切换用的寄存器。

目前正在阅读汇编代码,看看是那条代码被编译成这样的。

论坛徽章:
0
发表于 2013-09-20 21:31 |显示全部楼层
本帖最后由 要有上进心 于 2013-09-20 21:41 编辑

通过arm官方网站终于知道这段汇编的意思了。我手上了文档就没有,同样是官方的。奇怪。。。。

cp15 cr13 0: 快速上下文切换
cp15 cr13 1: Context ID Register
cp15 cr13 2-4: Thread and process ID registers

在entry-armv.S的__switch_To函数中有设置这个寄存器。

#if defined(CONFIG_HAS_TLS_REG)
        mcr        p15, 0, r3, c13, c0, 3                @ set TLS register

但是有个问题。在glibc ptmalloc_init函数中,读取这个寄存器中的值始终为0;

这个寄存器中的值是TLS(线程局部存储)。

请问为什么始终为零?busybox 还有我自己写的一个main 都是在同样的地方出错了。


论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
发表于 2013-09-20 21:40 |显示全部楼层
从内核找问题原因,出错的原因有很多种可能性

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2013-09-21 14:44 |显示全部楼层
把你的内核配置文件.config贴出来吧

论坛徽章:
0
发表于 2013-09-21 15:00 |显示全部楼层
回复 6# arm-linux-gcc


问题找到了,但是就是不知道怎么解决。

原因是 glibc通过 cp15 cr13 3 寄存器获取 tls地址,但是arm1164jzf-s没有这个寄存器。而且内核中在__switch_to 也没有设置这个寄存器。

我一直在找 tls的资料(百度完全是废物),google上的资料也少。

但是好像glibc可以通过几种方法获取tls地址。我就是不知道怎么弄。
   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2013-09-21 15:05 |显示全部楼层
你用的toolchain,支持arm11吗?我记得codesourcery他们的toolchain就只支持armv4 armv5 armv7,没有armv6
你可以自己用buildroot搞一个toolchain,把arm1176jzfs选上

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2013-09-21 15:07 |显示全部楼层
回复 7# 要有上进心


   
你用的toolchain,支持arm11吗?我记得codesourcery他们的toolchain就只支持armv4 armv5 armv7,没有armv6
你可以自己用buildroot搞一个toolchain,把arm1176jzf-s选上

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2013-09-21 15:09 |显示全部楼层
回复 7# 要有上进心


    有1164吗?我记得只有1136 1156 1176啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP