2023-2024-1 20232811《Linux内核原理与分析》第六周作业

202328 2023-10-29 13:26:53

目录

一、实验过程

1.打开实验楼,进入LinuxKernel,从https://github.com/torvalds/linux/blob/v3.18-rc6/arch/x86/syscalls/syscall_32.tbl中克隆menu

2.修改test.c文件,在test.c中加入getpid和getpidasm函数,重新编译成功后,输入help命令可以看到新增的功能

3.回到LinuxKernel目录下执行

4、在sys_getpid处设置断点,发现在执行getpid_asm时停下了,一直按n进行若干次单步执行进入schedule函数。

二、根据本周所学知识分析系统调用的过程,从 system_call 开始到 iret 结束之间的整个过程,并画出简要准确的流程图

三、总结

四、ChatGPT辅助学习


一、实验过程

1.打开实验楼,进入LinuxKernel,从https://github.com/torvalds/linux/blob/v3.18-rc6/arch/x86/syscalls/syscall_32.tbl中克隆menu

2.修改test.c文件,在test.c中加入getpid和getpidasm函数,重新编译成功后,输入help命令可以看到新增的功能

  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;
}

3.回到LinuxKernel目录下执行

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

4、在sys_getpid处设置断点,发现在执行getpid_asm时停下了,一直按n进行若干次单步执行进入schedule函数。

 

 

二、根据本周所学知识分析系统调用的过程,从 system_call 开始到 iret 结束之间的整个过程,并画出简要准确的流程图

三、总结

本次实验中,我使用了gdb工具跟踪分析了Linux内核中的两个系统调用函数:getpid 和 getppid。这帮助我更深入地理解了系统调用的执行过程,包括用户空间和内核空间之间的切换、参数传递、系统调用号的解析等。通过调试和观察寄存器状态的变化,我成功捕获了系统调用的执行步骤,并进一步绘制了流程图,以更清晰地展示系统调用的执行过程。


四、ChatGPT辅助学习

 

 

...全文
108 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

39

社区成员

发帖
与我相关
我的任务
社区描述
北京电子科技学院 《Linux内核原理与分析》课程
linuxarm开发系统安全 高校 北京·丰台区
社区管理员
  • rocflytosky
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