Data Segment & BsS-locations1int global bss;2int global data = 1o;3Stackint main(void)4static int static bss;5static int static data = 1o:6printf("globalbss=%p\n",&globalbss:7&static bssprintf("staticbss=%pln",Heap8printf("global data =%pln",&global data9printf("static data = %pln",&static data10子Data Segment$./data_vs_bss&BSSBSSglobal0x804a028bss=staticbss=0x804a0240x804a014global data =static data =0x804a018DataCode$Constant16
Data Segment & BSS – locations 16 $ ./data_vs_bss global bss = 0x804a028 static bss = 0x804a024 global data = 0x804a014 static data = 0x804a018 $_ 1 int global_bss; 2 int global_data = 10; 3 int main(void) { 4 static int static_bss; 5 static int static_data = 10; 6 printf("global bss = %p\n", &global_bss ); 7 printf("static bss = %p\n", &static_bss ); 8 printf("global data = %p\n", &global_data ); 9 printf("static data = %p\n", &static_data ); 10 } BSS Data Data Segment & BSS Heap Code + Constant Stack
DataSegment&BsS-sizesNo optimization.char a[1000000] = (10];-00sgccdata large data_large.cO$-00data small data small.cgcc0int main(void){return 0;$ 1sdata smalldata large7Program:data_large.cGuess!Whichoneislarge?char a[100] =(10];int main(void)(return Q;子What isthedifferencebetween dataandBsS?Program: data small.c17
Data Segment & BSS – sizes 17 Guess! Which one is large? $ gcc -O0 -o data_large data_large.c $ gcc –O0 –o data_small data_small.c $ ls –l data_small data_large No optimization. Program: data_large.c char a[1000000] = {10}; int main(void) { return 0; } Program: data_small.c char a[100] = {10}; int main(void) { return 0; } What is the difference between data and BSS?
DataSegment&BsS-sizeschar a[1000000] =(10];$ gcc -oo -o data large data large.c$gcc -0o-o data_small data_small.cint main(void){return 0;$ ls -1 datasmalldata large71004816data_large-rwxr-xr-x.4916data small-rwxr-xr-x$Program:data_large.cWow!char a[100] = (10];int main(void){return o;子The data segment has the requiredspacealreadyallocatedProgram: data small.c18
Program: data_large.c Data Segment & BSS – sizes 18 char a[1000000] = {10}; int main(void) { return 0; } Program: data_small.c char a[100] = {10}; int main(void) { return 0; } $ gcc -O0 -o data_large data_large.c $ gcc –O0 -o data_small data_small.c $ ls –l data_small data_large -rwxr-xr-x . 1004816 . data_large -rwxr-xr-x . 4916 . data_small $_ Wow! The data segment has the required space already allocated
DataSegment&BsS-sizeschar a[1000000];$gcc -oo-o bss_largebss_large.c$gcc-0o-obss_smallbss_small.cint main(void){return 0;$ls-1bss_smallbss_large74775...bss_1arge-rwxr-xr-x.4775bsssmall-rwxr-xr-x$Program:bss large.cSame size!char a[100];Totheprogram,BssisjustabunchofsymbolsThespaceisnotyet allocatedint main(void)(return θ;The space will be allocated to the process onceit starts executingProgram:bss_small.cThis is why BsS is called“Block Started bySymbol".19
Program: bss_large.c Data Segment & BSS – sizes 19 char a[1000000]; int main(void) { return 0; } Program: bss_small.c char a[100]; int main(void) { return 0; } $ gcc -O0 -o bss_large bss_large.c $ gcc –O0 -o bss_small bss_small.c $ ls –l bss_small bss_large -rwxr-xr-x . 4775. bss_large -rwxr-xr-x . 4775. bss_small $_ Same size! To the program, BSS is just a bunch of symbols. The space is not yet allocated. The space will be allocated to the process once it starts executing. This is why BSS is called “Block Started by Symbol
DataSegment&BsS-limitsHow large is the data segment?InLinux,“ulimit"isabuilt-incommandin"/bin/bash"ulimit-acore file size(blocks,-c)0It setsorgetsthesystem(kbytes,-d)unlimiteddata seg sizelimitations in the current shell.Does the "unlimited" mean that you can define a global arraywithlargeenoughsize?20
Data Segment & BSS – limits 20 $ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited . $ _ In Linux, “ulimit” is a built-in command in “/bin/bash”. It sets or gets the system limitations in the current shell. How large is the data segment? Does the “unlimited” mean that you can define a global array with large enough size?