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

学号最后三位编号:094
原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/

0.实验内容

  • 编译内核5.0
  • qemu -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img
  • 选择系统调用号后两位与您的学号后两位相同的系统调用进行跟踪分析
  • https://github.com/mengning/menu
  • 给出相关关键源代码及实验截图,撰写一篇博客(署真实姓名或学号最后3位编号),并在博客文章中注明“原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/

 

一、编译内核

下载源码:

https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/(官方下载慢)
http://ftp.sjtu.edu.cn/sites/ftp.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

然后进入解压好的文件夹,进行配置

我没有使用i386的缺省编译;用make menuconfig进行设置,make -j2编译(编译完一共占了24g包括以前的一些东西,我默认设置的是20g空间)

(一定要确保空间够!!!)

(一定要确保空间够!!!)

(一定要确保空间够!!!)

重要的话说三遍

中间遇到的问题大多都是缺依赖,最头疼的是空间不够了,需要扩容,而且之前编译的也白费了

 

二、准备根文件系统

根据孟老师的文档,执行以下操作

cd Lab2
mkdir rootfs
git clone https://github.com/mengning/menu.git
cd menu/
//在这里来修改test.c加入自己学号后两位的系统调用
//我的学号是094 对应为fchmod 代码后附 gcc -o init linktable.c menu.c test.c -m32 -static -pthread cd ../rootfs/ cp ../menu/init ./ find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img

制作完成后,如下图

中间出现的问题:

解决方案:

https://blog.csdn.net/qq_32693119/article/details/80535662

三、启动qemu并调试

需要启动x86-64的cpu,所以改为qemu-system-x86_64启动

使用gdb调试

创建main.c,代码来源fchmod百度百科(用qemu交互,找不到函数,符号表需要重新编译内核,时间不够)

编译并执行094

对094进行调试

单步执行,并查看寄存器信息

其中eax中放的是系统调用号94,ebx和ecx中则为传入参数文件描述符和权限

然后进入系统调用:

call *%gs:0x10   系统调用会从这里进入,调用int 0x80,进入内核态,system_call()执行。

 

四、总结

关于94号系统调用fchmod,其过程为:

1.寄存器eax保存系统调用号94、ebx和ecx保存栈顶参数

2.调用中断指令int 0x80进入内核态

3.执行system_call(),此时根据eax查询系统调用表,找到服务地址,执行服务

4.服务结束后,恢复保存的现场,回到用户态,ret返回结果

 

posted @ 2019-03-19 21:49  findingA  阅读(191)  评论(0编辑  收藏  举报