【linux】信号(三)

本章节将会围绕信号处理进行展开讲解
在这里插入图片描述

目录

  • 回顾一下:
  • 历史问题:
    • 地址空间:
    • 键盘的输出如何被检测到:
    • 持续更新...

回顾一下:

信号处理也就是信号递达
我们说过递达时一种有3种行为

  1. 默认行为
  2. 忽略行为
  3. 自定义行为

历史问题:

我们其实一直都存在一个问题:一般信号发送时不会被立即处理,而是等到合适的时候进行处理,那么这个合适的时候究竟是什么时候?

先说结论:从内核态返回到用户态时进行处理。

这两个名词等会会有解释,现在重要的是先将脉络理清楚,在去深究细节。

返回时我们会先看此时pending表有没有为1的信号,在看是否阻塞,如果没有,那么我们就会执行handler函数,执行handler函数我们一般有3种行为

  • SIG_DFL :默认行为,大部分进行都是进行终止,如果是终止的话,我们OS在内核态会直接杀死进程,不会返回到main函数了。
  • SIG_ING:忽略行为,把对应的1->0,返回到main函数继续执行
  • 自定义:我们一般把这种情况叫做信号捕捉。
    也就是下图
    在这里插入图片描述

那我们现在就要理清一下这张图的逻辑。

首先,我们因为某些系统调用等情况进入到内核,当处理完进入到内核的情况后会检查信号,观察pending与block位图是否符合要求,如果是默认OS在内核态会直接杀死进程,不会返回到main函数了;如果是忽略把对应的1->0,返回到main函数继续执行;但是最恶心的是自定义行为,也就是我们这样图所示。

此时我们面临一个问题,OS可以直接去执行用户的代码吗?
答案是否定的,如果用户进行了exec等系列函数,或者代码出错,那么OS岂不就完蛋了吗,但是在技术角度肯定可以实现,但是仍然不会给你实现。

那就必须进行状态切换,让用户自己执行自己的代码,自己出错自己负责。

那么我们可以直接从第四步执行到第一步吗,
答案也是否定的,最直观的就是可以看到我们的handler函数并没有调用main函数,也就是没有直接的相互调用关系。

此时需要使用一些特殊的系统调用函数,返回内核再返回main函数继续执行。

这样我们就·大概了解了信号捕捉的流程。一个无穷符号。
对于如何快速记忆,我们可以先画一个无穷符号,在焦点的上方画一条横线。
在这里插入图片描述
横线上方是用户态,下方是内核态。

到现在为止要开始暂停一下了,我们要开始讲几个子问题,知道这些才能搞定内核态与用户态的区别。

地址空间:

我们先来看一个大概的图。
在这里插入图片描述
对于程序地址空间我们已经接触过很多次了,在自定义函数中会在正文代码内跳转,在申请内存时又会在堆中跳转,在使用动静态库时会在共享区跳转。综合来看也就只有内核[3,4]GB我们还没有接触过。

我们已经使用过很多次系统调用了,系统调用时函数,那么就会有函数地址,可是我们从没交过函数地址,那么他在哪里呢?


注意:OS是第一个在内存中被加载的软件,另外我们其实还有一份页表是内核级的,专门负责OS的映射。在这里插入图片描述
这也就意味着:OS本身就在我的地址空间中。
但也会有很多个进程同时存在的情况。
用户级的页表每个进程都有一个,但是内核级页表只有一个,他们是按照统一的方式进行映射在这里插入图片描述
这也就意味着,不论进程如何切换,我们总能找到OS,通过访问[3,4]GB的进而找到所有的代码和数据,就可以进行系统调用了!


所以访问系统调用其实是和访问库函数没有区别的,都是在地址空间中进行的。

而OS不会让用户直接进行访问内核的部分,要受到约束,所以要使用OS提供的系统调用进行访问!

键盘的输出如何被检测到:

我们先来看一个简图。
在这里插入图片描述
那么问题出现了,当我们按下键盘时,OS是通过何种方式得到我们的数据呢?
方法一:OS进行轮询–>结果:累死。
方法二:也是那些计算机软件科学家发明出来的。
根据冯诺依曼体系我们知道CPU不会和硬件直接打交道(数据层面),
在这里插入图片描述
但是当我们按下键盘的时候,会向CPU发送硬件中断(控制信号),每个硬件都有自己的中断号(假设键盘为3)。
在这里插入图片描述
CPU有很多针脚,也就是图中的红色凸出部分,我们向特定针脚发送高电平,CPU接受到信号就会将对应的中断号放入到对应的寄存器中,此时就变成软件了!只需要对软件进行操作即可。

那我们现在以软件的角度进行观察,第一个被加载的软件是OS,实际上,OS会首先形成一分函数指针数组,这些函数实际上是OS的一些方法,包括但不限于硬件的读写方法。
在这里插入图片描述
,所谓的中断号其实也就是对应的下标。
从此,当我们进行摁键盘的操作时,CPU会把当前所有的硬件任务停止,把中断号读到并去索引对应的方法下标。

这个表叫做中断向量表,所有的外设都是这样的!

持续更新…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/344943.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM之【字节码/Class文件/ClassFile 内容解析】

说在前面的话 字节码/Class文件/ClassFile 均为同一概念 Java语言:跨平台的语言(write once,run anywhere) 当Java源代码成功编译成字节码后,如果想在不同的平台上面运行,则无须再次编译这个优势不再那么吸引人了。Python、PHP、Perl、Ruby、Lisp等有…

28-LINUX--I/O复用-epoll

一.epoll概述 epoll 是 Linux 特有的 I/O 复用函数。它在实现和使用上与 select、poll 有很大差异。首 先,epoll 使用一组函数来完成任务,而不是单个函数。其次,epoll 把用户关心的文件描述 符上的事件放在内核里的一个事件表中。从而无需像…

xshell远程无法链接上VM的centos7

1、现象如下, 2.解决办法:查证后发现这个默认的设置为vmnet0 3.参考文章:Xshell连接不上虚拟机centos7_centos7的nat模式可以ping通网络,但是用xshell连不上是什么原因-CSDN博客

QT C++(QT控件 QPushButton,QRadioButton,QCheckBox)

文章目录 1. QPushButton 普通按钮2. QRadioButton 单选按钮3. QCheckBox 复选按钮 1. QPushButton 普通按钮 QPushButton中的重要属性 text:按钮中的文本icon:按钮的图标iconSize:按钮中图标的尺寸shortCut:按钮对应的快捷键&a…

STM32编程:实现LED灯闪烁(基于手写SDK的方式)

项目结构 stm32f10x.h 文件 //寄存器的值常常是芯片外设自动更改的,即使CPU没有执行程序,也有可能发生变化 //编译器有可能会对没有执行程序的变量进行优化//volatile表示易变的变量,防止编译器优化, #define __IO volati…

53.ReentrantLock原理

ReentrantLock使用 ReentrantLock 实现了Lock接口, 内置了Sync同步器继承了AbstractQueuedSynchronizer。 Sync是抽象类,有两个实现NonfairSync非公平,FairSync公平。 所以ReentrantLock有公平锁和非公平锁。默认是非公平锁。 public sta…

我的编程语言学习记录:一段不断探索的旅程

目录 我的编程语言学习记录:一段不断探索的旅程 1.引言 2.我的编程之旅开始 第一站:Python — 简洁之美 第二站:JavaScript — 网页的魔法 第三站:Java — 企业级的力量 3.学习过程中的挑战与克服 1.理解概念 3.记忆语法…

读书笔记:左耳听风

程序员如何用技术变现 我完全没有必要通过打工听人安排而活着,而是反过来通过在公司工作提高自己的技能,让自己可以更为独立和自由地生活。 因而,在工作当中,对于那些没什么技术含量的工作,我基本上就像是在学生时代那…

Java 的循环

Java 有三种循环&#xff1a;for&#xff0c;while&#xff0c;do while。 for 基本语法&#xff1a; for (循环变量初始化; 循环条件; 循环变量迭代){循环语句; }程序示例&#xff1a; public static void main(String[] args) {for (int i 0, j 0; i < 3; i, j--) {…

