系统调用sys_alarm相关代码:
int sys_alarm(long seconds)
{
int old = current->alarm;
if (old)
old = (old - jiffies) / HZ;
current->alarm = (seconds>0)?(jiffies+HZ*seconds):0;
return (old);
}
current->alarm的值为jiffies的值加上用户程序设置的秒数×HZ既秒数×100。
update里面设置的秒数是$0x1e既30。
27: 6a 1e push $0x1e
29: e8 5a 00 00 00 call 88 <_alarm>
下面的是系统调用sys_alarm之后的任务数据结构中的alarm的值,alarm的值为0xbec既3052
下面的是系统调用sys_alarm之前的情况。
0x7288既sys_alarm函数地址,在此下断点后,0x1819c是jiffies的地址,值为0x34既52加3000正好是3052。
#define SIGALRM 14
上图从第二行开始是任务数据结构的sigaction[]数组,最后一行是task_struct->sigaction[13]
struct sigaction {
void (*sa_handler)(int); 0x18
sigset_t sa_mask;
int sa_flags; 0xc0000000
void (*sa_restorer)(void); 0x170
};
下面的sigalrm函数就是用户自定义的信号处理函数,地址是0x18。