Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
【linux学习指南】Linux进程信号产生(三) 硬件异常&&除零出错?&&野指针异常?&&core文件_创想鸟

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

?前言

硬件异常被硬件以某种⽅式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号。例如当前进程执⾏了除以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: %dn", status&0x7F,(status>>7)&1);        return 0;}
【linux学习指南】Linux进程信号产生(三) 硬件异常&&除零出错?&&野指针异常?&&core文件
【linux学习指南】Linux进程信号产生(三) 硬件异常&&除零出错?&&野指针异常?&&core文件

?除0出错?

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

操作系统如何检测进程内部错误 当进程执行指令时,CPU 硬件会在执行某些操作(如除法运算)的过程中检查操作数是否合法。以整数除法为例,CPU 的算术逻辑单元(ALU)在执行除法操作时,会检查除数是否为零。如果除数为零,这是一种非法的算术操作,硬件会自动触发一个异常条件。

整个程序的执行流程是:

首先,在地址内存空间中加载好了代码和数据,开始:通过地址寄存器eax进行存储操作,存储10,存储时将寄存器ebx的值设为0。CPU中存在一个状态寄存器,称为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,会再次触发异常,陷入死循环。

巧文书 巧文书

巧文书是一款AI写标书、AI写方案的产品。通过自研的先进AI大模型,精准解析招标文件,智能生成投标内容。

巧文书 61 查看详情 巧文书

总的来说,这段描述了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: %dn", 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学习指南】Linux进程信号产生(三) 硬件异常&&除零出错?&&野指针异常?&&core文件的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/431570.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Manus“跑路”风波背后,AI Agent的商业化困局
上一篇 2025年11月7日 14:13:18
Linux常用命令行操作入门指南
下一篇 2025年11月7日 14:13:24

