linux - 如果汇编程序中没有退出系统调用会怎样?

标签 linux assembly operating-system termination

在汇编程序中,.text 部分加载到0x08048000.data.bss 部分紧随其后。

如果我.text 部分放置一个exit 系统调用会发生什么?它会导致 .data.bss 部分被解释为导致“不可预测”行为的代码吗?程序什么时候终止——可能是在每条“指令”执行完之后?

我可以在没有 exit 系统调用的情况下轻松编写程序,但是我不会测试 .data.bss 是否被执行不知道,因为我想我必须知道在后台生成的真实机器代码才能理解这一点。

我认为这个问题更多的是关于“操作系统和 CPU 将如何处理这种情况?”比汇编语言,但对于汇编程序员等来说仍然很有趣。

最佳答案

处理器不知道您的代码在哪里结束。它忠实地执行一条又一条指令,直到执行被重定向到别处(例如通过跳转、调用、中断、系统调用或类似方式)。如果你的代码没有跳到别处就结束了,处理器会继续执行代码之后内存中的任何内容。究竟发生了什么是相当不可预测的,但最终,您的代码通常会崩溃,因为它试图执行无效指令或试图访问不允许访问的内存。如果两者都没有发生并且没有发生跳转,最终处理器会尝试将未映射的内存或标记为“不可执行”的内存作为代码执行,从而导致分段违规。在 Linux 上,这会引发 SIGSEGVSIGBUS。如果未处理,这些将终止您的进程并可选择生成核心转储。

关于linux - 如果汇编程序中没有退出系统调用会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49674026/

相关文章:

linux - 是否可以分层收集 .local 域 ip 地址以构建基于 dhcp 的 dns?

linux - 如何使用编号菜单获得 Linux 自动完成功能?

linux - 读取csv并写入excel格式

assembly - 什么是 MASM?我们一般用它来学习汇编语言代码?

c - C 中奇怪的 fork() 问题

regex - Asterisk 应用拨号方案中的模式匹配

assembly - 我不明白 SBC 是怎么回事

c - 如何在 C/C++ 中写入不同线程的堆栈?

c - 为什么 "read"必须是在 "Kernel Mode"中运行的系统调用?

c++ - 高精度事件定时器