linux编程-关于linux内存 数据段和bss段的疑惑???

问题描述

关于linux内存 数据段和bss段的疑惑???

数据段和bss段分别存放 已初始化/未初始化 的全局变量和静态变量。

那么,假如bss段的全局变量和静态变量在代码执行中被初始化了,那么会不会被转移到
数据段存储呢???

解决方案

首先我觉得你所说的在执行中被初始化的说法是不正确的,应该叫赋值。
接下来我们看一段代码:

#include <stdio.h>
int a;
int b=10;
int c=11;
int main(void)
{
    int d;
    int e=12;
    return 0;
}

用gcc编译后,(在linux下用命令size,得到如下结果)

text       data     bss     dec        hex      filename
1115     560          8    1683     693     t10

继续看下面修改后的代码:

#include <stdio.h>
int a;
int a1;
int a2;
int a3;
int b=10;
int c=11;
int main(void)
{
    int d;
    int e=12;
    return 0;
}

再用size命令,你会看到:

text       data     bss     dec     hex filename
1115        560      24    1699     6a3 t10

通过这些数据,你应该很容看出bss的大小变化,
而你所说的会不会转移的问题,我想说,程序被编译后,
就只会加载代内存中等待执行,不会转移的。
希望对你有用!

时间: 2025-01-01 01:27:48

linux编程-关于linux内存 数据段和bss段的疑惑???的相关文章

数据段、代码段、堆栈段、BSS段的区别

最近在复习一些以前的知识点,整理了一些相关的基本概念,以下的概念网上有博客已经提出了,在此我将这些知识点进行总结: 5个数据段        进程(执行的程序)会占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途 不一而不尽相同,有些内存是事先静态分配和统一回收的,而有些却是按需要动态分配和回收的.对任何一个普通进程来讲,它都会涉及到5种不同的数据段. Linux进程的五个段 下面我们来简单归纳一下进程对应的内存空间中所

linux编程-关于Linux的三个编程题,想了半天毫无头绪,感觉Linux编程好复杂。求大家帮助帮助我,谢谢。

问题描述 关于Linux的三个编程题,想了半天毫无头绪,感觉Linux编程好复杂.求大家帮助帮助我,谢谢. 1:子进程每隔一秒向文件写入信息,父进程每隔三秒读出子进程所写的信息并输出到屏幕. 2:模拟shell,设计一个交互式命令处理程序,注意对命令参数和环境参数的处理. 3:编写一个守护进程,实现功能为:每隔一秒,向当前目录下的hello文件里写入一行helloworld. 解决方案 Linux设备驱动编程之复杂设备驱动25岁了,是学linux运维还是编程好呢?求指点下 .. 解决方案二: 楼

linux编程-在 Linux中写完 makefile make时出现下列的情况 怎么解决呀

问题描述 在 Linux中写完 makefile make时出现下列的情况 怎么解决呀 在 Linux中写完 makefile make时出现下列的情况 怎么解决呀 试了很多办法 附问题图片和makefile 解决方案 http://blog.csdn.net/jiaweizou/article/details/7546619 解决方案二: 根据你的错误提示看的话应该是没定义变量的问题-- 但这些变量貌似应该不是你定义的吧--可以试试把function5.c所依赖的头文件放在和function5

《Linux系统编程(第2版)》——1.4 Linux编程的概念

1.4 Linux编程的概念 本节给出了Linux系统提供的服务的简要概述.所有的UNIX系统,包括Linux,提供了共同的抽象和接口集合.实际上,UNIX本身就是由这些共性定义的,比如对文件和进程的抽象.管道和socket的管理接口等等,都构成了UNIX系统的核心. 本概述假定你对Linux环境很熟悉:会使用shell的基础命令.能够编译简单的C程序.它不是关于Linux或其编程环境的,而是关于Linux系统编程的基础. 1.4.1 文件和文件系统文件是Linux系统中最基础最重要的抽象.Li

《操作系统真象还原》——0.8 代码中为什么分为代码段、数据段?这和内存访问机制中的段是一回事吗

0.8 代码中为什么分为代码段.数据段?这和内存访问机制中的段是一回事吗 首先,程序不是一定要分段才能运行的,分段只是为了使程序更加优美.就像用饭盒装饭菜一样,完全可以将很多菜和米饭混合在一起,或者搅拌成一体,哈哈,但这样可能就没什么胃口啦.如果饭盒中有好多小格子,方便将不同的菜和饭区分存放,这样会让我们胃口大开增加食欲. x86平台的处理器是必须要用分段机制访问内存的,正因为如此,处理器才提供了段寄存器,用来指定待访问的内存段起始地址.我们这里讨论的程序代码中的段(用section或segme

可执行程序中的BSS段

BSS段: BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配.BSS节不包含任何数据,只是简单的维护开始和结束的地址,以便内存区能在运行时被有效地清零.BSS节在应用程序的二进制映象文件中并不存在.如果在嵌入式里,很可能没加载器,你的程序是直接由bootload程序加载到内存的.这个时候,bss区域是否被清0,要看写bootload代码的人了.因为这种bootloa

点评五款用于 Linux 编程的内存调试器

点评五款用于 Linux 编程的内存调试器 Credit: Moini 作为一个程序员,我知道我肯定会犯错误--怎么可能不犯错!程序员也是人啊.有的错误能在编码过程中及时发现,而有些却得等到软件测试了才能显露出来.然而,还有一类错误并不能在这两个阶段被解决,这就导致软件不能正常运行,甚至是提前终止. 如果你还没猜出是那种错误,我说的就是和内存相关的错误.手动调试这些错误不仅耗时,而且很难发现并纠正.值得一提的是,这种错误很常见,特别是在用 C/C++ 这类允许手动管理内存的语言编写的软件里. 幸

linux驱动-Linux如何管理内核的数据段?

问题描述 Linux如何管理内核的数据段? 我目前知道的或自以为知道的(以32位Linux.3G+1G的配置为例):1. Linux里的每个进程都有4G的地址空间,其中0至3G是用户空间,3G至4G是内核.内核被共享在每个进程的地址空间中.2. 每个进程的地址空间内大约有4个段,即内核代码段.内核数据段.用户代码段.用户数据段.3. 我以为属于内核的物理内存,是不能被交换(swap)到硬盘上的,也就是常驻在内存中的. 但是我现在在看一篇文献,上面大约这样说:...上面提到的那种设计不好(注:具体

Linux编程中的带外数据

定义带外数据 想 像一下在银行人们排起队等待处理他们的帐单.在这个队伍中每个人最后都会移到前面由出纳员进行服务.现在想像一下一个走入银行,越过整个队伍,然后用枪抵 住出纳员.这个就可以看作为带 外 数据 .这个强盗越过整个队伍,是因为这把枪给了他凌驾于众人的权力.出纳员也会集中注意力于这个强盗身上,因为他知道当前 的形势是很紧急的. 相应的,一个连接的流式套接口上的带 外 数据 的工作原理也与此类似.通常情况下,数据 由连接的一端流到另一端,并且认为 数据 的所有字节都是精确排序的.晚写入的字节