为什么C的数据段被分成两部分?

2024-04-29

所有全局初始化值都存储在.data段,即已初始化的数据段和未初始化的值存储在bss编译器将这些未初始化的值自动初始化为零bss. Then why data段被分隔为.data and bss.

是否有优势?或者有什么好处?


C 编程语言(它是用英语编写的规范)不知道.bss or .data or 数据段 https://en.wikipedia.org/wiki/Data_segments。通过阅读来检查n1570 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf(最新草案C11 https://en.wikipedia.org/wiki/C11_(C_standard_revision)).

在某些情况下(例如嵌入式计算),您没有任何数据段。例如当你交叉编译 https://en.wikipedia.org/wiki/Cross_compiler for an Arduino https://www.arduino.cc/,生成的代码被上传到该微控制器的闪存(数据位于 RAM 中,您的程序可能会明确地 clear).

(most of my answer below is focused on Linux, but you could adapt it to other OSes)

关于数据段 https://en.wikipedia.org/wiki/Data_segment在 Linux 等类 Unix 系统上,请阅读更多规范ELF https://en.wikipedia.org/wiki/Executable_and_Linkable_Format. It is 方便的以避免花费文件空间可执行文件 https://en.wikipedia.org/wiki/Executable为某事归档(.bss https://en.wikipedia.org/wiki/.bss)全为零。这kernel https://en.wikipedia.org/wiki/Kernel_(operating_system)代码为执行(2) http://man7.org/linux/man-pages/man2/execve.2.html能够设置一个初始虚拟地址空间 https://en.wikipedia.org/wiki/Virtual_address_space一些清除的数据(即not 映射到某个文件 https://en.wikipedia.org/wiki/Memory-mapped_file部分)。也可以看看mmap(2) http://man7.org/linux/man-pages/man2/mmap.2.html & elf(5) http://man7.org/linux/man-pages/man5/elf.5.html & ld-linux(8) http://man7.org/linux/man-pages/man8/ld-linux.8.html。试一些cat /proc/$$/maps命令来了解 shell 的虚拟地址空间。看proc(5) http://man7.org/linux/man-pages/man5/proc.5.html.

所以可执行文件包含segments https://en.wikipedia.org/wiki/Memory_segmentation(其中一些全为零,不占用任何磁盘空间),并且由linker https://en.wikipedia.org/wiki/Linker_(computing)- 还可以处理搬迁 https://en.wikipedia.org/wiki/Relocation_(computing)- 来自几个目标文件 https://en.wikipedia.org/wiki/Object_file由提供compiler https://en.wikipedia.org/wiki/Compiler from 源代码 https://en.wikipedia.org/wiki/Source_code文件。在 Linux 上,使用对象转储(1) http://man7.org/linux/man-pages/man1/objdump.1.html and 雷德尔夫(1) http://man7.org/linux/man-pages/man1/readelf.1.html (and nm(1) http://man7.org/linux/man-pages/man1/nm.1.html...)来探索和检查 ELF 可执行文件和 ELF 目标文件。

顺便说一句,清除的数据段不需要由虚拟内存 https://en.wikipedia.org/wiki/Virtual_memory子系统,这可能会使事情slightly快点。内核只会清除一个page https://en.wikipedia.org/wiki/Page_(computer_memory)当它在 RAM 中时paged https://en.wikipedia.org/wiki/Paging in.

So the .bss存在是为了避免浪费可执行文件中的磁盘空间(并加速归零数据的初始化)。显然,一些可变数据被显式初始化为非零内容(并且需要位于.data并在可执行文件中占用一些磁盘空间)。恒定的不可变只读数据进入.rodata(进入文本段 https://en.wikipedia.org/wiki/Code_segment#rodata,一般由几个人共享流程 https://en.wikipedia.org/wiki/Process_(computing)运行相同的程序)

您可以配置您的链接器(例如使用某些链接器script https://sourceware.org/binutils/docs/ld/Scripts.html)将所有数据(甚至是清除的数据)放入一些显式的数据段 https://en.wikipedia.org/wiki/Data_segment(但这样做只是浪费磁盘空间)……从历史上看,Unix已经开发出来了 https://en.wikipedia.org/wiki/History_of_Unix on machines https://en.wikipedia.org/wiki/PDP-11#Unibus_models磁盘空间很少但成本高昂(因此浪费它在当时是不可想象的,因此需要.bss;今天你不在乎了!)

读莱文的书链接器和加载器 http://iecc.com/linkers/了解更多,以及高级Linux编程 http://advancedlinuxprogramming.com/ and 操作系统:三个简单的部分 http://pages.cs.wisc.edu/~remzi/OSTEP/.

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

为什么C的数据段被分成两部分? 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