unix中c语言典型的存储空间布局

2023-05-16

此文转载于:https://www.cnblogs.com/LUO77/p/5853534.html

----------------------------------------------------------------------------------------------------------------------------------------------------

一个程序本质上都是由 BSS 段、data段、text段三个组成的。可以看到一个可执行程序在存储(没有调入内存)时分为代码段、数据区和未初始化数据区三部分。

  • BSS段(未初始化数据区):在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。
  • 数据段:在采用段式内存管理的架构中,数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
  • 代码段:在采用段式内存管理的架构中,代码段(text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域属于只读。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

程序编译后生成的目标文件至少含有这三个段,这三个段的大致结构图如下所示:

text段和data段在编译时已经分配了空间,而BSS段并不占用可执行文件的大小,它是由链接器来获取内存的
    bss段(未进行初始化的数据)的内容并不存放在磁盘上的程序文件中。其原因是内核在程序开始运行前将它们设置为0。需要存放在程序文件中的只有正文段和初始化数据段。
    data段(已经初始化的数据)则为数据分配空间,数据保存到目标文件中。

数据段包含经过初始化的全局变量以及它们的值。BSS段的大小从可执行文件中得到,然后链接器得到这个大小的内存块,紧跟在数据段的后面。当这个内存进入程序的地址空间后全部清零。包含数据段和BSS段的整个区段此时通常称为数据区。

    可执行程序在运行时又多出两个区域:栈区和堆区。
    (4)栈区:由编译器自动释放,存放函数的参数值、局部变量等。每当一个函数被调用时,该函数的返回类型和一些调用的信息被存放到栈中。然后这个被调用的 函数再为他的自动变量和临时变量在栈上分配空间。每调用一个函数一个新的栈就会被使用。栈区是从高地址位向低地址位增长的,是一块连续的内存区域,最大容 量是由系统预先定义好的,申请的栈空间超过这个界限时会提示溢出,用户能从栈中获取的空间较小。
    (5)堆区:用于动态分配内存,位于BSS和栈中间的地址区域。由程序员申请分配和释放。堆是从低地址位向高地址位增长,采用链式存储结构。频繁的 malloc/free造成内存空间的不连续,产生碎片。当申请堆空间时库函数是按照一定的算法搜索可用的足够大的空间。因此堆的效率比栈要低的多。

下图将体现c的源文件对应存储空间:

此时程序还没有被放入内存,只是在硬盘存储的情况,此时bss并未占用空间。bss在链接的时候被获得内存空间。

下图表示程序运行,即程序在内存时的存储布局:

 

 

 

//main.c  
int a = 0; //全局初始化区  
char *p1; //全局未初始化区  
  
main()  
{  
    static int c =0; //全局(静态)初始化区  
    int b; //栈  
    char s[] = "abc"; //栈  
    char *p2; //栈  
    char *p3 = "123456"; //"123456\0"在常量区,p3在栈上。  
    p1 = (char *)malloc(10);  
    p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区。  
}

 

size命令可以查看正文段(.text)、数据段(data)、bss端的长度(单位为字节)。

其中dec代表十进制,hex代表十六进制。

pmap命令可以查看某个进程的各内存端的地址。

使用ps xvf可以获得进程id,然后pmap 进程id :

得到具体的内存分布情况。

想要查看某个数据存放在哪个位置,可以使用%p,输出那个数据的地址,再对照着上图查看。

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

unix中c语言典型的存储空间布局 的相关文章

  • 使用 grep 进行多种搜索模式

    考虑我有以下数据流 BODY1 attrib1 someval11 attrib2 someval12 attrib3 someval13 BODY2 attrib1 someval21 attrib2 someval22 attrib3
  • 如何将命令输出作为多个参数传递给另一个命令

    我想将命令的每个输出作为多个参数传递给第二个命令 例如 grep pattern input returns file1 file2 file3 我想复制这些输出 例如 cp file1 file1 bac cp file2 file2 b
  • 在unix、bash中合并csv文件

    我有一些 csv 文件 其格式如下 测试1 csv field port1 a1 0 2 a2 0 3 a3 0 6 测试2 csv field port2 b1 0 5 b2 0 6 b3 0 7 b4 0 1 b5 0 5 测试3 cs
  • BASH 中带有千位分隔符的数字格式

    我有一个号码12343423455 23353 我想用千位分隔符格式化数字 所以输出将是12 343 423 455 23353 printf 3f n 12345678 901 12 345 678 901
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 在 Bash 中拆分 csv 文件中的列

    我想从 csv 文件的第二列中提取值并将提取的值存储在新列中 我的数据集示例 page name post id page id A 86680728811 272953252761568 86680728811 A 86680728811
  • 如何创建路径别名?

    那么 cs 将映射到 College 以便我可以运行命令 cd cs 我相信您在问如何创建符号链接 或符号链接 例如 ln s College cs 不过 还有其他方法可以加快工作流程 例如设置 CDPATH export CDPATH C
  • 未创建 .ssh 目录

    生成 sshdir 我使用这个命令 ssh keygen 摘自本教程 http ebiquity umbc edu Tutorials Hadoop 05 20 20Setup 20SSHD html http ebiquity umbc
  • 从文件中删除包含非英语 (Ascii) 字符的行

    我有一个文本文件 其中包含来自不同语言的字符 例如 中文 拉丁文等 我想删除包含这些非英语字符的所有行 我想包含所有英文字符 a b 数字 0 9 和所有标点符号 我如何使用 awk 或 sed 等 unix 工具来完成此操作 Perl 支
  • 如何从C程序执行C程序的shell中更改环境变量?

    我想改变的值PATHC 程序中的变量 然后在运行该程序的 shell 中查看更改后的值 做这样的事情 include
  • 如何在 VIm 和终端中始终拥有相同的当前目录?

    我希望我的终端当前目录跟随我的 VIM 目录 Example 在终端中 gt pwd gt Users rege gt vim 然后在VIM中 cd Users rege project
  • 使用终端(或 Shell)将文件的一部分复制/粘贴到另一个文件中

    我正在尝试将 txt 文件的一部分从行号 n 复制到行号 n y 假设 1000 到 1000000 我尝试过与运营商合作sed 并且失败了 这是我尝试过的命令 sed n 1000 1000000p path first file gt
  • 在浏览器中创建 bash shell 的可行性如何?

    主要是 我是 Unix 机器上的 C C 程序员 但是我会因为基于浏览器的 shell 访问 Linux 机器而放弃 所以 问题是 这有多难 什么方法最适合在网页中构建真正的 shell 级访问 闪光 JavaScript 我知道这确实是所
  • 在 unix bash 脚本中可以嵌套 Here Document 吗?

    是否可以在另一个heredoc中编写一个heredoc ssh T q yxz server1 lt lt END TEXT ssh T q abc server2 lt lt SUB TEXT SUB TEXT END TEXT Yes
  • 为什么符号链接的权限默认为所有许可?

    当我使用创建硬链接时ln ln testfile txt testfile2 txt 文件硬链接 通过 inode 表中两个别名的相同 inode 编号进行确认ls li 对硬链接文件具有与原始名称文件相同的初始权限 1222285 rw
  • 基于 Unix ASCII 的命令行图表/绘图工具

    有没有好的命令行 UNIX 图表 绘图 绘图工具 我正在寻找能够在 ASCII 图表上绘制 xy 点的东西 澄清一下 我正在寻找能够以 ASCII 格式输出图形 如 ascii art 风格 的东西 这样我就可以在交互式 shell 会话中
  • 在进行 sem_timedwait 时,我将如何应对系统时间的变化?

    假设我有一个使用的程序sem timedwait为了等待 100 毫秒 获取当前时间 添加 100 毫秒 将结果用作abs timeout 参见手册页 http man7 org linux man pages man3 sem wait
  • 安装python启动文件

    我如何安装pythonstartup文件 以便它在命令上运行 例如python myfile py 我尝试将其安装到我的 home myuserUbuntu的目录 但它说我没有足够的权限 此外 不同的地方交替说它应该全部大写或全部小写 前面
  • 如何处理文件中的特殊字符(ഀ)

    我有一个文件 当我打开它时 它看起来像这样 Notepad A B C D E 31 HB 39 Ph 49 32 FB 38 Ph 59 当我尝试从 WinScp 打开它时 它看起来如下所示 A B C D E 31 HB 39 Ph 4
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输

随机推荐

  • 【Rust日报】2023-04-04 Slint : 下一代 GUI 编程工具包

    Slint 下一代 GUI 编程工具包 Slint 1 0 正式发布了 xff0c 这是一个重要的里程碑 xff0c 标志着 Slint 可以逐步在生产环境中应用了 Slint 的开发始于 2020 年 5 月 xff0c 最早被称为 34
  • 【Rust日报】2023-04-10 你能相信编译器优化的代码吗 ?

    你能相信编译器优化的代码吗 这篇文章讨论了编译器优化的问题 xff0c 以及为什么我们可以信任编译器来优化我们的代码 他解释了编译器如何工作 xff0c 以及如何在编写代码时考虑编译器的优化 总的来说 xff0c 编译器是可以信任的 xff
  • 【Rust 日报】2023-05-07 来Qdrant参与贡献

    来Qdrant参与贡献 Qdrant OSS 团队现在用一种新方法来挑选加入 Rust 团队的合适候选人 让候选人先做出贡献 如果有一个开放的 Rust 开发者职位 xff0c 你有兴趣申请 xff0c 可以从 GitHub Issue 中
  • 【Rust日报】2023-05-08 Rust + Next.js + Tauri开发桌面应用

    Rust 43 Next js 43 Tauri开发桌面应用 这篇文章中 xff0c 作者介绍了如何使用 Tauri 和 Next js 来构建一个桌面应用程序 他们首先介绍了如何设置 Tauri 和 Next js xff0c 并创建了一
  • 【Rust日报】2023-05-09 Stackoverflow 开发者调研开始了

    Stackoverflow 开发者调研开始了 又到了一年一度的时候 xff0c 我们再次向社区宣布 xff1a 又到了一年一度的时候 xff01 xff08 这个递归玩笑是给那些使用 LISP 的 1 31 的用户的 xff09 我们的 2
  • 【Rust日报】 2019-07-06:使用Rust與GTK 快速開發桌面應用

    Analysis of Rust Crate Sizes on crates io 有人寫了一個程式可以分析crates io 裡面庫的大小 read more tiny keccak 1 5 0 Keccak是一種多功能的加密函數 tin
  • 使用python PIL库实现简单验证码的去噪

    首先要感谢一下字符型图片验证码识别完整过程及Python实现的博主 xff0c 我的大部分知识点都是从他那里学来的 想要识别验证码 xff0c 收集足够多的样本后 xff0c 首先要做的就是对验证码原始图片进行处理 xff0c 对验证码识别
  • 将一个长度最多为30位数字的十进制非负整数转换为二进制数输出 c语言 大数处理

    Time Limit 1000 ms Memory Limit 32768 mb 将一个长度最多为30位数字的十进制非负整数转换为二进制数输出 输入描述 多组数据 xff0c 每行为一个长度不超过30位的十进制非负整数 xff08 注意是1
  • Nginx文件上传报413错误

    目录 一 问题描述二 解决方法 一 问题描述 Nginx文件上传报413错误 二 解决方法 nginx 默认对上传文件的大小做了限制 xff0c 默认大小为 1m 超过默认大小就会报 413 xff08 too large xff09 错误
  • Redis报错MISCONF Redis is configured to save RDB snapshots

    目录 一 问题描述二 解决方法1 命令行修改2 配置文件修改 三 其它问题 一 问题描述 Redis 之前一直使用正常 xff0c 某一天突然报错 xff1a MISCONF Redis is configured to save RDB
  • 内核的同步(synchronization)以及锁机制

    1 前言 为什么要考虑内核同步临界区例子 2 加锁3 死锁4 扩展性 1 前言 为什么要考虑内核同步 在单一CPU 的情况下 xff0c 中断或者内核代码明确调度时 xff0c 多个执行线程并发访问共享数据 目前多处理器以及抢占式内核的存在
  • 内核中链表(Linked List)的实现

    前言比较简单的链表 单向链表双向链表 linux 内核中双向链表的实现 存放数据的结构体存放链表指针的结构体container of 宏 内核中链表的使用自己手写的链表实验 前言 内核中链表是比较简单的数据结构 xff0c 通过两个指针元素
  • LUKS 磁盘加密

    前言LUKS 的使用步骤开机自动识别加密磁盘 根分区自动识别 忘记密码怎么办 xff1f 前言 LUKS xff08 Linux Unified Key Setup xff09 是 Linux 硬盘加密的标准 通过提供标准的磁盘格式 xff
  • linux 分区和文件系统结构

    前言磁盘分区 1 分区结构 MBR 分区GPT 分区 文件系统 1 文件系统结构2 inode 如何找到文件 3 File descriptor 彩蛋 xff1a df 是怎么计算出来的 前言 本篇文章总结一下磁盘分区以及文件系统的结构 x
  • Linux 内存分析——进程和物理结构角度

    文章目录 前言进程如何使用内存进程地址空间虚拟内存在内核中的实现系统上查看进程内存进程用来申请内存的函数共享内存实现进程间通讯64位系统地址空间 从物理内存角度看内存内存页及虚拟内存到物理内存的映射物理内存的 ZONE伙伴系统buddy 和
  • Ubuntu18.04 禁用自动挂起,禁止自动休眠

    戴尔的7920工作站新安装了ubuntu18 04LTS xff0c 结果登录远程桌面差不多半个小时之后就断开连接了 xff0c 查看发现机器自动挂起了 修改了power设置中中blank screen 为never xff0c 保存之后过
  • 手把手教你,搭建内网穿透服务

    我的 GitHub 仓库 xff1a 手把手教你搭建内网穿透服务 xff0c 基于 lanproxy 穿透服务 xff0c 为你深度定制了开箱即用的服务端和客户端 Docker 镜像 在很多场景下内网穿透都是我们常常遇到的需求 xff0c
  • 支持alpha通道的视频编码格式以及容器类型汇总

    支持alpha通道的视频编码格式以及容器类型汇总 1 png图像序列 xff0c mov mkv等格式 2 qtrle编码 xff0c mov格式 3 Apple ProRes 4444 rgba 4个通道 xff0c 其容器格式尚未了解
  • word如何给论文加引用文献

    给论文加引用文献其实差不多就是加了个链接 xff0c 通过点击链接跳转到文末最后展示引用文献额作者 xff0c 论文名等等信息 xff0c 给论文加引用文献只要有一下几步 xff1a 一 设置参考文献标号字体格式 对于论文中的文献 xff0
  • unix中c语言典型的存储空间布局

    此文转载于 xff1a https www cnblogs com LUO77 p 5853534 html 一个程序本质上都是由 BSS 段 data段 text段三个组成的 可以看到一个可执行程序在存储 xff08 没有调入内存 xff