从零写OS(五十一):三个崩溃,三个修复

性能优化之后,跑 ls | grep foo 时发现三类崩溃,分别来自三个不同的地方。 崩溃一:内核栈溢出 ls | grep foo 在 busybox sh 里需要同时运行三个进程:sh、ls、grep,加上 fork 的中间状态,进程数量一下上来了。 运行时随机崩溃,串口输出乱码。通过 QEMU 调试发现是内核栈溢出——某个进程的内核栈被覆盖了。 原来内核栈只有 4KB: #define STACK_SIZE 4096 p->stack = (uint8_t *)pmm_alloc(); // 只有 1 个物理页 busybox 的调用链比较深(sh → fork → exec → elf_load → ext2_read → bcache_get → …),4KB 撑不住。 改成 8KB,用 kmalloc 分配(pmm_alloc 只能分配 4KB): #define STACK_SIZE 8192 p->stack = (uint8_t *)kmalloc(STACK_SIZE); 崩溃二:cd .. 跳到根目录 / # mkdir -p /usr/bin / # cd /usr/bin /usr/bin # cd .. / # ← 应该到 /usr,结果跳到 / 路径解析遇到 .. 时,原来直接跳回根目录: ...

June 4, 2026 · 1 min · 大飞
京ICP备14031575号-3