Linux内核编程学习笔记-001-编译和启动内核

Linux内核学习笔记-001-编译和启动内核

本文来源:Moeomu的博客

准备环境

  • Ubuntu 20.04 LTS
  • Linux 4.9.229
  • Busybox 1.33.0
  • qemu

下载内核源代码和文件系统源代码

  • 在站点Kernel.org下载linux-4.9.229.tar.gz
  • 在站点Busybox.net下载busybox-1.33.0.tar.bz2
  • 通过apt安装qemu:sudo apt install qemu-system-x86

编译

编译内核

  • export ARCH=x86
  • make x86_64_defconfig
  • make menuconfig
    • 选中General Setup -> Initial RAM filesystem and RAM disk(initramfs/initrd) support
    • 选中Device Drivers -> Block devices -> RAM block device support
    • 修改Device Drivers -> Block devices -> RAM block device support -> (65536)default RAM disk size (kbytes)

如果这一步报错fatal error: curses.h,则安装一下sudo apt install libncurses5-dev

  • make

  • 编译好的内核被放置在目录arch/x86/boot下,文件名bzImage

编译busybox

  • make menuconfig
    • 选中Settings -> Build Options -> [*] Build Busybox as a static binary (no shard libs)
  • make && make install

打包文件系统

  • mkdir etc dev mnt

  • mkdir -p proc sys tmp

  • mkdir -p etc/init.d

  • vim etc/fstab

    1
    2
    3
    
    proc /proc proc defaults 0 0
    tmpfs /tmp tmpfs defaults 0 0
    sysfs /sys sysfs defaults 0 0
    
  • vim etc/init.d/rcS

    1
    2
    3
    4
    5
    6
    7
    8
    
    echo -e "Welcome to Moeomu Linux"
    /bin/mount -a
    echo -e "Remounting the root filesystem"
    mount -o remount rw /
    mkdir -p /dev/pts
    moutn -t devpts devpts /dev/pts
    echo /sbin/mdev > /proc/sys/kernel/hotplug
    mdev -s
    
  • chmod 755 etc/init.d/rcS

  • vim etc/inittab

    1
    2
    3
    4
    
    ::sysinit:/etc/init.d/rcS
    ::respawn:-/bin/sh
    ::askfirst:-/bin/sh
    ::cttlaltdel:/bin/umount -a -r
    
  • chmod 755 etc/inittab

  • cd dev

  • sudo mknod console c 5 1

  • sudo mknod null c 1 3

  • sudo mknod tty1 c 4 1

  • 以下代码在busybox源码目录下逐行执行

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    #!/bin/bash
    rm -rf rootfs.ext3
    sudo rm -rf fs
    dd if=/dev/zero of=./rootfs.ext3 bs=1M count=32
    mkfs.ext3 rootfs.ext3
    mkdir fs
    sudo mount -o loop rootfs.ext3 ./fs
    sudo cp -rf ./_install/* ./fs
    sudo umount ./fs
    gzip --best -c rootfs.ext3 > rootfs.img.gz
    
  • 最终生成了文件系统:rootfs.img.gz

使用QEMU运行系统

  • qemu-system-x86_64 -kernel ./linux-4.9.229/arch/x86_64/boot/bzImage -initrd ./busybox-1.33.1/rootfs.img.gz -append "root=/dev/ram init=/linuxrc" -serial file:output.txt

  • 预览如下

    RHildI.png

Built with Hugo
主题 StackJimmy 设计