【发布时间】:2015-06-18 21:36:48
【问题描述】:
我正在使用 xv6 操作系统,我的班级正在为它实现信号。
我已经弄清楚了如何在内核中实现处理程序(这是前两个练习),但现在我必须弄清楚如何运行用户定义的处理程序。
程序调用一个像这样的信号函数
signal(int signum, void (*handler)(int))
用户程序,比如alarmtest3.c,将其用户函数作为第二个参数传递:
signal (14, snooze); // 14 is the signum for alarm
我需要弄清楚的是一旦有信号,如何让内核调用另一个系统调用 sigret()。我相信需要这个系统调用来存储内核堆栈的陷阱帧的副本。关键是在一切发生后返回用户空间。
用户堆栈应如下所示:
|other stack frames|
|a few bytes of machine code to call sys_sigret|
|signum parameter for the handler function|
|address of the first byte of the code above|
我知道要存储什么机器代码,我在汇编文件中找到了它。我只是不知道“调用 sys_sigret 的几字节机器代码”是什么意思。如何将此机器码存储在堆栈中?
感谢您的帮助!
【问题讨论】:
标签: c assembly operating-system stack kernel