问题描述
文件系统加载不成功,报错:No init found,如图(其中包含调试打印)
制作材料及过程
硬件:s3c2440芯片,256M Nand Flash
软件:用了现成的boot,内核是2.6.32,busybox是1.13.3,编译器是arm-linux-gcc 4.4.3,文件映像制作工具为mkyaffs2image-128M(由于FLASH使用的是256M)
制作过程:编译内核、busybox,制作/dev/console和/dev/null的node,制作/lib库,编写/etc/inittab
初步分析
编译均成功,从打印来看,boot成功引导内核,内核也已经起来了,且进入了kernel_init的init_post
也就是说,几个run_init_process函数都没跑成功,但文件系统中/sbin/init是存在的
跟踪run_init_process函数:run_init_process-->kernel_execve-->do_execve-->count,是在count处出错了,我把argc打出来是-14
进入count函数,发现时get_user出错了,EFAULT就是14
get_user是内核态用来从用户态读数据的函数,但里面已经是嵌入汇编代码了,实在分析不了了……
哪位高手可以帮忙分析一下,或者以前碰到类似情况,知道如何解决的,谢谢!
没有必要深入内核去分析这个过程,只要检查以下几点就行了:
1> 文件系统的根目录下存在linuxrc文件, 可以是脚本,也可以是可执行文件,还可以是符号链接(但不能跨文件系统)
2> /linuxrc具有可执行属性,且真正可执行
3> 如果/linuxrc是脚本文件,确认它的解释器也位于根目录下,并且可以正常使用
另外,如果是脚本的话,它的最后一行应当是:
exec /sbin/init
https://blog.csdn.net/colin_zhen/article/details/6662985
从这一句:
Failed to execute /linuxrc. Attempting defaults ...
目前的问题是无法正确执行init进程。你指定的init进程是应该是**/linuxrc**吧,而它是指向bin/busybox的软连接,也就是Failed to execute bin/busybox。
建议你仔细检查下busybox是否存在问题:
1. CPU架构是否正确(arm, arm64, ...)
2. 链接方式(动态、静态)
3. 其他