반응형
Notice
Recent Posts
Recent Comments
관리 메뉴

꿈꾸는 사람.

[Linux] BSS란 무엇인가? 본문

IT/Linux

[Linux] BSS란 무엇인가?

현무랑 니니 2013. 7. 18. 17:36
반응형


1. BSS란?

BSS는 block started by symbol의 약어이다.

.bss나 bss는 초기에 오직 제로 값으로 표시된 정적으로 할당된 변수가 포함된 데이터 세그먼트의 일부로 컴파일러나 링커에 의해  사용된다.

즉, 초기화되지 않은 전역 데이터를 위한 영역이다.

C언어에서 명시적으로 초기화하지 않은 정적으로 할당된 객체는 0(산술 유형인 경우)나 null 포인터(포인터 유형에 대해)로 초기화된다.

일반적으로 C의 구현은 제로 값과 null 포인터 값을 오직 제로 값 비트로 구성된 비트 패턴을 사용하여 표시한다.

따라서 BSS 영역은 일반적으로 static 키워드로 선언된 초기화되지 않은 지역 변수처럼 파일 범위로 선언된 모든 초기회되지 않은 변수를 포함한다.


일반적으로 프로그램 로더가 프로그램을 로드할 때 bss 영역에 할당된 메모리를 초기화한다.


2. vmlinux.lds 링크 스크립트 파일[각주:1]

커널을 컴파일 하는 과정에서 두개의 vmlinux 파일이 생성되며, 
KERNEL_TOP/vmlinux 를 생성 할 때 링커 스크립터는 arch/arm/kernel/vmlinux.lds 를 사용하고,
arch/arm/boot/compressed/vmlinux 를 생성 할 때는  arch/arm/boot/compressed/vmlinux.lds 를 사용한다.


2.1 arch/arm/kernel/vmlinux.lds.S 링커 스크립트 파일

bss 영역이 아래와 같이 __bss_start와 _end 사이의 영역이다.

.bss : {              

         __bss_start = .;    /* BSS              */

         *(.bss)           

         *(COMMON)

         _end = .;         

     }


2.2 arch/arm/boot/compressed/vmlinux.lds.in 링커 스크립트 파일

bss 영역이 아래와 같이 __bss_start와 _end 사이의 영역이다.

   . = BSS_START;

   __bss_start = .;

   .bss          : { *(.bss) }

   _end = .;


3. BSS 영역 초기화

Linux가 부팅할 때 압축된 커널 zImage의 압축을 해제하는데 이 과정에서 BSS 영역 초기화를 수행한다.

해당 코드는 아래와 같다.


arch/arm/boot/compressed/head.S

not_relocated: mov r0, #0

1: str r0, [r2], #4 @ clear bss

str r0, [r2], #4

str r0, [r2], #4

str r0, [r2], #4

cmp r2, r3

blo 1b

 위 코드는 BSS 영역을 0으로 초기화한다.


 mov r0, #0 

 str r0, [r2], #4



 r0 <- 0

 (1) MEM[r2] <- r0 (2) r2 <- r2 + 4

즉, r2 레지스터 값이 100이면, 100번지에 r0 레지스터 값 0을 쓴다. 그리고 r2 레지스터 값을 4 증가 시킨다. (32비트 기준이므로.)


이상과 같이 BSS 영역의 정의와 실제 BSS 영역을 기술하는 스크립트 파일과 사용되는 예를 기술하였다.

  1. 링커 스크립트 파일은 링커에 의해 참조되며, Makefile에 의해 생성된 오브젝트 파일들을 어떻게 링크하여 커널 이미지를 생성할 방법에 대한 정보를 가지고 있다. [본문으로]
반응형
Comments