主机:Intel pentium 4,RHEL 6
Target:使用我自己的小型rootffile文件系统运行linux的ARM Cortex A9
我按照下面的说明开发了一个最小的initramfs文件系统:简约主义Initramfs和Initrd。
因此,我的个人资料只有以下几点:
1-控制台
2- init
init是具有以下代码的二进制代码:
* myinit.c
* Build instructions:
* ${CROSS_COMPILE}gcc -static init.c -o init
* */
#include <stdio.h>
int
main ()
{
printf ("\n");
printf ("Hello world from %s!\n", __FILE__);
while (1) { }
return 0;
}这在linux内核中运行得很好,在日志消息中,我得到了一条hello world消息。
但是,我想要的是,在打印hello之后,echo命令应该工作并执行以下操作:
echo 10 > test.txt
echo "$(cat test.txt)"所以我做的是:
#include <stdlib.h>
#include <stdio.h>
int main ()
{
printf ("\n");
printf ("Hello world from %s!\n", __FILE__);
system("echo 10 > test.txt");
system("echo \"$(cat test.txt)\"");
while (1) { }
return 0;
}我使用以下命令交叉编译代码:
arm-xilinx-linux-gnueabi-gcc -static echotest.c -o initHello正在正确打印,但echo没有作为文件的内容工作,也就是说,10没有打印。
注意:请注意,这次我的文件系统中有以下内容,即initramfs:
1-控制台
2- init (二进制表示第二个程序)
3- test.txt (一个空文件)
4-具有二进制echo的文件夹框
5-具有二进制cat的文件夹框
从这些上看,什么都没有。主要的想法是有一个最小的文件系统,只有真正需要的东西,我的应用。
二进制猫和回波我从一个正在工作的linux系统中复制。
请帮助我正确运行回波命令,如上?
更新
我的最新代码与安装/bin的位置相同:
#include <stdlib.h>
#include <sys/mount.h>
#include <errno.h>
#include <stdio.h>
void mount_sys() {
if (0 != mount("none", "/bin", "sysfs", 0, "")) {
perror("there is an error in mounting \n"); /* handle error */
}
printf("mounting successful");
}
int main ()
{
mount_sys();
printf ("\n");
printf ("Hello world from %s!\n", __FILE__);
system("echo 10 > test.txt");
system("echo \"$(cat test.txt)\"");
while (1) { }
return 0;
}不幸的是,这也不起作用。引导日志消息中的最后两行是:
mounting successful
Hello world from echotest.c! 发布于 2014-06-07 12:46:13
system()要求/bin/sh是可用的。
如果您想要最小化,那么使用fork/exec代替。像重定向这样的Shell结构将(很明显)不可用。
作为一种文体评论,总是检查系统调用的错误将是诊断问题的一个良好的第一开始,即使没有正常的恢复方法。
https://stackoverflow.com/questions/24096727
复制相似问题