有人可以解释一下下面发生了什么吗?
# 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
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
我们实际上想在这里实现什么目标?
这类似于这个
一般来说,我很清楚我们正在尝试从 init (代码中的最后一行)运行 (hello )。
答案1
该文件是内核源代码树中 gen_init_cpio 程序的输入文件。
它生成一个 cpio 存档,适用于初始化文件系统与文件/目录/设备(=节点)/...在输入文件中列出。
语法是
file <name> <location> <mode> <uid> <gid> [<hard links>]
dir <name> <mode> <uid> <gid>\n
nod <name> <mode> <uid> <gid> <dev_type> <maj> <min>
slink <name> <target> <mode> <uid> <gid>
ETC。
启动时实际运行哪些程序取决于init
initramfs 中的程序。这里的init
程序是一个符号链接到hello
。
答案2
@jofel 已经以令人钦佩的准确性回答了这个问题 - 不过,它应该实现的是从内核空间到用户空间的切换。当内核加载时,它确保所有系统都可以运行,然后它会寻找init.
没有init
系统的启动将永远无法启动 - 您将永远无法与机器交互。
几年前,内核开发人员决定他们厌倦了支持 1001 种和不同可能的根设备配置 - 由于可能的根文件系统和根设备类型组合的数量庞大,处理启动计算机变得过于复杂。所以他们放弃了尝试。
Initramfs
自 2.6 起内置于每个 Linux 内核。从那时起,在所有情况下,用户空间都从那里开始——内核将计算机系统的控制权交给init
,然后坐下来观看烟花,并摆脱整个事件的影响。
你的问题中的文件描述的目录树是编译到内核本身的Linux根目录。它是内核会费心寻找的唯一根设备;其余的一切取决于init.