• day10-内核实验项目概述与内核信号


    1.在系统中什么是信号,都有什么信号

    2.在系统接收到信号后,他是如何处理的

    3.信号作用

    信号处理流程:

    _system_call:

              call _sys_call_table(,%eax,4)

                    sys_signal

     sys_signal

    1. int sys_signal(int signum, long handler, long restorer)
    2. {
    3. //分配一个信号结构体
    4. struct sigaction tmp;
    5. //确定信号的范围
    6. if (signum<1 || signum>32 || signum==SIGKILL)
    7. return -1;
    8. //指定信号处理句柄
    9. tmp.sa_handler = (void (*)(int)) handler;
    10. //设置屏蔽码
    11. tmp.sa_mask = 0;
    12. //将该信号设置为执行一次就恢复
    13. tmp.sa_flags = SA_ONESHOT | SA_NOMASK;
    14. //保存回复函数指针
    15. tmp.sa_restorer = (void (*)(void)) restorer;
    16. handler = (long) current->sigaction[signum-1].sa_handler;
    17. current->sigaction[signum-1] = tmp;
    18. return handler;
    19. }

    do_signal函数

    1. void do_signal(long signr,long eax, long ebx, long ecx, long edx,
    2. long fs, long es, long ds,
    3. long eip, long cs, long eflags,
    4. unsigned long * esp, long ss)
    5. {
    6. unsigned long sa_handler;
    7. long old_eip=eip;
    8. struct sigaction * sa = current->sigaction + signr - 1;
    9. int longs;
    10. unsigned long * tmp_esp;
    11. sa_handler = (unsigned long) sa->sa_handler;
    12. /*
    13. mark #define SIG_DFL ((void (*)(int))0) default signal handling
    14. mark #define SIG_IGN ((void (*)(int))1) ignore signal
    15. */
    16. if (sa_handler==1)
    17. return;
    18. if (!sa_handler) {
    19. if (signr==SIGCHLD)
    20. return;
    21. else
    22. do_exit(1<<(signr-1));
    23. }
    24. if (sa->sa_flags & SA_ONESHOT)
    25. sa->sa_handler = NULL;
    26. *(&eip) = sa_handler;
    27. longs = (sa->sa_flags & SA_NOMASK)?7:8;
    28. *(&esp) -= longs;
    29. verify_area(esp,longs*4);
    30. tmp_esp=esp;
    31. put_fs_long((long) sa->sa_restorer,tmp_esp++);
    32. put_fs_long(signr,tmp_esp++);
    33. if (!(sa->sa_flags & SA_NOMASK))
    34. put_fs_long(current->blocked,tmp_esp++);
    35. put_fs_long(eax,tmp_esp++);
    36. put_fs_long(ecx,tmp_esp++);
    37. put_fs_long(edx,tmp_esp++);
    38. put_fs_long(eflags,tmp_esp++);
    39. put_fs_long(old_eip,tmp_esp++);
    40. current->blocked |= sa->sa_mask;
    41. }

    主要作用:

  • 相关阅读:
    OpenLayers 实现画点、画线、画面、画圆
    客服回复差评的话术模板
    Linux C文件操作
    学习模拟实现strlen strcmp strcpy strcat strstr等库函数
    2.6 宽带接入技术
    反射、枚举及lambda表达式
    排序---堆排
    Markdown还能这么玩?这款开源神器绝了~
    中间件安全:Apache 目录穿透.(CVE-2021-41773)
    java基础 日期工具类
  • 原文地址:https://blog.csdn.net/weixin_66218530/article/details/134261224