39
社区成员




目录
2.修改test.c文件,在test.c中加入getpid和getpidasm函数,重新编译成功后,输入help命令可以看到新增的功能
4、在sys_getpid处设置断点,发现在执行getpid_asm时停下了,一直按n进行若干次单步执行进入schedule函数。
二、根据本周所学知识分析系统调用的过程,从 system_call 开始到 iret 结束之间的整个过程,并画出简要准确的流程图
getpid和getpidasm函数
int Getpid(int argc,char*argv[]){
int pid;
pid = getpid();
printf("pid=%d\n",pid);
return 0;
}
int Getpidasm(int argc, char *argv[]){
int pid;
asm volatile(
"mov $0,%%ebx\n\t"
"mov $0x14,%%eax\n\t"
"int $0x80\n\t"
"mov %%eax,%0\n\t"
:"=m"(pid)
);
printf("pid = %d\n",pid);
return 0;
}
qemu-kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
再打开另一个终端进行调试
gdb file linux-3.18.6/vmlinux
gdb target remote:1234
本次实验中,我使用了gdb工具跟踪分析了Linux内核中的两个系统调用函数:getpid 和 getppid。这帮助我更深入地理解了系统调用的执行过程,包括用户空间和内核空间之间的切换、参数传递、系统调用号的解析等。通过调试和观察寄存器状态的变化,我成功捕获了系统调用的执行步骤,并进一步绘制了流程图,以更清晰地展示系统调用的执行过程。