为什么“分段错误”在 C 中仍然存在

2024-03-24

操作系统中的分段是一个与时间本身一样古老的概念。至少根据我的教授的说法,大多数现代操作系统已经放弃了分段的概念,现在主要依靠分页来实现内存保护,从而防止每个进程访问除自己的内存之外的任何其他内存。那么我们如何在 C 中仍然遇到“分段错误”。在现代操作系统中,我们是否仍然将分段作为一个抽象概念?


这不是一个东西in C具体来说,它是类 Unix 操作系统中的一个东西。任何非内存安全的语言(可以尝试访问未映射的页面)都可以编译为存在段错误的可执行文件。包括手写汇编或Fortran。但是,是的,C 和 C++ 是两种使用最广泛的非内存安全语言。

是的,这个名字很古老。 Unix 是old并且没有need重命名SIGSEGV作为当用户空间通过访问未映射的内存而导致 CPU 故障时内核传递的信号。这样做会破坏很多使用该常量的代码,只需将英文文本字符串更改为strerror / perror对于它的“无效页面错误”也不会特别有帮助,尽管可能,因为我认为这些消息已融入 libc 中。但是不同的 libc 版本在转换过程中多年来都会有不同的消息,不值得这么麻烦。

在使用分页的系统中,对硬件页表中“不存在”的页面的任何访问,或者仅在尝试写入或其他情况下可读的页面,都会导致 CPU 发生异常。内核的页面错误异常处理程序检查页面是否should可以访问,如果可以的话,可以从磁盘将其分页,进行写时复制,或者其他什么。 (分别是主要或次要页面错误)。如果不是,则页面错误“无效”,并且内核向进程传递 SIGSEGV 信号。

同样古老的是SIGFPE(浮点异常)对于一般的算术异常,在大多数机器上默认情况下唯一可能实际出错的异常是整数除法。 (默认的 FP 环境屏蔽了所有 FP 异常,因此它们只是设置粘性标志,而不是在机器代码中引发异常。)POSIX 标准要求 https://pubs.opengroup.org/onlinepubs/009695399/basedefs/signal.h.html如果由于算术异常而要传递信号,则该信号必须是 SIGFPE。

同样,到现在为止SIGSEGV已标准化POSIX和其他 Unix 标准,所以在 Unix 早期的时候,任何人could似乎已经改变了,但它早已过去了。

(有些系统还可以提供SIGBUS对于其他类型的错误地址错误,例如SPARC 上的 Solaris 提供SIGBUS用于未对齐的访问。)

另请注意,某些其他类型的权限错误会重载到 SIGSEGV 上。例如,尝试执行 x86 等特权指令lgdt在 Linux 下会产生 SIGSEGV。 (在这种情况下,用户空间实际上会尝试接管仍用于定义 CPU 运行模式的分段机制,例如长模式下的 16 位、32 位和 64 位代码段。)对于未对齐也是如此。 SSE SIMD 指令。所以就是not严格针对无效页面错误。


命名历史?

可执行文件也有像文本和数据这样的“段”,其中 .text 和 .data 部分分别链接。 “堆”过去大多是连续的,在 .data / .bss 之后增长(通过brk系统调用,之前mmap(MAP_ANONYMOUS)或者从 /dev/zero 映射页面是一件事),因此即使操作系统开始使用分页而不是 CPU 分段来进行内存保护,“分段错误”一词对于设计者来说也可能并不是毫无意义,因为“分段错误”可执行文件的“仍然映射到进程内存映像中的连续页面范围。

我不知道有关 Unix 信号命名及其在具有或不具有内存保护功能的 PDP-8 和 PDP-11 硬件上的开发的历史细节,尽管显然PDP-11的部分型号 https://en.wikipedia.org/wiki/PDP-11#Unibus_models有某种形式的内存保护,并且甚至虚拟内存 https://en.wikipedia.org/wiki/PDP-11_architecture#Memory_expansion


TL:DR

计算机科学中有两个难题:缓存失效和命名 https://skeptics.stackexchange.com/questions/19836/has-phil-karlton-ever-said-there-are-only-two-hard-things-in-computer-science,以及相差一的错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么“分段错误”在 C 中仍然存在 的相关文章

