Linux操作系统分析学习总结

收获和感想

了解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....

在这里插入图片描述

参考资料

《庖丁解牛Linux操作系统分析》 孟宁

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值