bss段

堆栈、BSS段、代码段、数据段、RO、RW、ZI等概念区分

浪子不回头ぞ 提交于 2020-03-05 13:08:03
堆栈、BSS段、代码段、数据段、RO、RW、ZI等概念区分 一 预备知识 二 程序文件中的分区 三 程序进程中的分区 四 总结 一 预备知识 在区分一个程序的堆栈、bss、text段、RO、RW、ZI等概念时,首先区分一下程序进程和程序文件,然后了解一下哈弗结构和冯诺依曼结构。 程序进程就是程序运行时的程序,程序文件是编译后生成的可执行文件,比如.bin文件等,这两个概念很好区分,特别强调一下,分开表达主要是怕读者在阅读过程中混淆了。 哈佛结构和冯诺依曼结构的主要区别就是 处理器能不能实现取指令和取数据的并发进行 。嵌入式芯片中主要是哈佛结构,PC机上是冯诺依曼结构。 经典的哈佛结构: 程序存储器和数据存储器是各自独立的存储器。处理器应该有两套总线,一套是程序存储器的数据和地址总线,一套是数据存储器的数据和地址总线。取指令和取数据能并发进行。51的程序进程的逻辑代码段放在ROM中,而变量部分则放在RAM中,取ROM中的指令和RAM中的变量是两套总线。 改进型哈佛结构: 程序存储器和数据存储器是各自独立的存储器。处理器只有一套总线,分时访问程序存储器和数据存储器,但是在处理器中有icache和dcache将程序和数据分开,所以处理器仍然可以并步执行取指令和取数据。从ARM9开始以后所有的ARM处理器内核都是改进型的哈佛结构。ARM的逻辑代码和变量都是存放在RAM中的,但是

.bss段和.data段的区别

浪子不回头ぞ 提交于 2020-03-03 18:44:28
一个程序本质上都是由 bss段、data段、text段三个组成的。这样的概念,不知道最初来源于哪里的规定,但 在当前的计算机程序设计中是很重要的一个基本概念。而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的 问题。 在采用段式内存管理的架构中(比如intel的80x86系统),bss段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss 段部分将会清零。bss段属于静态内存分配,即程序一开始就将其清零了。 比如,在C语言之类的程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。 在《Programming ground up》里对.bss的解释为:There is another section called the .bss. This section is like the data section, except that it doesn’t take up space in the executable. text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。   而在

内存分布及程序运行中的BSS段、数据段、代码段、堆和栈

