万子惠 + 原创作品转载请注明出处 + 《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