这一篇中先不讨论用BusyBox制作根文件系统,继续讨论上一篇的initramfs。上节末尾的问题很简单,百度很多,或者早期linux源码中有答案。
对于上篇中的内存磁盘虚拟文件系统中的可执行文件init,如果我们现在启动文件名不为init,而是其他的名字,事实上虚拟磁盘文件的作用也不是用于执行init程序,而是里面放一些驱动程序,用于在挂载真正的根文件系统前,做好硬件环境的初始化工作。如下图,可执行文件名为RobotCodeInit,我们重新打包:
![512bc8ccc96ddd3004584b25edc00739.png](https://i-blog.csdnimg.cn/blog_migrate/5c6b60c770e754641d2c5ed9f7063d86.jpeg)
如上图,在Qemu中直接命令行通过指定-initrd时,可执行文件并不能被执行。因为内核默认的内存磁盘文件系统的可执行文件名为init,所以需要另一个Qemu的命令行参数,-append,此选项的作用是内核启动时,传入内核参数,可以将内核也看作为一个函数,指定内核参数,相当于传入了函数参数,此内核参数会控制内核的一些行为,如下图,在内核参数里不指定可执行文件名为RobotCodeInit时,此时会报错:
![515ce005040f81ece00e1d4b70d8983f.png](https://i-blog.csdnimg.cn/blog_migrate/912919b019db619140fc1e9b1de3eea1.jpeg)
我们指定内核参数选项后, qemu-system-arm -M versatileab -kernel ./arch/arm/boot/zImage -m 128M -nographic -dtb ./arch/arm/boot/dts/versatile-ab.dtb -initrd ./yyc/demo_initrd.img -append "rdinit=/RobotCodeInit",如下图:
![4f9e02ff9ef735063f8cfb9e2118a027.png](https://i-blog.csdnimg.cn/blog_migrate/fcddd3c28b28df8008a6a725fbe34ffb.png)
通过-append参数传入内核参数后,指定执行文件为RobotCodeInit,如下图,成功输出了预期结果:
![faace86e83178cb0dab72aed94e47e27.png](https://i-blog.csdnimg.cn/blog_migrate/5f41ec8999238c0752f4cc3a856a251d.jpeg)
--未完待续
欢迎关注下方的微信公众号,一起交流学习:)
![382573140e021475aa37988eab6d86aa.png](https://i-blog.csdnimg.cn/blog_migrate/a01e58b4d04205f8a626c8a32e6ed592.jpeg)