Where do your variables stored

From Embedded Systems Learning Academy
Jump to: navigation, search

BSS and Data Segments

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

Where does your program reside? 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 text segment.

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.