相关疑难解决方法(0)

为什么分段错误不可恢复?

我之前的问题之后,大多数评论都说“不要这样做,你处于一种不确定的状态,你必须杀死一切并重新开始”。还有一个“安全”的解决方法

我不明白的是为什么分段错误本质上是不可恢复的。

写入受保护内存的时刻被捕获 - 否则,将SIGSEGV不会被发送。

如果可以捕获写入受保护内存的时刻,我不明白为什么 - 理论上 - 它不能在某个低级别上恢复,并且不能将 SIGSEGV 转换为标准软件异常。

请解释为什么在分段错误之后程序处于不确定状态,因为很明显,在内存实际更改之前抛出了错误(我可能是错的,不明白为什么)。如果它被抛出,人们可以创建一个程序来更改受保护的内存,一次一个字节,出现分段错误,并最终重新编程内核 - 这种安全风险并不存在,因为我们可以看到世界仍然存在。

  1. 分段错误究竟何时发生(=何时发送SIGSEGV)?
  2. 为什么该进程在该点之后处于未定义的行为状态?
  3. 为什么无法恢复?
  4. 为什么这个解决方案可以避免这种不可恢复的状态?甚至吗?

c c++ exception segmentation-fault

112
推荐指数
11
解决办法
1万
查看次数

当发生中断时,管道中的指令会发生什么?

假设一个5级流水线架构(IF =指令获取,ID =指令解码,EX =执行,MEM =存储器访问,WB =寄存器写回).有4条指令必须执行.

(这些样本说明不准确,但我相信这一点会被理解)

在第五个时钟周期,这些指令将在管道中,如下所示.

添加a,b,c [IF ID EX MEM WB]

添加a,b,d [IF ID EX MEM]

添加a,b,e [IF ID EX]

添加a,b,f [IF ID]

现在,如果发生硬件中断,这些指令会发生什么.只有在执行流水线中的所有指令后才能处理中断吗?是否会以不同的方式处理软件中断和异常?

computer-architecture

22
推荐指数
1
解决办法
1万
查看次数

如何处理SIGABRT信号?

这是我为SIGABRT信号设置处理程序的代码,然后我调用abort()但处理程序没有被触发,而程序被中止,为什么?

#include <iostream>
#include <csignal>
using namespace std;
void Triger(int x)
{
    cout << "Function triger" << endl;
}

int main()
{
    signal(SIGABRT, Triger);
    abort();
    cin.ignore();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

计划产出:

在此输入图像描述

c++ signals

8
推荐指数
2
解决办法
2万
查看次数

为什么在结构中允许未定义大小的数组?

当我编写以下代码时,我得到了预期的错误error: array size missing in 'data'

int main()
{
    unsigned char data[];

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行相同的代码但将违规行包装在 a 中时struct,没有错误。

typedef struct credit_card_s
{
  unsigned char is_valid;

  unsigned char data[];

} credit_card_t;
Run Code Online (Sandbox Code Playgroud)

谁能向我解释为什么允许这样做?

c

4
推荐指数
1
解决办法
2287
查看次数

信号、异常、硬件中断、陷阱

我读了这个答案,我想我有了一个清晰的想法。但这个答案又让我困惑了。

有人可以给我一个清晰的图片来说明信号、异常、硬件中断和陷阱之间的区别吗?

另外,我想知道这些块CPU抢占的内核代码中有哪些?

例子会很有帮助。

linux cpu kernel interrupt

3
推荐指数
1
解决办法
4118
查看次数