dibingfa / flash-linux0.11-talk

你管这破玩意叫操作系统源码 — 像小说一样品读 Linux 0.11 核心代码
19.47k stars 2.64k forks source link

linux0.11信号处理的一些疑问,望解答,谢谢 #76

Closed lzljbsc closed 1 year ago

lzljbsc commented 1 year ago

linux0.11中信号处理测试,借用库中 linux-0.11-quickstart ,启动系统后,在linux0.11中测试SIGINT信号,但设置的信号处理函数 (signal(SIGINT, handler)), 当输入 Ctrl+C 时,无法进入 handler 函数。 通过在内核 do_signal 中增加调试信息,确认当输入 Ctrl+C 时,已进入 do_signal ,并且 sa_handler 确实是设置的信号处理函数。

请问,您测试过程遇到郭这个问题吗?

lzljbsc commented 1 year ago

自己终结下。 经过测试,得到如下结论: do_signal 函数中,需要对内核堆栈中的数据进行修改,即 (&eip)=sa_handler, (&esp) -= longs; 而在 bochs 中测试发现,这两个用于修改堆栈数据的代码不起作用,即无法更改内核堆栈中的 返回地址和堆栈指针, 这样在内核态返回到用户态时,仍然按照没有信号的路径返回到原被中断的代码。 需要对 eip, esp 引用下地址即可使上面两句代码生效,测试发现OK。 只要在 do_signal 函数中增加如下代码即可,PS:代码没有实际作用, unsigned long tmp; tmp = (unsigned long )&eip; tmp = (unsigned long *)&esp; if ((unsigned long)tmp) signr = signr;

不知道这样的问题是不是 bochs 导致的,不了解 bochs,不做分析了。。