免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2150 | 回复: 6
打印 上一主题 下一主题

[内核入门] 3.4.43内核 init_post panic 求教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-24 12:16 |只看该作者 |倒序浏览
最近刚接触内核移植方面的工作,把3.4.43内核移植到arm1176上的时候,在调用init_post的时候,出现了panic的现象。经过分析,发现是由于
run_init_process调用失败导致,具体的调用链如下:

run_init_process->kernel_execve->do_execve->search_binary_handler->load_elf_binary->padzero->__clear_user_std,
__clear_user_std传过来的参数总共有两个,一个是地址0xAB7C2,一个是数量0x83e,当执行汇编“strbt r2, [r0], #1”后,跳转到
data abort的异常了。

个人觉得,该函数的本意是清除一段user space的内存,应该不存在权限的问题,那么出现data abort的异常,应该是对应的页表还没有生成出来。

问题如下:
1.在调用__clear_user_std的时候,用户空间的页表是否应该已经创建出来?
2.如果创建出来了,创建的对应调用在哪里?

第一次做移植工作,所以可能问的问题比较弱,请不吝赐教。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
2 [报告]
发表于 2014-08-24 21:12 |只看该作者
地址有点奇怪~
内核态访问的用户态的地址必须是已经有页表映射的,否则就会异常~
用户态虚拟地址的页表通常是通过缺页异常进行映射的。。。

论坛徽章:
0
3 [报告]
发表于 2014-08-25 15:43 |只看该作者
本帖最后由 alexhak2004 于 2014-08-25 15:53 编辑

感谢回复,又仔细debug了一下代码,发现问题,但是还是觉得奇怪。

现在初步的结论是由于data abort后返回的地址不对,引起data abort的指令没有能够正常执行,
所以导致返回值判断出错。

继续上一帖子,说明一下我看到的执行流程。

1.在地址 0xc0109078处(属于函数__clear_user_std,函数的返回地址在0xc00d2ac8),存在指令“strbt r2, [r0], #1”,
此时SP_SVC=0xc482be58,

2.在执行这条指令后,产生data_dataabort异常,切换到dabt模式,此时SP_DABT=0xc0ed288c,而引起异常的指令地址
0xc0109078
被存到了dataabort模式下的栈中0xc0ed2890=0xc0109078

3.程序跳转到vector_dabt,最后跳转到__dabt_svc,由于最后是通过"movs pc, lr"进行跳转的,所以进行了状态切换,又
切换到了SVC模式,此时的SP_SVC为0xC482BE58。在__dabt_svc中,首先保存了r1~r12,接下来,由于r0刚好指向了
dabt模式下的栈,所以"LDM r0, {r3-r5}",使得r3保存了__clear_user_std中的线性地址,r4保存了出错指令地址,r5保存
了之前SVC的处理器CPSR(=0x60000013)。此时lr=0xc00d2AC8,刚好是__clear_user_std的返回地址。
4.调用v6_early_abort->do_DataAbort进行处理,没有错误

5.函数返回后,最后通过ldmib sp, {r1-r15}跳到 “pop {p0,pc}”

问题是,此时SP为0xc482be58,还是属于SVC模式的栈,并没有回到DABT模式的栈,所以,PC回到了0xc00d2ac8,而不是
出错指令地址0xc0109078,并没有重新执行,所以这会引起后面的判断失败。现在不知道应该如何处理。。。






回复 2# humjb_1983


   

论坛徽章:
0
4 [报告]
发表于 2014-08-25 15:52 |只看该作者
感觉应该先切换到DABT模式才能够拿到错误指令地址。。。

论坛徽章:
0
5 [报告]
发表于 2014-08-26 10:37 |只看该作者
和原始的3.4.43的内核进行了对比,没有发现差异,纠结了

论坛徽章:
0
6 [报告]
发表于 2014-08-26 10:37 |只看该作者
和原始的3.4.43的内核进行了对比,没有发现差异,纠结了

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
7 [报告]
发表于 2014-09-01 19:52 |只看该作者
编译器用的是哪个版本? 我用GCC4.8.3编译arm时就有问题,找到补丁才解决问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP