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

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


学号后三位015
本实验来源 https://github.com/mengning/linuxkernel/

实验环境
Ubuntu 18.10(非虚拟机)

一 编译linux5.0内核

1.下载内核5.0内核代码,配置编译Linux内核

wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.0.1.tar.xz 
xz -d linux-5.0.1.tar.xz 
tar -xvf linux-5.0.1.tar 
cd linux-5.0.1 
make menuconfig  //并找到kernel hacking,->Compile-time checks and compiler options,选择 [*]compile the kernel with debug info
make -j4       //以四线程加速编译

在这里插入图片描述
出现错误
在这里插入图片描述在这里插入图片描述
安装缺少的文件

在这里插入图片描述在这里插入图片描述编译成功
在这里插入图片描述

2.制作根文件系统

cd ..
mkdir rootfs
git clone https://github.com/mengning/menu.git
cd menu
sudo apt install gcc-multilib
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的时候又出现错误,好像是64位gcc编译32位程序引起的,安装gcc库解决

sudo apt-get install gcc-multilib

在这里插入图片描述

3.启动MenuOS

qemu-system-i386 -kernel bzImage -initrd rootfs.img

在这里插入图片描述
4.跟踪调试内核启动

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

运行qemu虚拟机后,在当前目录新建一个终端窗口,运行下列命令:

cd linux-5.0.1
gdb
(gdb) file vmlinux
//建立与qemu调试端口的attach
(gdb) target remote:1234
(gdb) break start_kernel
(gdb) c

在这里插入图片描述在这里插入图片描述

二 跟踪系统调用

1.我的学号后两位是15,15号系统调用函数为chmod
2.采用系统API和汇编两种方式调用该函数,在桌面上建立两个程序:Chmod.c和Chmod_Asm.c,如下:

Chmod.c
在这里插入图片描述

Chmod_Asm.c

在这里插入图片描述
把系统待用的进程号15压入eax,调用中断指令int 0x80进入内核态,函数的两个参数分别存入寄存器ebx和ecx中。

分别编译运行,结果如下:
在这里插入图片描述

三 实验分析与总结

系统调用:
操作系统为用户态进程与硬件设备进行交互提供了一组接口——系统调用 :

把用户从底层的硬件编程中解放出来
极大的提高了系统的安全性
使用户程序具有可移植性

API调用:
应用编程接口(Application program interface,API)和系统调用是不同的,API只是一个函数定义系统调用通过软中断向内核发出一个明确的请求。Libc库定义的一些API引用了封装例程(wrapper routine,唯一目的就是发布系统调用)一般每个系统调用对应一个封装例程库再用这些封装例程定义出给用户的API不是每个API都对应一个特定的系统调用API可能直接提供用户态的服务(如,一些数学函数)。一个单独的API可能调用了几个系用调用,不同的API可能调用同一个系统调用。

总结如下:
操作系统为用户态运行的进程和硬件设备之间进行交互提供了一组接口,编程人员通过向内核发出系统调用,向操作系统提出服务请求,由操作系统代为完成。系统调用是用户态进入内核态的唯一接口,本身并非内核函数,但是由内核函数实现。进入内核之后,不同的系统调用会找到各自对应的内核处理函数,这些内核函数称为系统调用的服务例程。使用系统调用使编程更加容易,把用户从硬件设备的编程中解放出来,极大提高了系统的安全性,使得内核在满足用户的某个服务请求之前,能够事先检查用户请求的准确性。保护现场就是进入中断服务程序之前,保存需要用到的寄存器数据,恢复现场就是进入中断服务程序之前,恢复之前保存的寄存器数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值