Linux 操作系统分析总结
Linux 操作系统分析总结
课程总结
本学期Linux 操作系统分析课程主要学习了:
-
X86、ARM 架构下的汇编代码分析:学习部分汇编知识,结合不同平台下的指令集的异同点,为之后的课程中的源码分析打基础。
-
Linux 内核代码、编译与调试:这部分主要是偏向于通过编译linux内核,运行并调试,从而对操作系统有一个大致的了解,以便于之后课程内容的分析。
-
中断和异常:主要介绍了中断的分类、中断信号的处理;之后大量的篇幅结合硬件,以及实现的代码(init_8249A),描述了操作系统如何在初始化时创建终端描述符表 \(IDT\),从 IQR 线收到信号后终端控制器如何找到对应的中断处理程序以及对异常的处理;
-
进程管理:其中部分知识与操作系统课程相比,还结合了具体的实现代码进行分析,比如进程管理章节的
Task_struct
中的属性、参数,运行队列是怎么表示的,以及操作系统如何利用这些数据结构来通过特定的优先级算法进行任务调度等。 -
时钟:描述了Linux 系统下的各种定时器的数据结构以及相关处理函数的实现原理。
-
文件系统:本课程处理对创痛操作系统文件系统章节的知识点进行讲解外,还额外介绍了虚拟文件系统 \(VFS\)( \(Virtual\) \(File\) \(System)\),具体介绍了 VFS 是如何作用在应用程序和具体文件系统之间,为上层应用提供了统一的文件操作调用方式;
-
虚拟化技术
实验
实验1 :My Kernel
配置 & 编译
下载 linux 内核源码并解压:
axel -n 16 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
下载补丁:
axel https://raw.github.com/mengning/mykernel/master/mykernel-2.0_for_linux-5.4.34.patch
可能是被墙了,可以打开链接,将脚本内容保存并复制到文件 linux.patch
中;
查看差异:
patch -p1 < ../linux.patch
安装编译以及调试工具
sudo apt install build-essential gcc-multilib
sudo apt install libncurses5-dev bison flex libssl-dev libelf-dev
设置默认配置:
make defconfig
编译:
make -j 16
大概几分钟后:
编译出的目标文件:
运行
使用 qemu
启动内核:
安装 qemu 工具:
sudo apt install qemu
通过 qemu 启动内核(-kernel
选项指定内核镜像路径):
qemu-system-x86_64 -kernel arch/x86/boot/bzImage
实验2 :Debug Linux Kernel
安装编译以及调试工具
sudo apt install build-essential gcc-multilib
sudo apt install libncurses5-dev bison flex libssl-dev libelf-dev
编译配置
提供相关menu ,选择 debug:
make menuconfig
选择:
-
Compile-time checks and compiler options —>
[*] Compile the kernel with debug info
[*] Provide GDB scripts for kernel debugging
[*] Kernel debugging
最后 save
并 make
开始编译。
配置根文件系统
下载 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
编译时选择静态链接:
Settings ---> [*] Build static binary (no shared libs)
make
开始编译;
制作内存根文件系统
mkdir rootfs
cd rootfs
cp ../_install/* ./ -rf
mkdir dev proc sys home
sudo cp -a /dev/{null,console,tty,tty1,tty2,tty3,tty4} dev/
打包文件系统文件:
find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../rootfs.cpio.gz
通过 qemu 的选项 -initrd
挂载打包好的 rootfs.cpio.gz
,尝试启动内核,看是否可以执行:
qemu-system-x86_64 -kernel linux-5.4.34/arch/x86/boot/bzImage -initrd rootfs.cpio.gz
Debug
启动内核,开启 debug 服务端:
qemu-system-x86_64 -kernel linux-5.4.34/arch/x86/boot/bzImage -initrd rootfs.cpio.gz -S -s -nographic -append "console=ttyS0"
-nographic
:无界面
新开一个终端,进入 linux-5.4.34
,gdb vmlinux
命令加载elf 后然后链接服务端;
在操作系统入口点 start_kernel
函数打断点 (break start_kernel
),开始 debug:
此后就可以正常调试内核了:
下图为 list
指令查看 elf 中存储的源码: