文章目录
分析 system_call 中断处理过程
一、系统调用实验
1.打开QEMU模拟虚拟机
目前只有最基本的help,version,quit指令,分别表示输出命令,虚拟机版本,退出虚拟机
2.编辑 menu 中的 text.c,扩充 rename 和 rename_asm两项命令
进入menu文件,打开test.c的文件并修改,在main主函数中添加如下代码:
子函数rename:
int rename(){
int action;
char *oldname = "rename2809.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 = "rename2809.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进行编译,使之生效
重启虚拟机
其中已经增加了rename,rename_asm两项功能
二、开始追踪
1.断点设置
在 start_kernel 设置断点,在gdb中按c在start_kernel 处停下来,再在sys_rename设置断点,再按c
2.流程图
总结
系统调用时如同函数调用栈,在中断前需要保存系统调用的上下文,用于恢复后能够在原有的运行环境下继续正确执行。