.bss
.bss컴퓨터 프로그래밍에서 블록 시작 기호(.bss 또는 bss로 약칭)는 선언되었지만 아직 값이 할당되지 않은 정적으로 할당된 변수를 포함하는 개체 파일, 실행 파일 또는 어셈블리 언어 코드의 부분이다.흔히 "bss 섹션" 또는 "bss 세그먼트"라고 부른다.
일반적으로 데이터는 없지만 bss 섹션의 길이만 객체 파일에 저장된다.프로그램 로더는 프로그램을 로드할 때 bss 섹션에 메모리를 할당한다.초기 값 데이터가 필요한 .data 또는 .rodata 섹션 대신 .bss 섹션에 값이 없는 변수를 배치함으로써 객체 파일의 크기를 줄인다.
일부 플랫폼에서는 bss 섹션의 일부 또는 전체가 0으로 초기화된다.Unix와 유사한 시스템과 Windows는 bss 섹션을 0으로 초기화하여 모든 비트 0으로 대표되는 값으로 초기화된 C와 C++ 정적으로 할당된 변수를 bss 세그먼트에 넣을 수 있다.운영체제는 bss 세그먼트를 효율적으로 구현하기 위해 주문형 제로필(zero-fill-on-demand)[1]이라는 기술을 사용할 수 있다.임베디드 소프트웨어에서 bss 세그먼트는 이전 C 런타임 시스템에 의해 0으로 초기화되는 메모리에 매핑된다.main()
입력되었다.일부 C 런타임 시스템은 bss 세그먼트의 일부가 초기화되지 않도록 허용할 수 있다. C 변수는 bss 세그먼트의 해당 부분에 명시적으로 배치되어야 한다.[2]
일부 컴퓨터 아키텍처에서 애플리케이션 바이너리 인터페이스는 "소형 데이터"를 위한 sbss 세그먼트도 지원한다.일반적으로 이러한 데이터 항목은 특정 범위의 주소에만 액세스할 수 있는 더 짧은 지침을 사용하여 액세스할 수 있다.스레드 로컬 스토리지를 지원하는 아키텍처에서는 스레드 로컬로 표시된 초기화되지 않은 정적 데이터에 tbss 섹션을 사용할 수 있다.[3]
기원
역사적으로 BSS(Block Started by Symbolic)는 UA-SAP(United Aircraft Symbolic Assembly Program)의 사이비 작업으로, 1950년대 중반 로이 너트, 월터 램쇼 등이 IBM 704용으로 개발한 조립기이다.[4][5]BSS 키워드는 나중에 IBM의 709 및 7090/94 컴퓨터용 표준 조립 업체인 FORTRAN 조립 프로그램[6](FAP)과 매크로 조립 프로그램[7](MAP)에 통합되었다.그것은 라벨(즉, 기호)을 정의하고 주어진 수의 단어에 대해 초기화되지 않은 공간의 블록을 예약했다.[8]이러한 상황에서 BSS는 다수의 개별적인 작은 데이터 위치를 개별적으로 예약하는 대신에 속기 역할을 했다.일부 조립자는 기호에 의한 블록 엔드에 대해 보완적 또는 대체 지침 BES를 지원하며, 여기서 지정된 기호는 예약된 블록의 끝에 해당한다.[9]
BSS in C
C에서 명시적 이니셜라이저 없이 정적으로 할당된 객체는 0(산술 유형의 경우) 또는 null 포인터(포인터 유형의 경우)로 초기화된다.C의 구현은 일반적으로 0 값과 null 포인터 값을 나타내며, 0 값만 0으로 구성된 비트 패턴을 사용한다(0으로 bss를 채우는 것은 C 표준에서 필요하지 않지만, .bss의 모든 변수는 C ISO 표준 9899:1999 또는 s의 섹션 6.7.8에 따라 0의 어떤 종류로 개별적으로 초기화되어야 한다).새로운 표준의 경우 6.7.9).따라서 BSS 세그먼트는 일반적으로 파일 범위(즉, 함수 외부)에서 선언된 모든 초기화되지 않은 개체(변수와 상수 모두)뿐만 아니라 초기화되지 않은 정적 로컬 변수(로 선언된 로컬 변수)도 포함한다.static
키워드); 그러나 정적 로컬 상수는 별도의 선언이 없으므로 선언 시 초기화해야 하며, 따라서 일반적으로 BSS 섹션에는 없지만 암시적으로 또는 명시적으로 0으로 초기화될 수 있다.또한 구현은 정적으로 할당된 변수와 제로 값 비트로만 구성된 값으로 초기화된 상수를 BSS 섹션에 할당할 수 있다.
C 프로그래머 겸 작가인 피터 반 데어 린덴은 "일부 사람들은 '공간을 절약하는 것이 더 좋다'고 기억하기를 좋아한다.BSS 세그먼트는 아직 값이 없는 변수만 보유하기 때문에 실제로 이러한 변수의 영상을 저장할 필요는 없다.런타임에 BSS가 요구할 크기는 오브젝트 파일에 기록되지만, BSS(데이터 세그먼트와 달리)는 오브젝트 파일의 실제 공간을 전혀 차지하지 않는다."[10]
포트란 BSS
Fortran에서는 공통 블록 변수가 이 세그먼트에 할당된다.[11]일부 컴파일러는 64비트 명령 집합의 경우 이 세그먼트에 액세스하는 지침에서 오프셋을 32비트로 제한하여 크기를 2GB 또는 4GB로 제한할 수 있다.[12][13][14]또한 Fortran은 정적 데이터를 0으로 초기화할 필요가 없다는 점에 유의하십시오.bss 세그먼트가 0으로 초기화되는 시스템에서 공통 블록 변수 및 기타 정적 데이터를 해당 세그먼트에 입력하면 0이 되는 것을 보장하지만, 이동성을 위해 프로그래머는 그것에 의존해서는 안 된다.
참고 항목
참조
- ^ McKusick, Marshall Kirk; Karels, Michael J. (1986). "A New Virtual Memory Implementation for Berkeley UNIX" (PDF). University of California, Berkeley. p. 3. CiteSeerX 10.1.1.368.432.
- ^ "Memory Sections". AVR Libc Home page.
- ^ "ELF Special Sections". Linux Standard Base PDA Specification 3.0RC1.
- ^ 네트워크 사전.하빈 프레스, 2007, 페이지 70.
- ^ MIT-IBM 704 컴퓨터의 코드화 1957년 10월, 페이지 V-10
- ^ FORTRAN ASSEMBLY PROGRAM (FAP) for the IBM 709/7090 (PDF). archive.computerhistory.org. IBM. 1961. p. 30. J28-6098-1. Retrieved 18 October 2017.
- ^ IBM 7090/7094 IBSYS Operating System Version 13 Macro Assembly Program (MAP) Language (PDF). IBM. 1963. C28-6392-4.
- ^ Timar, Ted; et al. (1996). "Unix - Frequently Asked Questions (1/7)". Question 1.3.
- ^ Free Software Foundation, Inc. "38.9. Directives". Using as: Using as, the Gnu Assembler. Archived from the original on March 19, 2014. Retrieved Feb 22, 2014.
- ^ Peter van der Linden, Expert C Programming: 딥씨 시크릿, 프렌티스 홀 1994, 페이지 141
- ^ 포트란 77은 공통 블록 변수를 어떻게 할당하는가?
- ^ "IBM RS/6000 and PowerPC Options". Using the GNU Compiler Collection (GCC) – GCC 7.2.0.
- ^ "SPARC Options". Using the GNU Compiler Collection (GCC) – GCC 7.2.0.
- ^ "x86 Options". Using the GNU Compiler Collection (GCC) – GCC 7.2.0.
- Stevens, W. Richard (1992). Advanced Programming in the Unix Environment. Addison–Wesley. Section 7.6. ISBN 0-201-56317-7.