修复kill和ps
修改 1: kernel/proc/signal.c — 修复 busybox kill 无效
问题:default_handle() 只处理了 SIGKILL (9) 和 SIGCHLD (17)。当 busybox 发送 SIGTERM (15,kill 默认信号) 时,default_handle 不执行任何操作,进程不会被终止。
修改:在 switch 中添加 default 分支,对所有未显式处理的信号(SIGTERM、SIGINT、SIGQUIT、SIGUSR1 等)设置 p->killed = 1。保留 SIGCHLD、SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU、SIGCONT 不做终止处理。
修改 2: kernel/fs/procfs.c — 修复 busybox ps 卡死
问题:procfs_getdents() 每次调用都重新生成全部目录项,不使用 f->f_pos 追踪已返回的位置。busybox 在循环中调用 getdents64,每次都得到非零返回值(相同的目录项),永远收不到 0(EOF),导致死循环。
修改:在函数开头检查 pf->offset,若 > 0 则直接返回 0(表示目录已读完)。首次调用生成全部条目后设置 pf->offset = 1,保证后续调用返回 EOF。
修改 3: kernel/sys/sysfile.c — 防止缓冲区溢出
问题:sys_getdents64 通过 kalloc() 分配单个页面(PGSIZE),但将用户请求的 len 原样传给底层函数。若 len > PGSIZE,procfs_getdents 可能写越界。
修改:vfs_ext_getdents(f, d, MIN(len, PGSIZE)),将 count 限制在分配的缓冲区大小以内。