Where do your variables stored

From Embedded Systems Learning Academy
Revision as of 09:30, 17 December 2016 by Proj user16 (talk | contribs) (BSS and Data Segments)

Jump to: navigation, search

BSS and Data Segments

What are text,.bss and data sections in an Embedded C program?

Where do your program recide?Obviously memory,but how is it organized?

In embedded systems ,which are RAM-memory constrained ,memory map is divided into segments called text,data and bss.

Text segment:

Contains code and constants of the program.Text section is allocated on flash.

Eg1: a.out :executable code

Eg2:const uint8_t i=8 :contant

Eg3:


	#include <stdio.h>

	const int global_var=20;

	int data_variable = 500;

	static int static_var=10;

	void foo()
        {
	   const int local_constant=100;	

           int local;
	 
           local = 3;

           int un-initialized;

	   int another-initialized=0;

	   static int local_static=9;

	   local_static++;

	   printf("local varaible is %d\n", local);
	}
        

In the above example, executable code of the program is stored in flash and const variable global_var=20 and local_constant=100 are stored in flash.

Data segment:

Initialized variables are stored in this section. Initially values are stored in flash and copied into RAM during execution through copy down process.

Eg: uint8_t j=10; --------initialized variable

In the code given above int data_variable = 500,static int static_var=10,local = 3, and local_static=9 are stored in data segment.

.bss segment:

Uninitialized variables are stored in bss section.

In embedded software, the bss segment is mapped into memory that is initialized to zero by the C run-time system before main() is entered.

(wiki :https://en.wikipedia.org/wiki/.bss#BSS_in_C)

Eg:int newvar;

In the above code un-initialized(after initializing it to zero) and another_initialized are stored in bss section ;

Simple example:


	#include <stdio.h>

	int main(void)
	{
		return 0;
	}
       

Memory occupied by the above program:

	$ gcc -o just_main just_main.c

	$ size just_main.exe

	text    data     bss     dec     hex filename
	3153    1976     448    5577    15c9 just_main.exe
        
        

After modifying the above program with one global variable:


	#include <stdio.h>

	int global_var;

	int main(void)
	{
		return 0;
	}
	
        

Memory map of the above program looks like:


	$ gcc -o just_main just_main.c

	$ size just_main.exe

	text    data     bss     dec     hex filename
	3153    1976     464    5593    15d9 just_main.exe
        
        

bss section is increased by 2 bytes;

Modify the above program with global variable initialized to zero;


	#include <stdio.h>

	int global_var=0;

	int main(void)
	{
		return 0;
	}
	
        

Data and bss segments occupy the RAM area as below.


	$ gcc -o just_main just_main.c

	$ size just_main.exe

	text    data     bss     dec     hex filename
	3153    1976     480    5609    15e9 just_main.exe

        

bss segment is increased by 32 bits(4 bytes)

Modify the above program with global variable initialized to non-zero;


	#include <stdio.h>

	int global_var=8;

	int main(void)
	{
		return 0;
	}
         
        

RAM memory is occupied by bss and data as below

        
	$ gcc -o just_main just_main

	$ size just_main.exe

	text    data     bss     dec     hex filename
	3153    1976     448    5577    15c9 just_main.exe

        

bss section is not modified.


FAQ: What is the size of bss segment? bss does not take any space in the object file and stores the count of variables that can be given initial values.Hence occupy 4 or 8 bytes depending on the implementation.

What is the amount of RAM being used? Memory occupied by bss and data segments added together.