You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 09:33:30