Linux内核分析——分析system_call中断处理过程

时间:2021-03-22 02:02:55

万子惠 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

我选择的是getuid:

int Getuid(int argc ,char *argv)
{
pid_t uu;
uu=getuid();
printf("uu = %d \n", uu);
return 0;
} int GetuidAsm(int argc ,char *argv)
{ pid_t uu;
uu = getuid();
asm volatile(
"mov $0x24,%%eax\n\t"
"int $0x80\n\t"
"mov %%eax,%0\n\t"
:"=m"(uu)
);
printf("uu = %d \n",uu);
return 0; }

1)先更新menu

2)在main函数中添加新的MenuConfig并添加相应函数

3)之后进入menu中使用make rootfs=>自动编译生成根文件系统【还自动启动起来~】

Linux内核分析——分析system_call中断处理过程

然后我们开始调试:

1)qemu -kernel linux-3.18.6/arch/x86/bzImage -initrd rootfs.img -s -S

2)gdb

3)file linux-3.18.6/vmlinux

4)target remote:1234

Linux内核分析——分析system_call中断处理过程

5)之后设置断点:

这个函数我好像和表里不一样 我设置了两个sys_getuid的断点

可以看到运行停在了这里(被压到背后的那个黑色部分)

Linux内核分析——分析system_call中断处理过程

6)之后使用s进行单步的运行,在使用finish运行到最后,这时候

在system_call设置断点,看到这是一段在entry32.s的特殊汇编代码。

Linux内核分析——分析system_call中断处理过程

Linux内核分析——分析system_call中断处理过程

从system_call开始到iret结束过程流程图

Linux内核分析——分析system_call中断处理过程

system_call的处理过程中:

xyz<=系统调用号=>sys_xyz()
int 0x80<=中断向量=>system_call