举例gdb,Linux跟踪分析系统调用
学号143 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/
前言
该博客基于《Linux系统分析》课程的实验,实验要求举例跟踪分析Linux内核5.0系统调用处理过程
1.编译5.0内核
2.选择系统调用号后两位与您的学号后两位相同的系统调用进行跟踪分析
Linux 5.0内核代码链接 https://github.com/mengning/linux/tree/v5.0
一、实验环境:基于VMware,Ubuntu14.04,qume模拟器,Linux5.0内核
环境搭建
下载Linux内核源代码
在源代码压缩包的目录下执行以下命令
xz -d linux-5.0.1.tar.xz
tar -xvf linux-5.0.1.tar
cd linux-5.0.1
安装内核编译工具
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev
配置编译内核
生成配置文件,以下选其一就好,make defconfig是缺省编译,只是包含部分核心功能,生成可能导致图形界面不能使用
make defconfig #按照默认值生成.config
make i386_defconfig #生成32位x86的配置⽂文件
make config #遍历选择编译内核功能
make allyesconfig #启用内核全部功能
make allnoconfig #内核功能选项全部为否
make menuconfig #开启⽂文本菜单选项,对窗⼝口有限制,尽量量调⼤大窗⼝口
使用make i386_defconfig报错,需要安装必要的依赖flex和bison
sudo apt-get install flex
sudo apt-get install bison
使用make或make -j*编译内核 ,*表示为cpu核心数,可以加快编译速度
make完成之后如下图所示
之后执行以下代码
mkdir rootfs
git clone https://github.com/mengning/menu.git
cd menu
gcc -o init linktable.c menu.c test.c -m32 -static –pthread
若是没有安装git还需要先执行
sudo apt-get install git
安装qemu 并 加载内核
sudo apt-get install qemu
qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img
弹出以下窗口
再执行make命令(据说要)
到这里我们可以开始做跟踪实验了
二、跟踪13号系统调用,该系统调用是__NR_times,即times()函数
原 型:time_t time(time_t * timer)
功 能: 获取当前的系统时间,返回的结果是一个time_t类型,其实就是一个大整数,其值表示从CUT(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数。然后调用localtime将time_t所表示的CUT时间转换为本地时间(我们是+8区,比CUT多8个小时)并转成struct tm类型,该类型的各数据成员分别表示年月日时分秒。
编写143.c文件,将时间转换成字符串时间打印出来
将143.c进行编译
启动两个终端一个运行下列代码
qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img -s -S
# -S freeze CPU at startup (use ’c’ to start execution)
# -s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
另一个执行gdb进行调试
gdb命令:
file 设置跟踪文件
b:设置断点
r:执行到断点
ni:单步执行
disass:显示汇编代码
info r:跟踪寄存器变化,显示寄存器内容
汇编代码如下所示 ,在前几行是寄存器初始化,ebx保存基址,在第五行mov $0xd,%eax是将系统调用号保存在eax寄存器中,0xd即16进制的13,表示调用13号系统调用,进入系统调用
三、总结
系统调用过程
实验简单的了解了系统调用的基本知识,包括内核态与用户态、内核栈与用户栈以及在系统调用过程中,如何从内核态过渡到用户态等。