万子惠 + 原创作品转载请注明出处 + 《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=>自动编译生成根文件系统【还自动启动起来~】
然后我们开始调试:
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
5)之后设置断点:
这个函数我好像和表里不一样 我设置了两个sys_getuid的断点
可以看到运行停在了这里(被压到背后的那个黑色部分)
6)之后使用s进行单步的运行,在使用finish运行到最后,这时候
在system_call设置断点,看到这是一段在entry32.s的特殊汇编代码。
从system_call开始到iret结束过程流程图
system_call的处理过程中:
xyz<=系统调用号=>sys_xyz()
int 0x80<=中断向量=>system_call