.bss 세그먼트가 필요한 이유는?
내가 아는 것은 지구적 변수와 정적인 변수는 그 안에 저장되어 있다는 것이다..data
세그먼트 및 초기화되지 않은 데이터는.bss
가 이해할수 왜되지 않은 내가 이해할 수 없는 것은 왜 우리는 초기화되지 않은 변수에 대한 전용 세그먼트를 가지고 있는가 하는 것이다.초기화되지 않은 변수에 런타임에 할당된 값이 있는 경우 변수가 여전히 에 존재하는지 여부.bss
세그먼트만?
다음 프로그램에서는a
에 있다.data
세그먼트, 및b
에 있다.bss
세그먼트; 맞으십니까?내 이해가 틀렸다면 고쳐줘.
#include <stdio.h>
#include <stdlib.h>
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
int b[20]; /* Uninitialized, so in the .bss and will not occupy space for 20 * sizeof (int) */
int main ()
{
;
}
또한 다음 프로그램을 고려하십시오.
#include <stdio.h>
#include <stdlib.h>
int var[10]; /* Uninitialized so in .bss */
int main ()
{
var[0] = 20 /* **Initialized, where this 'var' will be ?** */
}
그 이유는 프로그램 크기를 줄이기 위해서입니다.C 프로그램은 코드와 모든 상수가 실제 ROM(플래시 메모리)에 저장되는 내장형 시스템에서 실행된다고 상상해 보십시오.이러한 시스템에서는 main()을 호출하기 전에 모든 정적 스토리지 기간 객체를 설정하기 위해 초기 "복사"를 실행해야 한다.그것은 전형적으로 다음과 같은 사이비처럼 될 것이다.
for(i=0; i<all_explicitly_initialized_objects; i++)
{
.data[i] = init_value[i];
}
memset(.bss,
0,
all_implicitly_initialized_objects);
여기서 .data 및 .bss는 RAM에 저장되지만 init_value는 ROM에 저장된다.한 부문이었다면 ROM은 0을 많이 채워 ROM 크기를 크게 늘려야 했다.
RAM 기반 실행 파일은 유사하게 작동하지만, 물론 진정한 ROM은 없다.
또한, memset은 매우 효율적인 인라인 어셈블러일 가능성이 높으며, 이는 스타트업의 카피다운이 더 빨리 실행될 수 있다는 것을 의미한다.
그.bss
세그먼트는 최적화다. 전체.bss
세그먼트는 실행 프로세스에서 크기를 제공하는 4바이트 또는 8바이트의 단일 숫자로 설명되지만.data
섹션은 초기화된 변수의 크기 합만큼 크다.그러므로, 더.bss
실행 파일을 더 작고 더 빨리 로드할 수 있게 한다.그렇지 않으면 변수는 다음 단계에 있을 수 있다..data
명시적 초기화가 0인 세그먼트: 프로그램은 차이를 구별하기가 어려울 것이다.(세부적으로, 에 있는 물체의 주소).bss
아마도에 이다..data
세그먼트).
첫 번째 프로그램에서는a
에 있을 것이다.data
및 분할b
에 있을 것이다.bss
실행 파일의 세그먼트.일단 프로그램이 로드되면 구별은 중요하지 않게 된다.런타임에,b
차지하다20 * sizeof(int)
바이트 수
두 번째 프로그램에서는var
및 공간 및 위치 main()
그 공간을 수정하다.공교롭게도 그 공간은var
에 설명되어 있다..bss
보다 세분화하다.data
세그먼트(segment)는 프로그램 실행 시 동작 방식에는 영향을 미치지 않는다.
어셈블리 언어 단계별: Jeff Duntemann의 .data 섹션 관련 Linux 프로그래밍:
.data 섹션에는 초기화된 데이터 항목의 데이터 정의가 포함되어 있다.초기화된 데이터는 프로그램이 실행되기 전에 값을 갖는 데이터다.이 값들은 실행 파일의 일부분이다.실행 파일이 실행을 위해 메모리에 로드되면 메모리에 로드된다.
.data 섹션에 대해 기억해야 할 중요한 점은 정의한 데이터 항목이 더 초기화될수록 실행 파일이 더 커지며, 실행할 때 디스크에서 메모리로 로드하는 데 시간이 더 오래 걸린다는 점이다.
및 .bss 섹션:
모든 데이터 항목이 프로그램 실행을 시작하기 전에 값을 가질 필요는 없다.예를 들어 디스크 파일에서 데이터를 읽을 때는 데이터가 디스크에서 들어온 후 이동할 공간이 있어야 한다.이와 같은 데이터 버퍼는 프로그램의 .bss 섹션에 정의되어 있다.버퍼에 대해 바이트 수를 몇 개 남겨 두고 버퍼에 이름을 지정하지만 버퍼에 어떤 값이 있어야 하는지 말하지 않는 경우.
.data 섹션에 정의된 데이터 항목과 .bss 섹션에 정의된 데이터 항목 사이에는 중요한 차이가 있다: .data 섹션의 데이터 항목은 실행 파일의 크기에 추가된다..bss 섹션의 데이터 항목은 그렇지 않다.16,000바이트(또는 그 이상, 때로는 훨씬 더 많이)를 차지하는 버퍼를 .bss에 정의하고 실행 파일 크기에 거의 아무것도 추가하지 않을 수 있다(설명용 약 50바이트).
음, 우선, 예제의 변수들은 초기화되지 않았다; C는 그렇지 않으면 초기화되지 않은 정적 변수들이 0으로 초기화된다고 명시한다.
따라서 .bss의 이유는 로더가 디스크에서 데이터를 복사하는 대신 0의 뭉치를 할당할 수 있기 때문에 더 작은 실행 파일을 가지고 공간을 절약하고 프로그램을 더 빨리 로드할 수 있기 때문이다.
프로그램을 실행할 때 프로그램 로더는 .data와 .bss를 메모리에 로드한다.따라서 .data 또는 .bss에 상주하는 객체에 쓰기는 메모리로만 이동하며, 디스크의 바이너리로 플러시되지 않는다.
시스템 V ABI 4.1(1997) (AKA ELF 사양)에도 다음과 같은 답이 포함되어 있다.
.bss
이 섹션은 프로그램의 메모리 이미지에 기여하는 초기화되지 않은 데이터를 보관한다.정의에 따르면, 시스템은 프로그램이 실행되기 시작할 때 데이터를 0으로 초기화한다.섹션이 파일 공간을 차지하지 않음(섹션 유형으로 표시됨)SHT_NOBITS
.
섹션 이름이.bss
예약되어 있고 특수 효과가 있으며, 특히 파일 공간을 차지하지 않으므로, 이점에 비해 유리함.data
.
단점은 물론 모든 바이트를 다음으로 설정해야 한다는 것이다.0
OS가 더 제한적이지만 일반적인 사용 사례인 메모리에 저장한 경우, 초기화되지 않은 변수에 대해 정상 작동한다.
그SHT_NOBITS
섹션 유형 문서는 다음과 같은 내용을 반복:
sh_size
이 회원은 섹션의 크기를 바이트 단위로 제공한다.단면 유형이 다음과 같을 경우SHT_NOBITS
, 섹션이 차지하다.sh_size
파일의 바이트.타입의 한 단면SHT_NOBITS
0이 아닌 크기를 가질 수 있지만 파일의 공간을 차지하지 않는다.
C 표준은 섹션에 대해서는 아무 말도 하지 않지만, Linux에서 변수가 어디에 저장되어 있는지 쉽게 확인할 수 있다.objdump
그리고readelf
, 그리고 실제로 초기화되지 않은 지구본이 저장되어 있다고 결론짓는다..bss
. 예를 들어 다음 대답을 참조하십시오.C에서 선언되고 초기화되지 않은 변수는 어떻게 되는가?
위키백과 기사 .bss는 이 용어가 1950년대 중반(이피 내 생일;-)의 것이라는 점에서 훌륭한 역사적 설명을 제공한다.
옛날에는 모든 비트들이 소중했기 때문에, 예약된 빈 공간을 신호로 보내는 모든 방법이 유용했다.이(.bss)가 붙어버린 것이다.
.data 섹션은 비어 있지 않은 공간에 대한 것으로, 정의된 값을 입력한다.
참조URL: https://stackoverflow.com/questions/9535250/why-is-the-bss-segment-required
'programing' 카테고리의 다른 글
Vuex 작업을 여러 파일로 분할 (0) | 2022.05.05 |
---|---|
사용모멘트VueJS 3의 JS 전역 (0) | 2022.05.05 |
코드 분할이 있는 Vue/Webpack 웹 앱에서 Sass/스타일시트 파일을 부분적으로 로드하는 방법 (0) | 2022.05.05 |
v-html 지시문에 지시문을 넣을 수 있는가? (0) | 2022.05.05 |
C에서 포인터를 인쇄하는 중 (0) | 2022.05.05 |