zoukankan      html  css  js  c++  java
  • 【bug记录】OS Lab4 踩坑记

    OS Lab4 踩坑记

      Lab4在之前Lab3的基础上,增加了系统调用,难度增加了很多。而且加上注释不详细,开玩笑的指导书,自己做起来困难较大。也遇到了大大小小的bug,调试了一整天。

      本文记录笔者在实现Lab4中遇到了一些bug,出现的问题可能不具有普遍性,但是可能有参考价值。

      

      1. 在调用syscall_*函数的时候,可能会出现缺页的情况。

      

      注意缺页的地址,通过地址我发现错误出现在栈,栈顶不停下降。最后发现是mysyscall汇编函数忘记 jr ra 返回了。。。zz。这个bug是通过修改fktest.c代码,删除其中所有系统调用有关的函数后发现可以正常运行。

      2. 之后在系统调用的时候,发现总是出错返回,并没有完全执行。通过输出调试后,发现是envid2env()中当envid为0的时候,应当直接返回curenv,不进行后续操作。在后续操作里因为envid=0,判断过不了。

      3. fork时,父进程给子进程开异常处理栈空间的时候,地址应当是UXSTACKTOP - BY2PG。

      4. 在 sys_set_env_status 中,判断status的值的时候,与或写错了。。zz

      

      5. 这个bug卡了一个晚上,第二天用汇编调试才发现了问题。

      

      当父进程对用户栈那一页进行duppage时,duppage无法返回直接报错。通过一步步汇编调试,发现问题出在sp寄存器在发生缺页中断返回后,值变了。最后发现是traps.c中page_fault_handler中的错误。

      // TODO: 找出来为什么要这样写。

      

      6. 在运行pingpang.b时,发现有时候会出现俩个进程都在waiting,都是ENV_NOT_RUNNABLE的情况。最后发现是,在sys_ipc_can_send中忘记修改env_ipc_recving为0了。。。zz

      7. 在提交上去,第一部分结果为5/7,看水群里大佬说,是调度的问题。在调度时,如果该进程时间片没有用完,但是该进程的状态变为了ENV_NOT_RUNNABLE了,就应当让该进程停下来。提交上去后,可能有改变当前进程状态的情况发生。

  • 相关阅读:
    Git是如何存储对象的
    原来自己一直平凡着 2015-10-20
    把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列。
    #define XXX do{...}while(0)
    函数的递归调用例子学习
    MAC OSX 下安装 CTAGS
    MAC OSX 下安装Cscope
    python画图
    python读取文件内容方法
    python变量传递给系统命令的方法
  • 原文地址:https://www.cnblogs.com/Yzx835/p/10775984.html
Copyright © 2011-2022 走看看