随机推荐

  • Bitbucket 管道部署到 gCloud AppEngine 导致 [13] 发生内部错误

    我正在尝试在我的项目中使用 bitbucket 管道 我用的是Nodejs 当我跑步时gcloud app deploy从 Mac 或 Windows 手动 工作正常 部署成功完成 但从 bitbucket 管道中它失败了错误响应 13 发
  • 关于数据框警告切片的 pandas 副本的混淆

    我已经浏览了一系列与此问题相关的问题和答案 但我仍然发现我在意想不到的地方收到了切片警告的副本 此外 它突然出现在我之前运行良好的代码中 让我想知道是否某种更新可能是罪魁祸首 例如 这是一组代码 我所做的就是将 Excel 文件读入 pan
  • 函数声明“sub function($$)”是什么意思?

    我使用 Perl 一段时间了 但今天我遇到了这段代码 sub function1 snip 这在 Perl 中意味着什么 它是一个带有原型 http perldoc perl org perlsub html Prototypes这需要两个
  • Internet Explorer 7 中的 CSS 下拉菜单爆炸

    我正在创建一个带有下拉菜单的设计 一切都在现代浏览器 即 Firefox Chrome Opera Safari 和 IE9 中运行良好 但是 由于使用 IE7 和 IE8 的访问者数量较多 我还需要使菜单与这些版本的 Internet E
  • 如何在使用 angularjs 更新控制器中的新数据之前销毁莫里斯图表数据?

    我正在使用 angularjs 根据所选项目加载图表 如果我选择第一个项目 我将在控制器功能中获取详细信息并显示它 当我选择下一个项目时 图形加载 但第一个选定项目的详细信息不会被破坏 如果我选 择 4 个项目 则显示 4 次图形 如何清除
  • DDD:我真的需要加载聚合中的所有对象吗? (性能问题)

    在 DDD 中 存储库加载整个聚合 我们要么加载全部 要么不加载 这也意味着应该避免延迟加载 我关心的是性能方面的问题 如果这导致将数千个对象加载到内存中怎么办 例如 聚合Customer一万回来Orders 在这种情况下 是否意味着我需要
  • .vimrc:第 4 行:意外标记“(”附近的语法错误[重复]

    这个问题在这里已经有答案了 我正在尝试配置 Vim 但是当我尝试获取来源时 vimrc编辑文件后出现以下错误 源 vimrc bash let g plug shallow 0 未找到命令 bash Users stevenaguilar
  • Nodemon 错误:“已达到文件观察器数量的系统限制”

    我在学GraphQL https en wikipedia org wiki GraphQL我正在使用prisma binding用于 GraphQL 操作 我正面临着这个nodemon当我启动 Node js 服务器时出现错误 它给了我由
  • 如何“chartr”“-”(或转义范围)?

    在 R 中可以使用chartr将字符从一种更改为另一种 例如 chartr aor u Stackoverflow 1 Stuck ve fl w 模式可以是范围 例如chartr a hwo 0 9 Stackoverflow 但长度需要
  • 鸢尾花数据集未显示“物种”列

    我正在 Python 上使用 numpy 和 pandas 来学习如何处理数据帧 我正在 Collaboratory 上编码 并且已加载 Iris 数据集 但由于某种原因 我的数据框中没有 物种 列 也许我以错误的方式加载了它 我很乐意就此
  • 数据库MN关系

    我正在上数据库管理系统课程 绝对初学者 并且正在为一个非常简单的博客系统开发数据库 我有一个关于博客文章和帖子所属类别之间的 M N 关系的问题 一篇博客文章可以属于多个类别 该方案的部分如下所示 Scheme http creo prev
  • CocoaPods 和 GitHub 分叉

    这是我第一次 fork GitHub 项目 我对 CocoaPods 也不太熟悉 所以请耐心等待 基本上 我在 GitHub 上分叉了一个项目 在我的项目中使用了以下内容Podfile pod REActivityViewControlle
  • 找到所需类 javax.faces.FactoryFinder 的多个版本

    我开始使用 JSF2 0 我按照教程进行操作 没有任何问题 一切正常 我使用 Eclipse Helios 但我注意到一些我无法理解的事情 该教程说要为 JSF 2 添加 Project Facet 我没有做这样的事情 一切正常 因此 为了
  • 将元素上具有多个 Css 类的 HTML 文件导入 Excel 时出现问题

    如果为 HTML 元素指定了多个 CSS 类 Excel 看起来不会理解 HTML 属性 class 例如 如果 class A B 指向标签 TD Excel 将为该标签使用空样式 我有这些 html 代码
  • 如何在Python中读取键盘输入

    我在 Python 中遇到键盘输入问题 我尝试了 raw input 并且它只被调用一次 但我想在用户每次按任意键时读取键盘输入 我该怎么做 感谢您的回答 例如 你有这样的 Python 代码 file1 py bin python do
  • Likert 数据的 R 频率表

    我认为这是一项基本任务 但事实证明并非如此 我有一系列调查 需要将其转换为每个调查的频率表 例如 调查 1 包含 6 个问题 参与者有 5 个回答选项 对于每项调查 我需要生成一个表格 其中包含每个问题 在本示例中有 6 个 以及对每个问题
  • 在 JavaScript 中取消转义 HTML 实体?

    我有一些与 XML RPC 后端通信的 JavaScript 代码 XML RPC 返回以下形式的字符串 img src myimage jpg 但是 当我使用 JavaScript 将字符串插入 HTML 时 它们会按字面意思呈现 我没有
  • PHP 中的电子邮件跟踪技术

    我正在用 php 做一个新闻通讯管理 我需要跟踪打开我们新闻通讯的访问者 我已在新闻通讯中插入了跟踪图像 但这似乎不起作用 使用 Shift 邮件程序 可以选择将内嵌图像嵌入到时事通讯中 是否可以使用此内联图像进行跟踪 还有其他技术可以跟踪
  • @WebServlet 注释无法识别;初始化不运行

    我正在尝试学习注释 我目前有一个 Web 应用程序 当该应用程序在 Tomcat 中启动时 该应用程序会运行 init 以下代码有效 web xml
  • 为什么“分段错误”在 C 中仍然存在

    操作系统中的分段是一个与时间本身一样古老的概念 至少根据我的教授的说法 大多数现代操作系统已经放弃了分段的概念 现在主要依靠分页来实现内存保护 从而防止每个进程访问除自己的内存之外的任何其他内存 那么我们如何在 C 中仍然遇到 分段错误 在