linux实验:跟踪分析Linux内核5.0系统调用处理过程

学号后三位:288

原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 

1.实验要求:

  • 编译内核5.0
  • qemu -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img
  • 选择系统调用号后两位与学号后两位相同的系统调用进行跟踪分析
  • https://github.com/mengning/menu
  • 给出相关关键源代码及实验截图,撰写一篇博客,博客内容的具体要求如下:
    • 博客中需要使用实验截图
    • 博客内容中需要仔细分析系统调用、保护现场与恢复现场、系统调用号及参数传递过程
    • 总结部分需要阐明自己对系统调用工作机制的理解。

2.实验环境

    ubuntu 16.04

    VMware Workstation 15 Pro

3.实验过程

(1)编译内核5.0

    1.下载内核5.0.1的源码,链接:https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.0.1.tar.xz

    2.通过下面的指令解压文件linux-5.0.1.tar.x,文件是双重压缩,故需要进行两次解压

xz -d linux-5.0.1.tar.xz
tar -xvf linux-5.0.1.tar

linux实验:跟踪分析Linux内核5.0系统调用处理过程_第1张图片

上图显示解压完成,输入指令 cd linux-5.0.1进入文件夹,接着输入指令 make menuconfig出现两个错误

linux实验:跟踪分析Linux内核5.0系统调用处理过程_第2张图片

这是由于缺少文件ncurses package和flex  bison,输入指令安装上就好了

sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install flex bison

3. 重新输入make menuconfig,进入配置界面,并找到kernel hacking,->Compile-time checks and compiler options,选择 [*]compile the kernel with debug info

linux实验:跟踪分析Linux内核5.0系统调用处理过程_第3张图片

 

4. 输入make指令开始编译内核,此时出现了一个错误,缺少头文件openssl/opensslv.h,安装相关的库就好了,

安装库的指令:

sudo apt-get install libssl-dev

linux实验:跟踪分析Linux内核5.0系统调用处理过程_第4张图片

下面是内核编译已经完成

linux实验:跟踪分析Linux内核5.0系统调用处理过程_第5张图片

(2)制作根文件系统

    1.安装qemu

       输入 sudo apt-get install qemu安装qemu,出现错误需要进行更新,输入sudo apt-get update即可解决,然后重新安装,下图qemu已安装完成

linux实验:跟踪分析Linux内核5.0系统调用处理过程_第6张图片

 

    2.制作根文件系统

     输入以下指令

cd ~/LinuxKernel/
mkdir rootfs
git clone https://github.com/mengning/menu.git
cd menu
gcc -pthread -o init linktable.c menu.c test.c -m32 -static
cd ../rootfs
cp ../menu/init ./
find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img

在执行gcc -pthread -o init linktable.c menu.c test.c -m32 -static中出现一个错误,安装需要的库即可,继续输入指令

linux实验:跟踪分析Linux内核5.0系统调用处理过程_第7张图片

此时根文件系统已完成。

(3)启动MenuOs

    输入指令: qemu-system-i386 -kernel linux-5.0/arch/x86/boot/bzImage -initrd rootfs.img 启动MenuOs

linux实验:跟踪分析Linux内核5.0系统调用处理过程_第8张图片

(4)跟踪分析系统调用

    1.输入指令

qemu-system-x86_64 -kernel linux-5.0/arch/x86/boot/bzImage -initrd rootfs.img -s -S -append nokaslr

    然后使用gdb工具进行跟踪调试:

 gdb
(gdb)linux-5.0/vmlinux 
(gdb)target remote:1234 
(gdb)break start_kernel
(gdb) c

linux实验:跟踪分析Linux内核5.0系统调用处理过程_第9张图片

    如上图所示,系统停止在所设置的断点处。

    2.跟踪系统调用

      选择系统调用号后两位学号后两位相同的系统调用,我的学号后两位为88,在在/usr/include/asm/unistd_32.h中查询88号系统调用,为__NR_reboot,作用是用于重新启动。

linux实验:跟踪分析Linux内核5.0系统调用处理过程_第10张图片

    然后修改test.c的代码,加入reboot函数代码

    

linux实验:跟踪分析Linux内核5.0系统调用处理过程_第11张图片

linux实验:跟踪分析Linux内核5.0系统调用处理过程_第12张图片

然后按照之前的方法重新编译rootfs.img,跟踪调用的过程。

gcc -pthread -o init linktable.c menu.c test.c -m32 -static
cd …/rootfs
cp …/menu/init ./
find . | cpio -o -Hnewc |gzip -9 > …/rootfs.img

4.总结

       Linux系统就是通过内核发出的系统调用(system call)实现了用户态进程和硬件设备之间的大部分接口。计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同一时候执行的多个进程都须要訪问这些资源,为了更好的管理这些资源进程是不同意直接操作的,全部对这些资源的訪问都必须有操作系统控制。也就是说操作系统是使用这些资源的唯一入口,而这个入口就是操作系统提供的系统调用(System Call)。在linux中系统调用是用户空间訪问内核的唯一手段,除异常和陷入外,他们是内核唯一的合法入口。普通情况下应用程序通过应用编程接口API,而不是直接通过系统调用来编程。

       操作系统通常是通过中断从用户态切换到内核态。中断就是一个硬件或软件请求,要求CPU暂停当前的工作,去处理更重要的事情。比如在x86机器上能够通过int指令进行软件中断,而在磁盘完毕读写操作后会向CPU发起硬件中断。中断有两个重要的属性:中断号和中断处理程序。中断号用来标识不同的中断,不同的中断具有不同的中断处理程序。在操作系统内核中维护着一个中断向量表(Interrupt Vector Table),这个数组存储了全部中断处理程序的地址,而中断号就是对应中断在中断向量表中的偏移量。

 

你可能感兴趣的:(linux实验:跟踪分析Linux内核5.0系统调用处理过程)