简体   繁体   English

使用initramfs在启动时运行程序

[英]Run program on boot with initramfs

I'm running uClinux on a SmartFusion2 as part of a University team building a small cube satellite. 作为构建小型立方体卫星的大学团队的一部分,我正在SmartFusion2上运行uClinux。 However, I'm not super experienced in Linux kernel, and this issue has had me stumped for a few days. 但是,我对Linux内核的经验不是很丰富,这个问题使我难过了几天。 I'm trying to get the SmartFusion to run a program on bootup. 我正在尝试让SmartFusion在启动时运行程序。 Currently, the only .uImage that does this is the test 'hello' file. 当前,唯一执行此操作的.uImage文件是测试“ hello”文件。 I'm trying to recreate the process for another program, but am running into some difficulties. 我正在尝试为另一个程序重新创建该过程,但是遇到了一些困难。

in my hello directory I have the following files: hello.busybox, hello.kernel.M2S, help.txt, hello.uImage, Makefile, hello.initramfs, hello (directory) 在我的hello目录中,我有以下文件:hello.busybox,hello.kernel.M2S,help.txt,hello.uImage,Makefile,hello.initramfs,hello(目录)

in the hello subdirectory (projects/hello/hello): 在hello子目录(projects / hello / hello)中:

hello (executable), hello.c, hello.gdb, hello.h, hello.o, Makefile hello(可执行),hello.c,hello.gdb,hello.h,hello.o,Makefile

to try and get the uImage to boot and run a different program, I made a copy of my projects/hello/hello directory and renamed it 'goodbye', with a few minor changes int the .h and .c files for testing purposes. 为了尝试让uImage启动并运行其他程序,我制作了一份projects / hello / hello目录的副本,并将其重命名为“再见”,对.h和.c文件进行了一些小的更改,以进行测试。 Now I'm trying to get the executable 'hello' in projects/hello/goodbye to run on boot. 现在,我试图在项目/ hello /再见中获取可执行文件“ hello”以在启动时运行。

My initramfs file originally looked like this: 我的initramfs文件最初看起来像这样:

# This is a very simple, default initramfs

dir /dev 0755 0 0
nod /dev/console 0600 0 0 c 5 1
nod /dev/tty 0666 0 0 c 5 0
nod /dev/null 0600 0 0 c 1 3
nod /dev/mem 0600 0 0 c 1 1
nod /dev/kmem 0600 0 0 c 1 2
nod /dev/zero 0600 0 0 c 1 5
nod /dev/random 0600 0 0 c 1 8
nod /dev/urandom 0600 0 0 c 1 9

dir /dev/pts 0755 0 0
nod /dev/ptmx 0666 0 0 c 5 2

nod /dev/ttyS0 0666 0 0 c 4 64
nod /dev/ttyS1 0666 0 0 c 4 65
nod /dev/ttyS2 0666 0 0 c 4 66
nod /dev/ttyS3 0666 0 0 c 4 67
nod /dev/ttyS4 0666 0 0 c 4 68
nod /dev/ttyS5 0666 0 0 c 4 69

dir /bin 755 0 0
dir /proc 755 0 0

file /bin/hello ${INSTALL_ROOT}/projects/${SAMPLE}/hello/hello 755 0 0
slink /bin/init hello 777 0 0
I changed the last two lines of the initramfs to read as follows:

file /bin/hello ${INSTALL_ROOT}/projects/${SAMPLE}/hello/goodbye 755 0 0
slink /bin/init hello 777 0 0

But when I try and boot the SmartFusion2 after remaking the uImage, I get this, witht the error at the bottom: 但是当我在重新构建uImage之后尝试启动SmartFusion2时,我得到了,但底部有错误:

Starting kernel ...

Linux version 2.6.33-arm1 (ecenstudent@EE10308) (gcc version 4.4.1 (Sourcery G++ Lite 2010q1-189) ) #38 Thu May 25 09:09:08 MDT 2017
CPU: ARMv7-M Processor [412fc231] revision 1 (ARMv7M)
CPU: NO data cache, 8K instruction cache
Machine: Microsemi M2S
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 16256
Kernel command line: m2s_platform=m2s-fg484-som console=ttyS0,115200 panic=10 ip=10.2.118.102:10.2.118.101:192.168.0.1::m2s-fg484-som:eth0:off ethaddr=3C:FB:96:05:00:53
PID hash table entries: 256 (order: -2, 1024 bytes)
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 64408k/64408k available, 1128k reserved, 0K highmem
Virtual kernel memory layout:
    vector  : 0x00000000 - 0x00001000   (   4 kB)
    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
    vmalloc : 0x00000000 - 0xffffffff   (4095 MB)
    lowmem  : 0xa0000000 - 0xa4000000   (  64 MB)
    modules : 0xa0000000 - 0x01000000   (1552 MB)
      .init : 0xa0008000 - 0xa0012000   (  40 kB)
      .text : 0xa0074bc0 - 0xa0083000   (  58 kB)
      .data : 0xa0084000 - 0xa008cce0   (  36 kB)
Hierarchical RCU implementation.
NR_IRQS:83
Calibrating delay loop... 132.30 BogoMIPS (lpj=661504)
Mount-cache hash table entries: 512
Switching to clocksource mss_timer2
Serial: 8250/16550 driver, 2 ports, IRQ sharing disabled
serial8250.0: ttyS0 at MMIO 0x40000000 (irq = 10) is a 16550A
console [ttyS0] enabled
serial8250.1: ttyS1 at MMIO 0x40010000 (irq = 11) is a 16550A
Freeing init memory: 40K
Kernel panic - not syncing: No init found.  Try passing init= option to kernel.
Backtrace: no frame pointer
Rebooting in 10 seconds..

Can somebody help explain why this is happening and what I need to do to my initramfs to make it run the proper program on boot? 有人可以帮忙解释为什么会这样,以及我需要对initramfs做些什么才能使其在启动时运行正确的程序? Thanks!! 谢谢!!

As it turns out, I was confused about how those two lines worked. 事实证明,我对这两行的工作方式感到困惑。 When I finally figured it out, they looked like this: 当我终于弄清楚了,他们看起来像这样:

file /bin/hello ${INSTALL_ROOT}/projects/${SAMPLE}/goodbye/hello 755 0 0
slink /bin/init hello 777 0 0

then it worked as desired, and I was able to implement it into other uImages. 然后它按预期工作,并且我能够将其实现到其他uImage中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM