展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 硬件相关 > Linux学习指南:进程信号产生(三) 硬件异常、除零、野指针及core文件

Linux学习指南:进程信号产生(三) 硬件异常、除零、野指针及core文件

?前言硬件异常被硬件以某种⽅式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号。例如当前进程执⾏了除以0的指令,CPU的运算单元会产⽣异常,内核将这个异常解释为SIGFPE信号发送给进程。再⽐如当前进程访问了⾮法内存地址,MMU会产⽣异常,内核将这个异常解释为SIGSEGV信号发送给进程。?模拟除0代码语言:javascript代码运行次数:0运行复制#include#include#include#include#includeintmain(){if(fork()==0

?前言

硬件异常被硬件以某种⽅式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号。例如当前进程执⾏了除以0的指令,CPU的运算单元会产⽣异常,内核将这个异常解释为SIGFPE信号发送给进程。再⽐如当前进程访问了⾮法内存地址,MMU会产⽣异常,内核将这个异常解释为SIGSEGV信号发送给进程。

?模拟除0
【linux学习指南】Linux进程信号产生(三) 硬件异常&&除零出错?&&野指针异常?&&core文件
代码语言:javascript代码运行次数:0运行复制
#include #include #include #include #include int main(){    if(fork() == 0)    {        sleep(1);        int a = 10;        a /= 0;        exit(0);    }    int status = 0;    waitpid(-1, &status, 0);    printf("exit sinal: %d, core dump: %d\n", status&0x7F,(status>>7)&1);        return 0;}
【linux学习指南】Linux进程信号产生(三) 硬件异常&&除零出错?&&野指针异常?&&core文件
【linux学习指南】Linux进程信号产生(三) 硬件异常&&除零出错?&&野指针异常?&&core文件
?除0出错?
【linux学习指南】Linux进程信号产生(三) 硬件异常&&除零出错?&&野指针异常?&&core文件
操作系统如何检测进程内部错误 当进程执行指令时,CPU 硬件会在执行某些操作(如除法运算)的过程中检查操作数是否合法。以整数除法为例,CPU 的算术逻辑单元(ALU)在执行除法操作时,会检查除数是否为零。如果除数为零,这是一种非法的算术操作,硬件会自动触发一个异常条件。

整个程序的执行流程是:

首先,在地址内存空间中加载好了代码和数据,开始:通过地址寄存器eax进行存储操作,存储10,存储时将寄存器ebx的值设为0CPU中存在一个状态寄存器,称为eFlags寄存器。

CPU的算术逻辑单元(ALU)在执行操作时,会检查除数是否为0。如果除数为0,这是一种非法操作,会触发异常条件。此时,硬件会将状态eFlags寄存器中的溢出标志位置为1

OS系统要不要知道CPU(硬件)内部出错了? 操作系统需要知道CPU内部出现了错误。它可以通过找到引发异常的进程,然后向该进程发送信号来终止该进程。但即使进程被杀死,其他进程仍需要进行调度和上下文切换等操作。

OS会说:谁把我的CPU搞坏了,接下来就要通过信号杀掉进程!,那OS怎么知道是哪个信号?此时进程中,我们把8号信号补捉了,但是我们进程没有立刻退出,立刻被杀掉!因为进程还需要进行被OS调度:切换(保存上下文数据),进行(比如后续的代码操作)等等

当这个异常进程被杀死前,OS需要保存上下文数据,保证下次再调用时恢复。因此,在上下文切换时,需要保存eax,ebx,ecx,eFlags等一系列寄存器的值。当保存好后,OS调度下一个进程,CPU寄存器只有一套,把上下文数据恢复进来,这时,Efalgs标志位被恢复,溢出标志位一直都是1~这个时候,这个进程又开始死循环异常。

总结: 无论OS需要等待该死循环进程结束后,进程假如后面还有代码,没有退出,再进行后面代码处理,Efalgs标志位,溢出标志位一直都是1~,一样死循环。当重新进来下一个进程,恢复执行时,上下文数据,Efalgs标志位被恢复,溢出标志位一直都是1,会再次触发异常,陷入死循环。

总的来说,这段描述了CPU发生除零错误时的异常处理流程,包括硬件触发异常、OS发现错误、终止异常进程,以及进程切换时上下文保存等步骤。整个过程涉及CPU硬件和操作系统的协作。

?野指针异常?
【linux学习指南】Linux进程信号产生(三) 硬件异常&&除零出错?&&野指针异常?&&core文件

首先数据和代码在磁盘中,然后磁盘的随物理地址加载到物理内存中,物理内存中也有地址,这个地址为虚拟地址,页表右边是虚拟地址,左边是物理地址。pc存放的下一条执行指令的虚拟,经过pc指令传递给MMU硬件和CR3命令的处理,虚拟地址就可以找到页表的右边的物理地址,当除0这个指令传递给MMU去查页表时,访问0号地址,但是零号地址是无法访问的,这个时候MMU开始出错,一出错,找到这个进程,处理这个进程,进程还不能退出,后续代码也许需要执行,OS需要对进程进行调度,切换,执行,而MMU也有一套寄存器,当这个寄存器除以0出错之后,然后寄存器喵喵也会进行上下文的数据保存。保存之后,他就即使OS调度下一个进程,或者切换这个状态,寄存器状态一直同样也为一,MMU会一直报错,然后就会进程异常终止,但一直没退出。

总结: 由此可以确认,我们在C/C++当中除零,内存越界等异常,在系统层⾯上,是被当成信号处理的。

注意: 通过上⾯的实验,我们可能发现: 发现⼀直有8号信号产⽣被我们捕获,这是为什么呢?上⾯我们只提到CPU运算异常后,如何处理后续的流程,实际上OS会检查应⽤程序的异常情况,其实在CPU中有⼀些控制和状态寄存器,主要⽤于控制处理器的操作,通常由操作系统代码使⽤。状态寄存器可以简单理解 为⼀个位图,对应着⼀些状态标记位、溢出标记位。OS会检测是否存在异常状态,有异常存在就会调⽤对应的异常处理⽅法。

除零异常后,我们并没有清理内存,关闭进程打开的⽂件,切换进程等操作,所以CPU中还保留上下⽂数据以及寄存器内容,除零异常会⼀直存在,就有了我们看到的⼀直发出异常信号的现象。访问⾮法内存其实也是如此,⼤家可以⾃⾏实验。

?⼦进程退出coredump
【linux学习指南】Linux进程信号产生(三) 硬件异常&&除零出错?&&野指针异常?&&core文件
代码语言:javascript代码运行次数:0运行复制
int main(){    if(fork() == 0)    {        sleep(1);        int a = 10;        a /= 0;        exit(0);    }    int status = 0;    waitpid(-1, &status, 0);    printf("exit sinal: %d, core dump: %d\n", status&0x7F,(status>>7)&1);    return 0;}

指令:wks@hcss-ecs-ab43:~/code/signal24$ man 7 signal

