简说linux笔记总结:https://www.bilibili.com/opus/524289977842234888

0.环境准备及内核编译

  1. apt-get update
  2. apt install build-essential //安装makegcc
  3. apt-get install libncurses5-dev //安装ncurses-devel
  4. apt-get install flex //安装flex
  5. apt-get install bison //安装bison
  6. apt install libelf-dev
  7. apt install libssl-dev
  8. apt-get install qemu-system

下载linux-4.9.229内核源码

  1. # 解压文件
  2. sudo tar -xf linux-4.9.229.tar.xz
  3. # 进入目标目录
  4. cd linux-4.9.229
  5. # make操作
  6. export ARCH=x86
  7. make x86_64_defconfig
  8. make menuconfig

按如下步骤配置kgdb调试功能

  1. General setup --->
  2. ----> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
  3. Device Drivers --->
  4. [*] Block devices --->
  5. <*> RAM block device support
  6. (65536) Default RAM disk size (kbytes)

Ubuntu上编译Linux内核 - 图1

Ubuntu上编译Linux内核 - 图2

特别注意:<*> RAM block device support的选项必须为“<*>”,而不是”M”

  1. # 开始编译
  2. make -j8

Ubuntu上编译Linux内核 - 图3

  1. # 安装QEMU
  2. sudo apt-get install qemu-system

以下是基于 BusyBox 最新版本制作根文件系统的完整、详细步骤,按照顺序执行即可:


1. 下载并编译 BusyBox

1.1 下载源码

从 BusyBox 官方网站下载源码,并解压到工作目录:

  1. wget https://busybox.net/downloads/busybox-1.30.0.tar.bz2
  2. tar -xjf busybox-1.30.0.tar.bz2
  3. cd busybox-1.30.0

1.2 配置 BusyBox

使用 make menuconfig 配置 BusyBox:

  1. make menuconfig

在配置界面中:

  1. Busybox Settings --->
  2. Build Options --->
  3. [*] Build BusyBox as a static binary (no shared libs)

Ubuntu上编译Linux内核 - 图4

1.3 编译 BusyBox

使用 make 编译:

  1. make && make install

编译完成后的busybox就安装在源码根目录下的_install目录,进入_install目录,补充一些必要的文件或目录:

  1. mkdir etc dev mnt
  2. mkdir -p proc sys tmp
  3. mkdir -p etc/init.d/
  4. nano etc/fstab
  5. proc /proc proc defaults 0 0
  6. tmpfs /tmp tmpfs   defaults 0 0
  7. sysfs /sys sysfs defaults 0 0
  8. nano etc/init.d/rcS
  9. echo -e "Welcome to tinyLinux by Kinbos..."
  10. /bin/mount -a
  11. echo -e "Remounting the root filesystem"
  12. mount -o remount,rw /
  13. mkdir -p /dev/pts
  14. mount -t devpts devpts /dev/pts
  15. echo /sbin/mdev > /proc/sys/kernel/hotplug
  16. mdev -s
  17. chmod 755 etc/init.d/rcS
  18. nano etc/inittab
  19. ::sysinit:/etc/init.d/rcS
  20. ::respawn:-/bin/sh
  21. ::askfirst:-/bin/sh
  22. ::ctrlaltdel:/bin/umount -a -r
  23. chmod 755 etc/inittab
  24. cd dev
  25. mknod console c 5 1
  26. mknod null c 1 3
  27. mknod tty1 c 4 1

开始制作根文件系统镜像:(在_install父级目录)

  1. 先制作一个空的镜像文件;

  2. 然后把此镜像文件格式化为ext3格式;

  3. 然后把此镜像文件挂载,并把根文件系统复制到挂载目录;

  4. 卸载该镜像文件。

  5. 打成gzip包。

  1. #!/bin/bash
  2. rm -rf rootfs.ext3
  3. rm -rf fs
  4. dd if=/dev/zero of=./rootfs.ext3 bs=1M count=32
  5. mkfs.ext3 rootfs.ext3
  6. mkdir fs
  7. mount -o loop rootfs.ext3 ./fs
  8. cp -rf ./_install/* ./fs
  9. umount ./fs
  10. gzip --best -c rootfs.ext3 > rootfs.img.gz

开始启动QEMU:(如果要kgdb调试需要追加 -s -S)

  1. qemu-system-x86_64 \
  2. -kernel ./linux-5.19/arch/x86_64/boot/bzImage \
  3. -initrd ./busybox-1.37.0/rootfs.img.gz \
  4. -append "root=/dev/ram init=/linuxrc nokaslr" \
  5. -serial file:output.txt -s -S

Ubuntu上编译Linux内核 - 图5

gdb调试:

  1. gdb ./linux-4.9.229/vmlinux
  2. target remote localhost:1234

用vscode打开内核代码:

  1. #注意参数:--user-data-dir=/root,否则无法保存
  2. code --user-data-dir=/root linux-5.19

在launch.json中配置,如果没有这个文件可以手动创建。

  1. {
  2. "version": "0.2.0",
  3. "configurations": [
  4. {
  5. "type": "cppdbg",
  6. "request": "launch",
  7. "name": "kernel GDB",
  8. "program": "${workspaceFolder}/vmlinux",
  9. "cwd":"${workspaceFolder}",
  10. "MIMode":"gdb",
  11. //"miDebuggerPath":"/usr/bin/gdb-multiarch",
  12. "miDebuggerServerAddress": "localhost:1234",
  13. "stopAtConnect": true,
  14. },
  15. ]
  16. }

在运行qemu-system-x86_64命令后按F5开始调试:

  1. qemu-system-x86_64 \
  2. -kernel ./linux-5.19/arch/x86_64/boot/bzImage \
  3. -initrd ./busybox-1.37.0/rootfs.img.gz \
  4. -append "root=/dev/ram init=/linuxrc nokaslr" \
  5. -serial file:output.txt -s -S

Ubuntu上编译Linux内核 - 图6