构建基本initramfs

20190914_165301_40

20190914_165438_31

划重点

20191013_104626_73

为什么要保证Pid为1?

20191013_105047_95

    |--fork--> init
idle
    |--fork--> kthread

如何从内核切换到用户态?

0号进程创建1号进程的方式如下

kernel_thread(kernel_init, NULL, CLONE_FS);

完整脚本 10.build_basic_initramfs.sh

内核编译过程自己手动配置吧,这个要是也自动化,也不是不行,就是没这个必要哈~

#!/bin/bash

set -xe

[ -e initramfs ] && rm -rf initramfs
mkdir initramfs && cd initramfs

cat > init << EOF
#!/bin/bash
echo "Hello Linux!"
echo "Hello Linux!"
echo "Hello Linux!"
echo "Hello Linux!"
exec /bin/bash
EOF

chmod a+x init

mkdir bin
cp ../sysroot/bin/bash bin/
ldd bin/bash

mkdir lib
cp -d /vita/sysroot/lib/libdl* lib/
cp /vita/sysroot/lib/libc-2.15.so lib/
cp -d /vita/sysroot/lib/libc.so.6 lib/
cp /vita/cross-tool/i686-none-linux-gnu/lib/libgcc_s.so.1 lib/
cp -d /vita/sysroot/lib/ld-* lib/

ldd lib/libdl.so.1
ldd lib/libc.so.6
ldd lib/ld-linux.so.2
ldd lib/libgcc_s.so.1

tree lib

find . | cpio -o -H newc |gzip -9 > /vita/10.initrd.img
cp /vita/10.initrd.img /vita/boot


grub配置菜单,为了保存所有实验,因此对内核以及initrd都增加实验编号

menuentry 'vita-10'  {
        set root='(hd0,2)'
        linux   /boot/10.bzImage root=/dev/sda2 ro
	initrd /boot/10.initrd.img
}

20190914_173425_38

20190914_172242_33