趣谈Linux操作系统
刘超
网易杭州研究院云计算技术部首席架构师
立即订阅
19393 人已学习
课程目录
已完结 72 讲
0/4登录后,你可以任选4讲全文学习。
入门准备篇 (3讲)
开篇词 | 为什么要学习Linux操作系统?
免费
01 | 入学测验:你究竟对Linux操作系统了解多少?
02 | 学习路径:爬过这六个陡坡,你就能对Linux了如指掌
核心原理篇:第一部分 Linux操作系统综述 (3讲)
03 | 你可以把Linux内核当成一家软件外包公司的老板
04 | 快速上手几个Linux命令:每家公司都有自己的黑话
05 | 学会几个系统调用:咱们公司能接哪些类型的项目?
核心原理篇:第二部分 系统初始化 (4讲)
06 | x86架构:有了开放的架构,才能打造开放的营商环境
07 | 从BIOS到bootloader:创业伊始,有活儿老板自己上
08 | 内核初始化:生意做大了就得成立公司
09 | 系统调用:公司成立好了就要开始接项目
核心原理篇:第三部分 进程管理 (10讲)
10 | 进程:公司接这么多项目,如何管?
11 | 线程:如何让复杂的项目并行执行?
12 | 进程数据结构(上):项目多了就需要项目管理系统
13 | 进程数据结构(中):项目多了就需要项目管理系统
14 | 进程数据结构(下):项目多了就需要项目管理系统
15 | 调度(上):如何制定项目管理流程?
16 | 调度(中):主动调度是如何发生的?
17 | 调度(下):抢占式调度是如何发生的?
18 | 进程的创建:如何发起一个新项目?
19 | 线程的创建:如何执行一个新子项目?
核心原理篇:第四部分 内存管理 (7讲)
20 | 内存管理(上):为客户保密,规划进程内存空间布局
21 | 内存管理(下):为客户保密,项目组独享会议室封闭开发
22 | 进程空间管理:项目组还可以自行布置会议室
23 | 物理内存管理(上):会议室管理员如何分配会议室?
24 | 物理内存管理(下):会议室管理员如何分配会议室?
25 | 用户态内存映射:如何找到正确的会议室?
26 | 内核态内存映射:如何找到正确的会议室?
核心原理篇:第五部分 文件系统 (4讲)
27 | 文件系统:项目成果要归档,我们就需要档案库
28 | 硬盘文件系统:如何最合理地组织档案库的文档?
29 | 虚拟文件系统:文件多了就需要档案管理系统
30 | 文件缓存:常用文档应该放在触手可得的地方
核心原理篇:第六部分 输入输出系统 (5讲)
31 | 输入与输出:如何建立售前售后生态体系?
32 | 字符设备(上):如何建立直销模式?
33 | 字符设备(下):如何建立直销模式?
34 | 块设备(上):如何建立代理商销售模式?
35 | 块设备(下):如何建立代理商销售模式?
核心原理篇:第七部分 进程间通信 (7讲)
36 | 进程间通信:遇到大项目需要项目组之间的合作才行
37 | 信号(上):项目组A完成了,如何及时通知项目组B?
38 | 信号(下):项目组A完成了,如何及时通知项目组B?
39 | 管道:项目组A完成了,如何交接给项目组B?
40 | IPC(上):不同项目组之间抢资源,如何协调?
41 | IPC(中):不同项目组之间抢资源,如何协调?
42 | IPC(下):不同项目组之间抢资源,如何协调?
核心原理篇:第八部分 网络系统 (7讲)
43 预习 | Socket通信之网络协议基本原理
43 | Socket通信:遇上特大项目,要学会和其他公司合作
44 | Socket内核数据结构:如何成立特大项目合作部?
45 | 发送网络包(上):如何表达我们想让合作伙伴做什么?
46 | 发送网络包(下):如何表达我们想让合作伙伴做什么?
47 | 接收网络包(上):如何搞明白合作伙伴让我们做什么?
48 | 接收网络包(下):如何搞明白合作伙伴让我们做什么?
核心原理篇:第九部分 虚拟化 (7讲)
49 | 虚拟机:如何成立子公司,让公司变集团?
50 | 计算虚拟化之CPU(上):如何复用集团的人力资源?
51 | 计算虚拟化之CPU(下):如何复用集团的人力资源?
52 | 计算虚拟化之内存:如何建立独立的办公室?
53 | 存储虚拟化(上):如何建立自己保管的单独档案库?
54 | 存储虚拟化(下):如何建立自己保管的单独档案库?
55 | 网络虚拟化:如何成立独立的合作部?
核心原理篇:第十部分 容器化 (4讲)
56 | 容器:大公司为保持创新,鼓励内部创业
57 | Namespace技术:内部创业公司应该独立运营
58 | CGroup技术:内部创业公司应该独立核算成本
59 | 数据中心操作系统:上市敲钟
实战串讲篇 (9讲)
60 | 搭建操作系统实验环境(上):授人以鱼不如授人以渔
61 | 搭建操作系统实验环境(下):授人以鱼不如授人以渔
62 | 知识串讲:用一个创业故事串起操作系统原理(一)
63 | 知识串讲:用一个创业故事串起操作系统原理(二)
64 | 知识串讲:用一个创业故事串起操作系统原理(三)
65 | 知识串讲:用一个创业故事串起操作系统原理(四)
66 | 知识串讲:用一个创业故事串起操作系统原理(五)
67 | 期末测试:这些操作系统问题,你真的掌握了吗?
结束语 | 永远别轻视任何技术,也永远别轻视自己
免费
专栏加餐 (2讲)
学习攻略(一):学好操作系统,需要掌握哪些前置知识?
“趣谈Linux操作系统”食用指南
免费
趣谈Linux操作系统
登录|注册

