• 安排
    2019-06-24
    能把这个流程串起来,老师功力深厚啊
    
     13
  • 江山未
    2019-08-15
    感觉看的过程中,我的大脑不断的发出"我看不懂"的中断,让我不断的的从"认真态"返回到"涣散态"。随后执行启动时注册的看不懂处理函数"逼自己看"后,才重新进入"认真态"(并不能)。

    作者回复: 赞,很生动,加油

    
     4
  • 小龙的城堡
    2019-06-24
    这一章讲得非常棒!很清晰!感谢老师!
    
     2
  • chengzise
    2019-06-25
    老师好,文章的信号处理流程是在程序进入系统调用后接收到信号的情况。希望老师补充一下,程序没有进入系统调用(一个简单的死循环程序),此时接收到系统信号会走什么样的流程。谢谢。

    作者回复: 差不多的

     1
     1
  • Sharry
    2019-06-24
    Linux 信号通信主要由如下几个步骤组成
    - 信号处理函数的注册
      - 信号处理函数的注册, 定义在用户空间
      - 注册最终通过 rt_sigaction 系统调用发起
      - 将用户空间定义的信号处理函数保存到 task_struct 中 sighand 的 action 数组中
    - 信号的发送
      - 信号的发送通过 kill/tkill/tgkill/rt_sigqueueinfo 函数执行
      - 最终通过 __send_signal, 将这个信号添加到对应 进程/线程 的信号待处理链表中
        - < 32 为不可靠信号, 待处理列表中存在该信号, 则会自动忽略
        - >= 32 为可靠信号, 同一个信号会被添加到信号队列中
    - 信号的处理
      - 信号的处理会在系统调用或中断处理结束返回用户空间的时机通过 exit_to_usermode_loop 中的 do_signal 执行
      - 修改用户函数栈, 插入我们构建的信号处理函数的栈帧 rt_sigframe, 并且将原来的函数栈信息保存在 uc_mcontext 中
      - 信号处理函数执行结束之后, 会通过系统调用 rt_sigreturn 恢复之前用户态栈
    展开
    
     1
  • shangyu
    2019-12-22
    最后的图一目了然 👍
    
    
  • Helios
    2019-10-13
    我们在 get_sigframe 中会得到 pt_regs 的 sp 变量,也就是原来这个程序在用户态的栈顶指针,然后 get_sigframe 中,我们会将 sp 减去 sizeof(struct rt_sigframe),也就是把这个栈帧塞到了栈里面,然后我们又在 __setup_rt_frame 中把 regs->sp 设置成等于 frame。这就相当于强行在程序原来的用户态的栈里面插入了一个栈帧,并在最后将 regs->ip 设置为用户定义的信号处理函数 sa_handler。这意味着,本来返回用户态应该接着原来的代码执行的,现在不了,要执行 sa_handler 了。那执行完了以后呢?按照函数栈的规则,弹出上一个栈帧来,也就是弹出了 frame。


    ------------------------

    **我们会将 sp 减去 sizeof(struct rt_sigframe),也就是把这个栈帧塞到了栈里面**
    老师,请问这句话怎么理解呢,为什么把sp减去sizeof(struct rt_sigframe)就是把帧放到栈里面呢?

    **我们又在 __setup_rt_frame 中把 regs->sp 设置成等于 frame。这就相当于强行在程序原来的用户态的栈里面插入了一个栈帧**
    为什么要把sp先减掉一部分,在换指向呢,直接换指向不行么
    展开
    
    
  • 嘉木
    2019-08-12
    21.这次因为 pt_regs 已经指向 line A 了,于是就到了进程 A 中,接着系统调用之后运行,然这个系统调用返回的是它被中断了,没有执行完的错误。

    清除SA_RESTART标志位的话会返回没有执行完的错误,但如果设置了SA_RESTART,系统调用会在哪一步重试呢?
    
    
  • 饭粒
    2019-08-06
    梳理的真清楚。

    作者回复: 谢谢啦

    
    
  • humor
    2019-06-25
    老师,我突然想到了一个稍微无关的问题想请教一下。就是linux的安全问题,现在基本服务器上使用的操作系统都是linux,而安装linux只是下载一个系统镜像就可以安装了,但是,我们怎么能相信我们下载的linux镜像肯定没有安全问题呢,比如发布方安装了恶意程序或者开了一个后门之类的。我想了解一下一般的云服务厂商是怎么检测这类操作系统或者更加底层的硬件的安全问题的呢?

    作者回复: 有安全硬件,还有安全操作系统的,不过还是要相信linux

     2
    
  • 许童童
    2019-06-24
    讲得太好了,真是深入浅出啊!
    
    
  • 刘強
    2019-06-24
    老师,既然内核态对用户态的栈随意操作(果然是内核,权利就是大),但返回的时候还是保持系统调用前的样子,丝毫没有察觉背后发生了这么多事情,就好像调用了一个普通用户态的函数一样,那么我在用户态调试程序的时候,能否看到这种内核对用户栈的修改?

    作者回复: 不能,调试也是靠信号

    
    
我们在线,来聊聊吧