即时设计工具对决:Figma、Sketch与XD的优劣比较

最近几年&#xff0c;UI 设计工具出现了许多后起之秀&#xff0c;其中有四款更具代表性的UI设计软件&#xff1a;Sketch、Adobe XD、Figma 和 即时设计&#xff0c;这四个设计软件都有自己的优势。如果合作对您的UI设计过程至关重要&#xff0c;那么Figma 和 即时设计 它应该是…

FJSP:烟花算法(FWA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码

一、烟花算法介绍 参考文献&#xff1a; Tan, Y. and Y. Zhu. Fireworks Algorithm for Optimization. in Advances in Swarm Intelligence. 2010. Berlin, Heidelberg: Springer Berlin Heidelberg. 二、烟花算法求解FJSP 2.1FJSP模型介绍 柔性作业车间调度问题(Flexible …

SpringBoot: 可执行jar的特殊逻辑

这一篇我们来看看Java代码怎么操作zip文件(jar文件)&#xff0c;然后SpringBoot的特殊处理&#xff0c;文章分为2部分 Zip API解释&#xff0c;看看我们工具箱里有哪些工具能用SpringBoot的特殊处理&#xff0c;看看SpringBoot Jar和普通Jar的不同 1. Zip API解释 1. ZipFil…

Burp Suite Professional 2024.5 (macOS, Linux, Windows) - Web 应用安全、测试和扫描

Burp Suite Professional 2024.5 (macOS, Linux, Windows) - Web 应用安全、测试和扫描 Burp Suite Professional, Test, find, and exploit vulnerabilities. 请访问原文链接&#xff1a;Burp Suite Professional 2024.5 (macOS, Linux, Windows) - Web 应用安全、测试和扫描…

将字符串str1复制为字符串str2

定义两个字符数组str1和str2&#xff0c;再设两个指针变量p1和p2&#xff0c;分别指向两个字符数组中的有关字符&#xff0c;通过改变指针变量的值使它们指向字符串中的不同的字符&#xff0c;以实现字符的复制。编写程序&#xff1a; 运行程序&#xff1a; 程序分析&#xff1…

数据库(28)——联合查询

对于union查询&#xff0c;就是把多次查询的结果合并起来&#xff0c;形成一个新的查询结果集。 语法 SELECT 字段列表 FROM 表A... UNION [ALL] SELECT 字段列表 FROM 表B...; 演示 select * from user where age > 22 union all select * from user where age < 50; u…

MyBatisPlus插件生成代码

文章目录 概要安装插件使用插件 概要 MyBatis-Plus 是 MyBatis 的增强工具&#xff0c;旨在简化 MyBatis 的开发。MyBatis-Plus 代码生成器插件可以自动生成项目中常见的代码&#xff0c;如实体类、Mapper 接口、Service 接口和实现类、Controller 等&#xff0c;从而减少手动…

优化家庭网络,路由器无线中继配置全攻略(中兴E1600无线中继设置/如何解决没有预埋有线网络接口的问题/使用闲置路由实现WIFI扩展)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 网络优化 📒📒 操作步骤 📒💡适用场景🚨 常见问题及解决方案⚓️ 相关链接 ⚓️📖 介绍 📖 在现代家庭生活中,WiFi已经渗透到我们生活的每一个角落,成为了日常生活中不可或缺的一部分。然而,不少用户常常遇到W…

JVM学习-监控工具(一)

使用数据说明问题&#xff0c;使用知识分析问题&#xff0c;使用工具处理问题 无监控&#xff0c;不调优&#xff01; 命令行工具 在JDK安装目录下&#xff0c;可以查看到相应的命令行工具&#xff0c;如下图 jps(Java Process Status) 显示指定系统内所有的Hotpot虚拟机…

前端三大件速成 05 javascript(1)js组成、引入、基本语法

文章目录 一、js组成二、js的引入三、基本语法1、变量2、基本规范3、关键字4、数据类型&#xff08;1&#xff09;基本数据类型&#xff08;2&#xff09;引用数据类型&#xff08;3&#xff09;数据类型转换&#xff08;4&#xff09;typeof运算符 5、运算符6、流程控制&#…