38 | 信号(下):项目组A完成了,如何及时通知项目组B?

刘超 2019-06-24
信号处理最常见的流程主要是两步,第一步是注册信号处理函数,第二步是发送信号和处理信号。上一节,我们讲了注册信号处理函数,那一般什么情况下会产生信号呢?我们这一节就来看一看。

信号的发送

有时候,我们在终端输入某些组合键的时候,会给进程发送信号,例如,Ctrl+C 产生 SIGINT 信号,Ctrl+Z 产生 SIGTSTP 信号。
有的时候,硬件异常也会产生信号。比如,执行了除以 0 的指令,CPU 就会产生异常,然后把 SIGFPE 信号发送给进程。再如,进程访问了非法内存,内存管理模块就会产生异常,然后把信号 SIGSEGV 发送给进程。
这里同样是硬件产生的,对于中断和信号还是要加以区别。咱们前面讲过,中断要注册中断处理函数,但是中断处理函数是在内核驱动里面的,信号也要注册信号处理函数,信号处理函数是在用户态进程里面的。
对于硬件触发的,无论是中断,还是信号,肯定是先到内核的,然后内核对于中断和信号处理方式不同。一个是完全在内核里面处理完毕,一个是将信号放在对应的进程 task_struct 里信号相关的数据结构里面,然后等待进程在用户态去处理。当然有些严重的信号,内核会把进程干掉。但是,这也能看出来,中断和信号的严重程度不一样,信号影响的往往是某一个进程,处理慢了,甚至错了,也不过这个进程被干掉,而中断影响的是整个系统。一旦中断处理中有了 bug,可能整个 Linux 都挂了。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《趣谈Linux操作系统》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(11)

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

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

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

    作者回复: 差不多的

    2019-06-25
    1
    1
  • Sharry
    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 恢复之前用户态栈
    2019-06-24
    1
  • Helios
    我们在 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-10-13
  • 嘉木
    21.这次因为 pt_regs 已经指向 line A 了,于是就到了进程 A 中,接着系统调用之后运行,然这个系统调用返回的是它被中断了,没有执行完的错误。

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

    作者回复: 谢谢啦

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

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

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

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

    2019-06-24
收起评论
11
返回
顶部