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

image-20220703221934233

下载补丁

axel https://raw.github.com/mengning/mykernel/master/mykernel-2.0_for_linux-5.4.34.patch

可能是被墙了,可以打开链接,将脚本内容保存并复制到文件 linux.patch 中;

查看差异:

patch -p1 < ../linux.patch

image-20220703221945733

安装编译以及调试工具
sudo apt install build-essential gcc-multilib
sudo apt install libncurses5-dev bison flex libssl-dev libelf-dev

设置默认配置:

make defconfig

image-20220703181304210

编译:

make -j 16

大概几分钟后:

image-20220703182611339

编译出的目标文件:

image-20220703182657621

运行

使用 qemu 启动内核:

安装 qemu 工具:

sudo apt install qemu

通过 qemu 启动内核(-kernel 选项指定内核镜像路径):

qemu-system-x86_64 -kernel arch/x86/boot/bzImage

image-20220703182757451


实验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

image-20220703184639741

选择:

  • Compile-time checks and compiler options —>
    [*] Compile the kernel with debug info
    [*] Provide GDB scripts for kernel debugging

    [*] Kernel debugging

最后 savemake 开始编译。

配置根文件系统

下载 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)

image-20220703191037560

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

image-20220703192027189

通过 qemu 的选项 -initrd 挂载打包好的 rootfs.cpio.gz,尝试启动内核,看是否可以执行:

qemu-system-x86_64 -kernel linux-5.4.34/arch/x86/boot/bzImage -initrd rootfs.cpio.gz

image-20220703192137841

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.34gdb vmlinux 命令加载elf 后然后链接服务端;

在操作系统入口点 start_kernel 函数打断点 (break start_kernel),开始 debug:

image-20220703192513220

此后就可以正常调试内核了:

下图为 list 指令查看 elf 中存储的源码:

image-20220703192834808


参考资料
posted @ 2022-07-03 22:11  NIShoushun  阅读(135)  评论(0编辑  收藏  举报