fork()期间任务切换引发随机栈错误排查求助
自研OS中fork()系统调用的任务切换崩溃问题
我正在为自研操作系统实现用户态ELF程序的fork()系统调用。调用fork()后有时能正常回到父进程,但每次PIT时钟中断触发任务切换时程序都会崩溃,疑似栈损坏问题,已排查3天仍未解决。
核心代码模块
fork()函数:负责克隆页目录、创建子进程并初始化其栈与上下文,将父进程的系统调用寄存器压入子进程栈;process_switchNext():负责切换到下一个就绪进程,恢复分页与上下文并跳转执行;process_switchTask():PIT时钟中断触发时调用,保存当前进程上下文后执行任务切换;save_context汇编代码:用于保存进程上下文信息。
测试情况
- 预期行为:fork出子进程后调用3次虚拟系统调用,子进程返回0后输出"OK"并停机;
- 实际异常:PIT时钟触发切换后出现无效操作码异常,怀疑问题与父/子进程的栈创建或栈操作有关,无法正常对栈执行PUSH操作。
异常输出信息
createProcess: stack = 0x1ae580 Test program started syscall: Returning 2 Forking process fork: Beginning fork fork: pushing system call registers to address 0x609040 fork: Thread forked. IP=0x12156b. fork: parent SP=0x1ae430 BP=0x1ae4a4 IP=0x1ae428 syscall: Returning 2 Fork done syscall: Returning 2 process_switchTask(1) called - SP=0x1ae4b0 BP=0x1ae4e4 TLSBASE=0x0 IP=0x1ae4a8 isChild=0 -- switchNext() jumping to ESP=0x609000 EIP=0x12156b EBP=0x609040 isChild=1 =========================================================== panic() called! FATAL ERROR! *** ISR threw exception: Invalid opcode panic type: ISR Exception. err_code 0 REGISTER DUMP: eax=0x23, ebx=0x80480e6, ecx=0x8048174, edx=0x2 edi=0x9, esi=0xa, ebp=0x804810b, esp=0x609024 eip=0x8048211, cs=0x23, ss=0x202, eflags=0x80492b0, useresp=0x0
内容的提问来源于stack exchange,提问作者user25873577
相关产品推荐
相关产品推荐

