linux-0.11调试教程,task3(02)系统调用sys_alarm和sigaction结构

系统调用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之前的情况。

linux-0.11调试教程,task3(02)系统调用sys_alarm和sigaction结构_第1张图片

0x7288既sys_alarm函数地址,在此下断点后,0x1819c是jiffies的地址,值为0x34既52加3000正好是3052





linux-0.11调试教程,task3(02)系统调用sys_alarm和sigaction结构_第2张图片


#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。

linux-0.11调试教程,task3(02)系统调用sys_alarm和sigaction结构_第3张图片



你可能感兴趣的:(linux-0.11调试教程,task3(02)系统调用sys_alarm和sigaction结构)