分析 system_call 中断处理过程
一、chatGPT问答
二、系统调用实验
1.打开QEMU模拟虚拟机
我们可以看到目前只有help,version,quit指令,分别表示输出命令,虚拟机版本,退出虚拟机
2.编辑 menu 中的 text.c,扩充 rename 和 rename_asm两项命令
进入menu文件,打开test.c的文件并修改,在main主函数中添加如下代码:
子函数rename:
int rename(){
int action;
char *oldname = "rename2804.c";
char *newname = "c.c";
action = rename(oldname,newname);
if(!action){
printf("Done\n");
}else{
printf("False\n");
}
return 0;
}
子函数rename_asm:
int rename_asm(){
int action;
char *old = "rename2804.c";
char *new = "asm.c";
asm volatile(
"movl %2,%%ecx\n\t"
"movl %1,%%ebx\n\t"
"movl $0x26,%%eax\n\t"
"int $0x80\n\t"
"movl %%eax,%0"
: "=m"(action)
: "b"(old),"c"(new)
);
if(!action){
printf("Done\n");
}else{
printf("False\n");
}
return 0;
}
主函数中加入
MenuConfig("rename","Change File name",rename);
MenuConfig("rename_asm","Change File name",rename_asm);
使用命令 make rootfs进行编译,使之生效
![](https://img-blog.csdnimg.cn/65c075d2696c45c4bfdad913b12d00fc.png)
重启虚拟机后,其中已经增加了rename,rename_asm两项功能
![](https://img-blog.csdnimg.cn/b2ed2bd9f1f94d9b8727cd81a31dd533.png)
三、开始追踪
1.断点设置
在 start_kernel 设置断点,在gdb中按c在start_kernel 处停下来,再在sys_rename设置断点,再按c
2.流程图
四、总结
系统调用时如同函数调用栈,在中断前需要保存系统调用的上下文,用于恢复后能够在原有的运行环境下继续正确执行。