相关推荐

  • Canva中AI生成图片如何导出?教你快速保存设计作品的方法

    答案:Canva中导出AI生成图片的操作与普通图片相同,点击右上角“分享”按钮,选择“下载”,可选PNG、JPG、PDF、SVG、MP4或GIF等格式;为保证画质,建议优先选用PNG格式,避免有损压缩,同时选择高分辨率和合适尺寸,Pro用户可进一步调整质量与透明背景设置;除下载外,还可通过分享链接、…

    2026年9月22日
    800
  • VSCode安全更新机制解析

    VSCode通过自动检查、数字签名验证和用户可控策略确保更新安全。启动时后台定期HTTPS请求检查新版本,每日一次;安装包经平台特定签名(Windows Authenticode、macOS代码签名、Linux GPG)验证完整性;用户可选自动更新、提示或关闭,企业可集中管控;微软通过安全入口响应漏…

    2026年9月22日
    000
  • Linux系统中文件属性和权限实战操作

    Linux系统中文件属性和权限实战操作Linux系统中文件属性和权限实战操作Linux系统中文件属性和权限实战操作Linux系统中文件属性和权限实战操作

    —–原本今天的文章是昨天晚上就要更新的,但是由于昨天晚上下班回到住的地方,发现停电了,所以就没写成。今天是在上一篇文章–linux系统中文件类型的基础上,继续进行深入的学习。好了,直接开干。 一、文件的操作权限: 1、在这之前我想还是很有必要介绍对文件的操作权限(…

    2026年9月22日 • 用户投稿
    000
  • PHP中为数组元素设置默认值的最佳实践:使用Null合并运算符

    本教程将介绍如何在PHP中为数组元素设置默认值,尤其当源数据可能为空或缺失时。通过利用PHP 7+提供的Null合并运算符(??),可以简洁高效地实现这一需求,避免冗长的条件判断,提高代码可读性和健壮性。 引言:处理缺失或空值时的数组赋值 在Web开发中,我们经常需要从用户请求、数据库查询或其他外部…

    2026年9月22日
    000
  • VSCode快速配置Dart:Flutter开发、中文提示、热加载

    安装vscode并下载flutter sdk,解压至无中文或特殊字符的路径;2. 将flutter sdk的bin目录添加到系统环境变量path中;3. 打开新终端执行flutter doctor,根据提示安装缺失的依赖;4. 在vscode扩展商店安装dart和flutter扩展;5. 确保在调试…

    2026年9月22日
    200
  • Inkscape如何导出AI生成的矢量图片?教你快速保存图像的步骤

    答案:在Inkscape中导出矢量图需根据用途选择格式,网页用优化SVG并转文本为路径,印刷则导出为PDF/EPS、转文字为路径、确保高分辨率位图,同时注意颜色模式与出血设置。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 在Inkscap…

    2026年9月22日
    700
  • Laravel 8 登录后重定向至仪表盘的策略与实践

    本教程详细阐述了在 Laravel 8 中实现用户登录后重定向到仪表盘的多种策略。我们将探讨如何通过配置 LoginController 的 $redirectTo 属性、利用 RouteServiceProvider 定义常量以及在自定义登录方法中进行精确控制来管理重定向流程。文章还涵盖了相关中间…

    2026年9月22日
    000
  • VSCode配置GDB调试器 深入掌握VSCode调试C程序技巧

    配置vscode中gdb调试c程序的核心是正确设置tasks.json和launch.json;2. tasks.json负责使用gcc -g编译生成带调试信息的可执行文件,确保prelaunchtask与launch.json中的program路径一致;3. launch.json指定调试器gdb…

    2026年9月22日
    100
  • java定时任务之quartz

    大家好,很高兴再次与大家见面,我是你们的朋友全栈君。 一、Quartz简介 在企业应用中,我们常常需要处理定时任务调度,比如每天凌晨生成前一天的报表,每小时生成一次汇总数据等。Quartz是一个著名的任务调度框架,它可以与J2SE和J2EE应用结合,功能非常强大,易于与Spring集成,使用起来非常…

    2026年9月22日
    100
  • Java中异常处理与方法返回值结合

    异常发生时不应返回默认值,而应通过抛出异常或使用Optional、自定义结果类等方式明确传递错误信息,确保调用方能正确处理失败情况,提升代码健壮性与可读性。 在Java中,异常处理与方法返回值的结合是一个常见的编程问题。理解它们之间的关系有助于写出更健壮、可读性更强的代码。当一个方法可能发生异常时,…

    2026年9月22日
    000
  • VSCode如何通过扩展实现Markdown预览 VSCode Markdown预览功能的配置方法

    安装“markdown all in one”或“markdown preview enhanced”等扩展;2. 安装后通过ctrl+shift+v打开预览;3. 在设置中配置预览样式、主题、字体等;4. 启用“auto show preview to side”实现自动预览;5. 开启“scro…

    2026年9月22日
    000
  • 如何在Linux命令行中进行文件查找?

    最常用Linux查找文件方法是使用find命令。按名称搜索用-name选项,如find . -name “*.log”;忽略大小写用-iname;按类型查用-type f(文件)或d(目录);按大小查用-size,如+100M表示大于100MB;按修改时间用-mtime,-7…

    2026年9月22日
    000
  • tk做养生类目起号前期发什么视频?tk表示什么类目?

    在TikTok上运营养生类账号,起号阶段的内容策略尤为关键。优质的内容不仅能快速吸引目标用户,还能为后续发展奠定良好基础。本文将深入解析初期应发布的视频类型,并澄清“TK”所指的平台属性及内容分类体系。 一、养生类目起号初期适合发布哪些视频内容? 刚开始做养生赛道时,重点不在于变现,而在于建立专业形…

    2026年9月22日
    000
  • PHP如何利用缓存优化实时输出_PHP实时输出与缓存结合优化

    PHP实时输出需结合输出缓冲控制与flush()强制推送,同时考虑服务器和浏览器缓存影响;2. 长时间任务应使用APCu或Redis缓存频繁数据,避免重复计算;3. 动态页面可采用分块输出与片段缓存策略,静态内容从缓存读取,动态部分边生成边输出;4. 更优方案是通过异步任务与Redis存储进度,前端…

    2026年9月22日
    000
  • 华为天际通Go将支持eSIM:设备在路上了

    华为天际通Go将支持eSIM:设备在路上了华为天际通Go将支持eSIM:设备在路上了华为天际通Go将支持eSIM:设备在路上了华为天际通Go将支持eSIM:设备在路上了

    9月3日消息,今年的iphone 17 air将仅支持esim,彻底移除实体sim卡槽结构。随着新品发布日期的临近,国内esim政策的进展也愈发引人关注。 然而综合多方信息来看,iPhone 17 Air国行版本可能无法赶上首发,因前期在国内无法使用eSIM服务,导致该机型短期内难以在国内上市。 相…

    2026年9月22日 • 用户投稿
    000
  • 避开蝴蝶号常见误区:为什么你的内容始终无法获得推荐

    蝴蝶号推荐机制的核心逻辑是围绕用户留存与时长,通过用户行为数据判断内容价值。平台看重完播率、互动率等“微动作”,而非单纯阅读量;原创性、垂直度及是否符合规范也影响推荐权重。常见误区包括:①标题党导致高点击低完读,被算法降权;②内容同质化缺乏稀缺性和专业性;③忽视评论区互动,错失活跃度加分;④内容与平…

    2026年9月22日
    000
  • VSCode配置C语言调试环境 从零开始VSCode搭建C开发工具

    要从零开始在#%#$#%@%@%$#%$#%#%#$%@_e2fc++805085e25c9761616c00e065bfe8中搭建c语言开发和调试环境,首先需安装vscode本体、c/c++编译器(如mingw或gcc)并配置系统环境变量,接着安装vscode的c/c++扩展,然后创建项目并编写c…

    2026年9月22日
    000
  • 如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程

    如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程

    PhotoLab的AI裁剪功能通过智能识别主体与构图原则,提供优化裁剪建议,区别于传统手动裁剪的纯物理操作,能自动应用美学法则提升照片视觉吸引力;在人像、社交媒体适配、风景静物等场景中表现突出,尤其擅长保留核心焦点并适配多平台比例;用户可导入图片后使用AI裁剪工具,系统分析画面并生成建议裁剪框,支持…

    2026年9月22日 • 用户投稿
    000
  • MySQL常见连接错误及其解决方案汇总_开发和运维必备?

    MySQL常见连接错误及其解决方案汇总_开发和运维必备?MySQL常见连接错误及其解决方案汇总_开发和运维必备?MySQL常见连接错误及其解决方案汇总_开发和运维必备?MySQL常见连接错误及其解决方案汇总_开发和运维必备?

    access denied错误需检查用户名密码及权限,使用grant授权并执行flush privileges;2. can’t connect错误应确认mysql运行状态、防火墙设置及bind-address配置;3. host not allowed错误需创建用户并授权特定或全部ip…

    2026年9月22日 • 用户投稿
    000
  • 递归实现列表排序检查与条件移除最大值

    本文详细介绍了如何使用Java递归方法处理整数列表。核心内容包括:首先检查列表是否已排序,如果已排序则直接返回false;如果未排序,则查找列表中的最大值。仅当最大值位于列表的起始或结束位置时,才将其移除并递归地继续处理列表。如果最大值位于列表中间,则打印当前列表并终止递归。 在数据处理和算法设计中…

    2026年9月22日
    000

发表回复

登录后才能评论
关注微信