编译内核时出现 Signal 11 信号

本 FAQ 描述了最近困扰许多人的一个现象的可能原因。即,linux(*)-内核(或任何其他大型软件包)编译崩溃,并出现 “signal 11” 信号。原因可能是软件或(最有可能的)硬件。请继续阅读以了解更多信息。
(*) 当然,这并非 Linux 特有的问题。如果您的硬件不稳定,Linux、Windows 3.1、FreeBSD、Windows NT 和 NextStep 都会崩溃。
如果您不是在 http://www.BitWizard.nl/sig11/ 阅读此文档,那么您可以在那里找到最新版本。
对于那些喜欢阅读法语版本的人,法语翻译版本可以在 http://www.linux-france.org/article/sig11-fr/ 找到。
对于那些喜欢阅读日语版本的人,日语翻译版本可以在 http://www.linux.or.jp/JF/JFdocs/GCC-SIG11-FAQ/ 找到。
如果您发现任何拼写错误、有价值的补充,或者有 “我也遇到了这种情况” 的故事,请 发送电子邮件至 R.E.Wolff@BitWizard.nl。(请注意,我拒绝了一些我认为是技术上无稽之谈的建议)。如果您在主题中注明 “sig11” 或类似的字样,我将不胜感激。您也可以 发送电子邮件给我关于其他主题

Sig11 FAQ


问题

Signal 11,那是什么意思?

答案

Signal 11,或正式名称为 “段错误”(segmentation fault),意味着程序访问了未分配的内存位置。这通常是程序中的错误。因此,如果您正在编写自己的程序,这是最可能的原因。但是,本 FAQ 将重点关注除此之外的可能性。

问题

我的(内核)编译崩溃,并显示
      gcc: Internal compiler error: program cc1 got fatal signal 11
编译器有什么问题?我需要哪个版本的编译器?内核有问题吗?

答案

最有可能的是,您的安装、编译器或内核都没有问题。这很可能与您的硬件有关。可能存在各种子系统问题,并且有多种方法可以修复它。请继续阅读,您将了解更多信息。这个 “规则” 有两个例外。您可能正在耗尽虚拟内存,或者您可能正在安装 Red Hat 5.x、6.x 或 7.x。在结尾附近有更多关于这方面的内容。

问题

好的,可能不是软件问题,我如何才能确定?

答案

首先,让我们确保是硬件导致了您的麻烦。当 “make” 停止时,只需再次键入 “make”。如果它在停止之前又编译了一些文件,那一定是硬件在给您带来麻烦。如果它立即再次停止(即,在完全相同的地点崩溃之前,扫描一些目录并显示 “xxxx 无需执行任何操作”),请尝试
        dd if=/dev/HARD_DISK of=/dev/null bs=1024k count=MEGS
将 HARD_DISK 更改为您的硬盘名称(例如 hda 或 sda。或使用 “df .”)。将 MEGS 更改为您拥有的主内存的兆字节数。这将导致从磁盘读取硬盘的前几个兆字节,从而迫使 C 源文件和 gcc 二进制文件在您下次运行时从磁盘重新读取。现在再次键入 make。如果它仍然在同一个地方停止,我开始怀疑您是否在阅读正确的 FAQ,因为它看起来毕竟像是一个软件问题...... 请看一下 “还有哪些其他可能性” 的问题...... 如果没有这个 “dd” 命令,编译器一直停留在同一个地方,但是在您使用 “dd” 之后移动到另一个地方,那么您肯定遇到了磁盘 -> 内存传输问题。

问题

这到底意味着什么?您确定这是硬件问题吗?

答案

嗯,编译器访问了其内存范围之外的内存。如果这发生在工作正常的硬件上,那就是编译器内部的编程错误。这就是为什么它显示 “internal compiler error”(内部编译器错误)。但是,当硬件偶尔翻转一位时,gcc 使用了如此多的指针,以至于很可能最终访问到其寻址范围之外的东西。(随机地址大多在您的寻址范围之外,因为没有多少人拥有 4G 的大部分作为主内存... :-) 似乎现在,所有遇到 “signal 11” 问题的人都被引导到此页面。如果您正在开发自己的软件或有尚未充分调试的软件,“signal 11”(或段错误)仍然强烈暗示程序存在问题。只有当像 “gcc” 这样的程序对于几乎所有人都能正常工作,却在一个数据集(例如 Linux 内核)上崩溃时,而该数据集也经过了充分测试,那么这才会暗示您的硬件存在问题。如果系统中的某些软件组件(例如硬件驱动程序)损坏,则可能导致非常接近硬件故障的症状。但是,当驱动程序出现故障时,更可能在内核内部引起严重问题,而不仅仅是导致编译器崩溃。