一个人想着一个人 提交于 2020-02-29 21:51:05
栈(stack):又称堆栈,栈是由编译器自动分配释放,存放函数的参数值,局部变量的值等(但不包括static声明的变量,static意味着在数据段中存放变量)。除此之外,在函数被调用时,栈用来传递参数和返回值。由于栈的先进后出的特点,所以栈特别方便用来保存/恢复调用数据。其操作方式类似于数据结构中的栈。 堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小,并不固定,可动态扩张或缩放。当进程调用malloc/free等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张)/释放的内存从堆中被提出(堆被缩减)。堆一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 全局数据区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域。另外文字常量区,常量字符串就是放在这里,程序结束后由系统释放。 (1) BSS段(bss segment):通常是指用来存放程序中 未初始化 的全局变量的一块内存区域。BSS段属于静态内存分配。 (2) 数据段(data segment):通常是指用来存放程序中 已初始化 的全局变量的一块内存区域。数据段属于静态内存分配。 代码段(code segment/text

深入程序编译链接和装载过程

僤鯓⒐⒋嵵緔 提交于 2020-02-20 02:29:27
文章目录 预编译 编译 汇编 链接 基础先知 指令和数据 分析二进制可重定位目标文件 main.o 的组成 强符号和弱符号 符号表 链接过程分析 运行 提问:一个源文件是如何变成可执行文件的? 在linux中,使用GCC来编译程序,我们逐步来分析: 预编译 gcc -E hello.c hello.i 编译 gcc -S hello.i -o hello.s 汇编 gcc -c hello.s -o hello.o 链接 gcc hello.o -o hello 运行 ./hello 预编译 预编译阶段主要处理以"#"开头的预编译指令。 删除宏定义并作文本替换 递归展开头文件“#include” 处理#if、#ifdef、#elif、#else、#endif等 删除注释“//”和 “/* */” 添加行号和文件标识,以便编译器产生编译调试时的行号信息,以及产生错误或警号时能够显示行号 保留所有的#pragma指令 编译 词法分析 语法分析 语义分析 代码优化 生成汇编指令 汇编 将汇编指令转换成机器指令 链接 基础先知 指令和数据 局部变量属于指令,静态变量和全局变量属于数据。 int gdata1 = 10; //数据 int gdata2 = 0; //数据 强符号 int gdata3;//数据 static int gdata4 = 11; //数据 static int

代码中函数、变量、常量 / bss段、data段、text段 /sct文件、.map文件的关系[实例分析arm代码(mdk)]

…衆ロ難τιáo~ 提交于 2020-02-08 02:01:49
一. bss介绍:    代码中函数、变量、常量 / bss段、data段、text段 /sct文件、.map文件的关系[实例分析arm代码(mdk)] bss和data的区别: 全局的未初始化变量存在于.bss段中,具体体现为一个占位符; 全局的已初始化变量存于.data段中; .bss是不占用.exe文件空间的,其内容由操作系统初始化(清零); 而.data却需要占用,其内容由程序初始化。 若这样定义一个全局变量:int g_inBss[9] ; 则它在.bss段,这里占用占位符的空间。 若这样定义一个全局变量:int g_inData[9] ={1,2,3,4,5,6,7,8,9}; 则它在.data段,程序占用数组全部大小的空间。 bss和data的联系: 都在rw区域; bss段在运行起来成为进程之后,占的空间大小和data就相同了。 二. 分析 uboot代码中的clearbss段的代码: _bss_start 和 __bss_start ==================================== 1. u-boot-1.1.6/board/100ask24x0/u-boot.lds ...... ENTRY(_start) SECTIONS { . = 0x00000000; . = ALIGN(4); .text : { cpu/arm920t

程序的bss段和data段对比

这一生的挚爱 提交于 2020-01-27 01:23:56
bss段是指的是用来存放未初始化的内存空间 .lcomm 相当于局部的static 未初始化局部变量 .comm 相当于全局的未初始化变量 或者static 全局未初始化变量 用来申请对应的运行时内存 它是通过操作系统进行初始化 而且bss段申请的空间 并不会占用elf文件的空间 只是在程序运行成为进程的时候 才会占用响应的内存空间 否则在硬盘的程序中 只是一个标识 用来标记 这一块要有多大的内存空间 我要在程序运行时候 给他分配 并且 操作系统分配初始化为0 bss段的分配内存属于静态内存分配(也就是程序在一开始就被清空了) 相当于一个地址一样 在链接时候就会产生一段内存块 但是并不占用文件空间 直到这块内存区进入到进程空间时候 .data 属于初始化内存之后的数据 存放区域 字符串常量值 存放在rodata 只读内存数据区 但是有的立即数 常量 会直接存放在.text段 来源: CSDN 作者: 皇甫懿 链接: https://blog.csdn.net/weixin_43743847/article/details/104041430

BSS段 data段 text段 堆heap 和 栈stack

你。 提交于 2019-12-19 01:40:27
BSS段:BSS段(bss segment) 通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 数据段:数据段(data segment) 通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。 代码段:代码段(code segment/text segment) 通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。 堆(heap): 堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减) 栈(stack) :栈又称堆栈,是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存

Linux下C程序进程地址空间布局

时光毁灭记忆、已成空白 提交于 2019-12-10 14:47:36
我们在学习C程序开发时经常会遇到一些概念:代码段、数据段、BSS段(Block Started by Symbol) 、堆(heap)和栈(stack)。先看一张教材上的示意图(来源,《UNIX环境高级编程》一书),显示了进程地址空间中典型的存储区域分配情况。 从图中可以看出: 从低地址到高地址分别为:代码段、(初始化)数据段、(未初始化)数据段(BSS)、堆、栈、命令行参数和环境变量 堆向高内存地址生长 栈向低内存地址生长 还经常看到下面这个图(来源,不详): 先看一段程序。 [cpp] view plain copy #include <stdio.h> #include <stdlib.h> int global_init_a=1; int global_uninit_a; static int static_global_init_a=1; static int static_global_uninit_a; const int const_global_a=1; int global_init_b=1; int global_uninit_b; static int static_global_init_b=1; static int static_global_uninit_b; const int const_global_b=1; /*上面全部为全局变量

BSS段和数据段

久未见 提交于 2019-12-10 14:22:20
内存分段(英语:Memory segmentation),一种电脑内存的管理技术,它将电脑的主内存分成许多区段(segment或sections)。当处理器要进行内存定址时,会使用一个数值,这个数值包括了某个区段,以及偏移量(offset)。一个程式的目的档(Object file)中也会使用区段,让它们可以链接成执行档,并载入内存中执行。 BSS段: 在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中 未初始化的 全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。.bss section 的空间结构类似于 stack。特征:静态变量、未显式初始化、在变量使用前由运行时初始化为零。 数据段: 在采用段式内存管理的架构中,数据段(data segment)通常是指用来存放程序中 已初始化且不为0 的全局变量的一块内存区域。数据段属于静态内存分配。 程序03: /* stack03.c */ int a; int main(int argc, char * argv[]) { return 0; } 程序04: /* stack04.c */ int a = 12; int main(int argc, char * argv[]) { return 0; } 程序05: /*

u-boot中bss段的使用

岁酱吖の 提交于 2019-12-06 02:17:05
近日在调试uboot时,发现了一个现象,即在relocate_code前如果给未初始化或者初始化值为0的变量赋值的话,则在relocate_code后程序无法正常执行.经过学习,恶补如下知识 BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。 BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。 代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。 堆(heap):堆是用于存放进程运行中被动态分配的内存段 ,它的大小并不固定,可动态扩张或缩减。当进程调用 malloc等函数分配内存时 ,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减) 栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量 ,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量