代码语言:javascript代码运行次数:0运行复制
   Standard signals       Linux supports the standard signals listed  be‐       low.   The second column of the table indicates       which standard (if any) specified  the  signal:       "P1990"  indicates that the signal is described       in the original POSIX.1-1990 standard;  "P2001"       indicates  that  the  signal was added in SUSv2       and POSIX.1-2001.       "P1990"  indicates that the signal is described       in the original POSIX.1-1990 standard;  "P2001"       indicates  that  the  signal was added in SUSv2       and POSIX.1-2001.       Signal      Standard   Action   Comment       ────────────────────────────────────────────────────────────────────────       SIGABRT      P1990      Core    Abort signal from abort(3)       SIGALRM      P1990      Term    Timer signal from alarm(2)       SIGBUS       P2001      Core    Bus error (bad memory access)       SIGCHLD      P1990      Ign     Child stopped or terminated       SIGCLD         -        Ign     A synonym for SIGCHLD       SIGCONT      P1990      Cont    Continue if stopped       SIGEMT         -        Term    Emulator trap       SIGFPE       P1990      Core    Floating-point exception       SIGHUP       P1990      Term    Hangup detected on controlling terminal                                       or death of controlling process       SIGILL       P1990      Core    Illegal Instruction       SIGINFO        -                A synonym for SIGPWR       SIGINT       P1990      Term    Interrupt from keyboard       SIGIO          -        Term    I/O now possible (4.2BSD)       SIGIOT         -        Core    IOT trap. A synonym for SIGABRT       SIGKILL      P1990      Term    Kill signal       SIGLOST        -        Term    File lock lost (unused)       SIGPIPE      P1990      Term    Broken pipe: write to pipe with no                                       readers; see pipe(7)       SIGPOLL      P2001      Term    Pollable event (Sys V);                                       synonym for SIGIO       SIGPROF      P2001      Term    Profiling timer expired       SIGPWR         -        Term    Power failure (System V)       SIGQUIT      P1990      Core    Quit from keyboard       SIGSEGV      P1990      Core    Invalid memory reference       SIGSTKFLT      -        Term    Stack fault on coprocessor (unused)       SIGSTOP      P1990      Stop    Stop process       SIGTSTP      P1990      Stop    Stop typed at terminal       SIGSYS       P2001      Core    Bad system call (SVr4);                                       see also seccomp(2)       SIGTERM      P1990      Term    Termination signal       SIGTRAP      P2001      Core    Trace/breakpoint trap       SIGTTIN      P1990      Stop    Terminal input for background process       SIGTTOU      P1990      Stop    Terminal output for background process       SIGUNUSED      -        Core    Synonymous with SIGSYS       SIGURG       P2001      Ign     Urgent condition on socket (4.2BSD)       SIGUSR1      P1990      Term    User-defined signal 1       SIGUSR2      P1990      Term    User-defined signal 2       SIGVTALRM    P2001      Term    Virtual alarm clock (4.2BSD)       SIGXCPU      P2001      Core    CPU time limit exceeded (4.2BSD);                                       see setrlimit(2)       SIGXFSZ      P2001      Core    File size limit exceeded (4.2BSD);                                       see setrlimit(2)       SIGWINCH       -        Ign     Window resize signal (4.3BSD, Sun)       The  signals  SIGKILL  and  SIGSTOP  cannot  be       caught, blocked, or ignored.
【linux学习指南】Linux进程信号产生(三) 硬件异常&&除零出错?&&野指针异常?&&core文件
?Core Dump
【linux学习指南】Linux进程信号产生(三) 硬件异常&&除零出错?&&野指针异常?&&core文件
SIGINT的默认处理动作是终止进程,SIGQUIT的默认处理动作是终止进程并且Core Dump,现在我们来验证一下。⾸先解释什么是CoreDump。当⼀个进程要异常终⽌时,可以选择把进程的⽤⼾空间内存数据全部保存到磁盘上,⽂件名通常是core,这叫做CoreDump。进程异常终⽌通常是因为有Bug,⽐如⾮法内存访问导致段错误,事后可以⽤调试器检查core⽂件以查清错误原因,这叫做Post-mortem Debug (事后调试)。一个进程允许产生多大的core文件取决于进程的Resource Limit(这个信息保存在PCB中)。默认是不允许产生core文件的,因为core文件中可能包含用户密码等敏感信息,不安全。在开发调试阶段可以用ulimit命令改变这个限制,允许产生core文件。首先用ulimit|命令改变shell进程的Resource Limit ,如允许core|文件最大为1024K: $ ulimit -c1024
【linux学习指南】Linux进程信号产生(三) 硬件异常&&除零出错?&&野指针异常?&&core文件

core-file core :事后调试


?总结
【linux学习指南】Linux进程信号产生(三) 硬件异常&&除零出错?&&野指针异常?&&core文件
本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
硬件相关 Linux
相关文章 更多
精品专题 更多
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

PDF教程适合刚接触PDF文件的用户,本文整理PDF打开、编辑、转换、合并、压缩等常见基础操作。通过这些教程可以快速了解PDF文件怎么处理,解决办公、学习和资料科整理中的常见问题。使用极轻PDF可在线完成多种PDF操作,适合新手快速上手。

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。