问题

好的。我可能遇到了硬件问题,那会是什么呢?

答案

如果是硬件问题,则可能是
  • 内存空洞。许多现代主板允许您使用带有 1MB 或 2MB 线性帧缓冲区的旧 ISA 视频卡。为了实现这一点,他们必须映射出 16Mb 以下的内存。实际上没有人使用过此功能,但是如果您打开内存空洞(或某些 BIOS 中的 LFB 支持),您的机器肯定会不稳定...... -- Paul Connolly (pconnolly@macdux.com.au)
  • 微代码。尤其是在 SMP 系统上,CPU 可能需要升级。自从奔腾部门灾难以来,英特尔的 CPU 已经可以现场升级了!CPU 可以通过 BIOS 的特殊指令提升几个版本。这些升级通常随您的 BIOS 一起提供,因此请确保您运行的是最新的 BIOS,尤其是在您拥有 SMP 系统的情况下。-- Jeffrey Friedl (电子邮件已隐藏)。

    问题

    RAM 时序问题?我一个多月前摆弄过 bios 设置。在那段时间里,我已经编译了无数个内核,没有任何问题。不可能是 RAM 时序,对吧?

    答案

    错了。您是否认为 RAM 制造商有一台制造 60ns RAM 的机器和另一台制造 70ns RAM 的机器?当然不是!他们制造一批,然后测试它们。有些符合 60 ns 的规格,有些则不符合。如果制造商必须给出一个数字,那些可能是 61 ns。在这种情况下,当例如温度低于 40 摄氏度时(芯片在温度升高时会变慢。这就是为什么一些超级计算机需要如此多的冷却),它很可能在您的计算机中工作。

    然而,“夏季的到来” 或长时间的编译作业可能会将计算机内部的温度推高到 “极限” 以上。-- Philippe Troin (ptroin@compass-da.com)


    问题

    我被忽悠了,没有购买 ECC 内存,因为它稍微便宜一些。我觉得自己像个傻瓜。我应该购买更昂贵的 ECC 内存。对吗?

    答案

    购买更昂贵的 ECC 内存和主板可以保护您免受某种类型的错误的影响:那些由通过阿尔法粒子随机发生的错误。
    因为大多数人可以在半小时内使用 “gcc” 重现 “signal 11” 问题,但不能通过连续数小时的内存测试来重现它们,这向我证明它不仅仅是随机的阿尔法粒子翻转一位。内存测试也会注意到这一点。这意味着还有其他原因。我的印象是,大多数 sig11 问题是由 CPU <-> 缓存 <-> 内存路径上的时序错误引起的。在这种情况下,主内存上的 ECC 对您没有帮助。您应该何时购买 ECC? a) 当您觉得您需要它时。 b) 当您有大量 RAM 时。(为什么没有截止数字?因为截止数字随时间变化,就像 “大量” 一样。)有些人强烈认为每个人都应该使用 ECC 内存。我将他们指向理由 “a)”。

    问题

    内存问题?我的 BIOS 测试我的内存并告诉我它没问题。我有一个花哨的 DOS 程序告诉我我的内存没问题。不可能是内存问题,对吧?

    答案

    错了。BIOS 中的内存测试完全没用。它甚至可能偶尔确认比实际可用的内存更多的内存是 “OK” 的,更不用说测试它是否良好了。
    我的一个朋友曾经有一台 640k PC(是的,那是很久以前的事了),它在第二个 256k 库中有一个 64kbit 芯片而不是 256kbit 芯片。这意味着他实际上有 320k 工作内存。有时 BIOS 会将 384k 测试为 “OK”。无论如何,只有某些应用程序会失败。很难诊断出实际问题......
    大多数内存问题仅在特殊情况下发生。这些情况几乎不为人知。gcc 似乎会触发它们。一些内存测试,尤其是 BIOS 内存测试,则不会。我不再致力于创建一张软盘,其中包含 Linux 内核和一个好的内存测试程序。别再烦我了......
    原因是内存测试会导致 CPU 只执行一些指令,并且内存访问模式往往非常规则。在这些情况下,只有非常小一部分内存会崩溃。如果您正在学习电气工程并且对内存测试感兴趣,硕士论文可能是弄清楚发生了什么。有些计算机制造商希望赞助这样一个项目,并提供一些客户声称不可靠,但未通过生产测试的硬件......

    问题

    它只会在我编译内核时发生吗?

    答案

    不是。您的硬件不可能知道您正在编译内核。只是内核编译对您的硬件要求非常高,因此当您编译内核时,这种情况发生得很多。编译其他大型软件包(如 gcc 或 glibc)也经常会触发 sig11。

    问题

    NT、Windows 95、OS/2 或 DOS 上没有任何崩溃。一定是 Linux 特有的问题。

    答案

    首先,Linux 比上述所有系统都更强调您的硬件。某些操作系统(如上面命名的 Microsoft 操作系统)无论如何都会以不可预测的方式崩溃。没有人会打电话给微软说 “嘿,我的 Windows 电脑今天崩溃了”。如果您真的这样做了,他们会告诉您,是您(用户)犯了一个错误(请参阅 德国杂志对 Bill Gates 的采访....),并且由于它现在可以工作了,您应该闭嘴。
    这些操作系统也比 Linux 在某种程度上更 “可预测”。这意味着 Excel 可能始终加载在完全相同的内存区域中。因此,当位错误发生时,总是 Excel 会受到影响。Excel 将崩溃。或者 Excel 将使另一个应用程序崩溃。无论如何,它似乎是一个应用程序失败,并且与内存无关。
    我可以肯定的是,干净安装的 Linux 系统应该能够编译内核而没有任何错误。当然没有 sig-11 错误。(** 例外:带有 Cyrix 处理器的 Red Hat 5.0。请参阅其他地方。**)
    实际上,Linux 和 gcc 比其他操作系统更强调您的硬件。如果您需要一个非 Linux 的东西来强调您的硬件到崩溃的地步,您可以尝试 winstone。-- Jonathan Bright (bright@informix.com)

    问题

    总是 signal 11 吗?

    答案

    不是。其他信号(如 4、6 和 7)也偶尔会发生。但是,Signal 11 最常见。

    只要内存被破坏,任何事情都可能发生。我本以为坏的二进制文件会比实际发生的频率高得多。无论如何,似乎赔率严重偏向于 gcc 获得 signal 11。也见过

    前几个是内核 “怀疑” 内核编程错误的情况,而实际上是由坏内存引起的。后几个指向最终遇到麻烦的应用程序。

    -- S.G.de Marinis (trance@interseg.it)
    -- Dirk Nachtmann (nachtman@kogs.informatik.uni-hamburg.de)


    问题

    我该怎么办?

    答案

    以下是一些在您想找出问题所在时可以尝试的事项... 注意:其中一些会显着降低您的计算机速度。这些事情旨在使您的计算机正常运行,并使您能够缩小问题范围。有了这些信息,例如,您可以尝试让您的供应商更换有故障的组件。最困难的部分是,大多数人将能够完成上述所有操作,除了从其他人那里借用内存,但这并没有什么区别。这使得它很可能是 RAM。目前,RAM 是 PC 中最昂贵的部分,因此您宁愿不做出这个结论,但很抱歉,我收到了很多最终证明是 RAM 的反应。但是,不要立即绝望:您的 RAM 可能并非完全浪费:您可以随时尝试将其换成不同的或更多的 RAM。

    问题

    我已经让 RAM 测试设备测试了我的 RAM,它们是 OK 的。不可能是 RAM,对吧?

    答案

    错了。似乎当前 RAM 中发生的错误无法被 RAM 测试仪检测到。可能是您的主板正在以可疑的方式访问 RAM,或者以其他方式在您的计算机中弄乱 RAM。好处是您可以将 RAM 卖给仍然对他的 RAM 测试仪有信心的人......

    问题

    还有哪些其他硬件可能是问题所在?

    答案

    嗯,您计算机内部的任何硬件问题。但是,应该首先检查容易检查的东西。因此,例如,您的所有卡都应正确插入主板。

    问题

    为什么 Red Hat 安装在我的机器上崩溃?

    答案

    Red Hat 5.x、6.x 和 7.x 安装在某些机器上存在问题。尝试仅使用 32M 运行安装。通常可以使用 mem=32m 作为引导参数来完成此操作。

    可能是 CD 上存在读取错误。安装程序对此处理得不太完美...... 确保您的 CD 完美无瑕!似乎安装程序会在质量不佳的 CD 上崩溃!

    人们报告说,并且我亲眼所见,Red Hat 安装可能会在完全正常的机器上出错(崩溃并显示 signal 7 或 signal 11)。我的机器过去并且现在仍然 100% 可靠(实际上,我测试它的机器现在已经可靠地坏了)。人们通过擦除旧的 “工作正常” 的发行版而陷入困境,然后想要安装更新的 Red Hat 发行版。然后返回不再是一种选择,因为返回到 5.x 也会导致相同的 “安装时崩溃”。

    Patrick Haley (haleyp@austin.rr.com) 报告说,他尝试了高达 96Mb (32 & 64) 的所有内存配置,并且发现只有当他安装了 96Mb 时,安装才会工作。这也与我自己的经验(Red Hat 安装失败)一致:我在一台 32M 机器上尝试了安装。

    新消息:似乎这可能是由于内核问题造成的。内核可能(暂时)内存不足并杀死当前进程。Hubert Mantel (mantel@suse.de) 的修复程序位于: http://juanjox.linuxhq.com/patch/20-p0459.html

    如果实际情况如此,请尝试切换到第二个虚拟控制台 (ctrl-alt-F2) 并在那里每隔几秒钟键入 “sync”。这减少了硬盘缓冲区占用的内存量... 如果您看到 Red Hat 安装连续崩溃两次或更多次,然后能够使用此技巧完成安装,我将非常感谢您的反馈!!!

    您如何解决这个问题?...


    问题

    还有哪些其他可能性?

    答案

    其他人注意到以下可能性

    问题

    我发现运行 ..... 检测错误的速度比仅仅编译内核快得多。请在您的网站上提及这一点。

    答案

    许多人给我发电子邮件,内容类似这样。但是,许多人没有意识到的是,他们遇到了一个有问题的硬件案例。推荐“unzip -t”的人碰巧有一个特定的损坏的 DRAM 内存条。而 unzip 碰巧比内核编译“发现”得更快。

    但是,我确信对于许多其他问题,内核编译会发现它,而其他测试则不会。我认为内核编译很好,因为它强调了计算机的许多不同部分。许多其他测试只练习一个区域。如果该区域在您的情况下恰好损坏,它会比“内核编译”更快地显示问题。但是,如果您的计算机在该区域正常,而在另一个区域损坏,“更快”的测试可能只会告诉您您的计算机正常,而内核编译测试会告诉您有问题。

    在任何情况下,我最好还是列出人们认为好的测试,它们确实很好,但不如“尝试编译内核”测试那么通用......

    请注意,无论您找到什么快速方法来告诉您您的计算机已损坏,如果这样的测试突然不再失败,它都不能保证您的计算机是好的。我始终建议,在摆弄东西使其工作后,您应该运行 24 小时的内核编译测试。

    问题

    我不相信这个。这发生在谁身上?

    答案

    嗯,首先它发生在我个人身上。但你不必相信我。它也发生在
    我对新的故事很感兴趣。如果您遇到问题并且不确定问题是什么,通过 发送电子邮件至 R.E.Wolff@BitWizard.nl 联系我可能会有所帮助。我的好奇心通常会驱使我回答您的问题,直到您找到问题所在.....(另一方面,当您的问题在上面清楚地描述时,我会很生气 :-))
    此页面由 www.BitWizard.nl 托管