收获和感想
了解Linux的环境,讲了X86、ARM64汇编基础和指令乱序问题
通过Linux操作系统源代码分析了解Linux内核调试环境的搭建和启动过程
理解Linux操作系统分别在X86、ARM64上的的系统调用实现
跟踪系统调用的内核处理过程,系统调用入口的保存现场、恢复现场和系统调用返回以及内核堆栈状态的变化
熟悉Linux操作系统中进程的描述、创建、管理、调度和切换
理解Linux操作系统中对中断和异常的处理
掌握Linux文件系统,文件格式以及程序如何编译、链接和装载
掌握Linux操作系统中设备管理方法以及设备驱动。
实验一:mykernel
虚拟一个x86-64的CPU硬件平台
下载mykernel补丁
•get https://raw.github.com/mengning/mykernel/master/mykernel-2.0_for_linux-5.4.34.patch
安装axel
•sudo apt install axel
下载linux内核源码
•axel -n 20 https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.34.tar.xz
将linux内核源码解压
•xz -d linux-5.4.34.tar.xz
•tar -xvf linux-5.4.34.tar
•cd linux-5.4.34
打上mykernel补丁
•patch -p1 < ../mykernel-2.0_for_linux-5.4.34.patch
安装调试工具
•sudo apt install build-essential gcc-multilib
•sudo apt install qemu # install QEMU
•sudo apt install libncurses5-dev bison flex libssl-dev libelf-dev
配置文件
•make defconfig # Default configuration is based on 'x86_64_defconfig'
编译
•make -j$(nproc)
•qemu-system-x86_64 -kernel arch/x86/boot/bzImage2、debug linux kernel
实验二 debug linux kernel
开发工具
sudo apt install build-essential
sudo apt install qemu # install QEMU
sudo apt install libncurses5-dev bison flex libssl-dev libelf-dev
内核源码下载
sudo apt install axel
axel -n 20 https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.34.tar.xz
xz -d linux-5.4.34.tar.xz
tar -xvf linux-5.4.34.tar
cd linux-5.4.34
内核配置
make defconfig # Default configuration is based on 'x86_64_defconfig'
make menuconfig
# 打开debug相关选项
Kernel hacking --->
Compile-time checks and compiler options --->
[*] Compile the kernel with debug info
[*] Provide GDB scripts for kernel debugging
[*] Kernel debugging
# 关闭KASLR,否则会导致打断点失败
Processor type and features ---->
[] Randomize the address of the kernel image (KASLR)
内核编译和运行
make -j$(nproc) # nproc gives the number of CPU cores/threads available
# 测试一下内核能不能正常加载运行,因为没有文件系统最终会kernel panic
qemu-system-x86_64 -kernel arch/x86/boot/bzImage
制作根文件系统
首先从https://www.busybox.net下载 busybox源代码解压
跟内核一样先配置编译,并安装。
axel -n 20 https://busybox.net/downloads/busybox-1.31.1.tar.bz2
tar -jxvf busybox-1.31.1.tar.bz2
cd busybox-1.31.1
make menuconfig
记得要编译成静态链接,不用动态链接库。
Settings --->
[*] Build static binary (no shared libs)
然后编译安装,默认会安装到源码目录下的 _install 目录中。
make -j$(nproc) && make install
制作内存根文件系统镜像
mkdir rootfs
cd rootfs
cp ../busybox-1.31.1/_install/* ./ -rf
mkdir dev proc sys home
sudo cp -a /dev/{null,console,tty,tty1,tty2,tty3,tty4} dev/
添加如下内容到init文件,准备init脚本文件放在根文件系统跟目录下。
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
echo "Wellcome MengningOS!"
echo "--------------------"
cd home
/bin/sh
添加可执行权限,打包成内存根文件系统镜像
chmod +x init
find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../rootfs.cpio.gz
测试挂载根文件系统,看内核启动完成后是否执行init脚本
qemu-system-x86_64 -kernel linux-5.4.34/arch/x86/boot/bzImage -initrd rootfs.cpio.gz
debug linux kernel
qemu-system-x86_64 -kernel linux-5.4.34/arch/x86/boot/bzImage -initrd rootfs.cpio.gz -S -s -nographic -append "console=ttyS0"
启动gdb,把内核符号表加载进来,建立连接:
gdb vmlinux
(gdb) target remote:1234
(gdb) b start_kernel
c、bt、list、next、step....