bss, data, text ...

5572 단어 iOS 개발
섹션 구조
SECTIONS {
...
secname start BLOCK(align) (NOLOAD) : AT ( ldadr )
  { contents } >region :phdr =fill
...
}

secname: 세그먼트 이름contents: 이 세그먼트 start: 이 세그먼트의 연결 주소 (실제 실행 주소) AT (ldadr): 저장 주소 (불러오는 주소)
//예 U-Boot.lds 코드(위의 섹션에 따르면 대체적으로 이해할 수 있지만 의심스럽다)
SECTIONS {
    . = 0x00000000;  // ???    section       ,           ??    AT      
    . = ALIGN(4);   //      4       ,???    section             
    .text      :    //      secname   
    {
        cpu/arm920t/start.o
       (.text)      //    ,   contents ,         
       *(.text)
    }
    . = ALIGN(4);   //     
    .rodata : { *(.rodata) }
    . = ALIGN(4);
    .data : { *(.data) }
    . = ALIGN(4);
    .got : { *(.got) }
    . = .;

    __u_boot_cmd_start = .;
    .u_boot_cmd : { *(.u_boot_cmd) }
    __u_boot_cmd_end = .;

    . = ALIGN(4);
    __bss_start = .;
    .bss : { *(.bss) }
    _end = .;
}

질문 1, 바이너리 파일에는 BSS 세그먼트가 포함되지 않습니다. 그럼 BSS 세그먼트를 어디에 두시겠습니까?
답: 수정에 1000개의 전역 변수가 있는데 BIN에 1000개의 0을 저장해야 하나요?링크 스크립트에서 BSS 세그먼트를 한데 묶어서 시작 주소, 끝 주소를 기록하고 위치를 다시 정한 후에 이 메모리를 0으로 정리하면 됩니다
문제2: 전역 변수를 초기화하지 않으면 기본값을 0으로 초기화하는데 왜 수동으로 0을 삭제합니까
답:왜냐하면 그것은 BSS 구간에 있기 때문이다
bs 세그먼트:
BSS 세그먼트(bsssegment)는 일반적으로 프로그램에서 초기화되지 않은 전역 변수를 저장하는 데 사용되는 메모리 영역을 가리킨다.BSS는 영어 BlockStarted by Symbol의 약칭입니다.BSS 세그먼트는 정적 메모리 할당에 속합니다.
데이터 세그먼트:
데이터 세그먼트 (datasegment) 는 일반적으로 프로그램에서 초기화된 전역 변수를 저장하는 데 사용되는 메모리 영역을 가리킨다.데이터 세그먼트는 정적 메모리 분배에 속한다.
text 세그먼트:
코드 세그먼트 (codesegment/textsegment) 는 일반적으로 프로그램이 코드를 실행하는 데 사용되는 메모리 영역을 가리킨다.이 부분의 구역 크기는 프로그램이 실행되기 전에 이미 확정되었고 메모리 구역은 보통 읽기 전용이며, 일부 구조는 코드 세그먼트를 쓰기 가능하게 하고, 즉 프로그램을 수정할 수 있도록 허용한다.코드 세그먼트에는 문자열 상수와 같은 읽기 전용 상수 변수도 포함될 수 있습니다.
rodata 세그먼트:
C의 문자열 및 #define 정의 상수를 저장합니다.
heap더미:
더미는 저장 프로세스 실행 중 동적 분배에 사용되는 메모리 세그먼트입니다. 크기가 고정되지 않고 동적 확장이나 축소가 가능합니다.프로세스가malloc 등 함수를 호출하여 메모리를 분배할 때, 새로 분배된 메모리는 동적으로 더미에 추가됩니다. (더미가 확장됨)free 등 함수를 이용하여 메모리를 방출할 때 방출된 메모리는 더미에서 제거됩니다. (더미가 축소됨)
Stack 스택:
사용자 저장 프로그램이 임시로 만든 국부 변수입니다. 즉, 우리 함수 괄호 '{}' 에서 정의한 변수입니다. (static 성명 변수는 포함되지 않지만,static는 데이터 세그먼트에 변수를 저장하는 것을 의미합니다.)이외에 함수가 호출될 때, 그 매개 변수는 호출을 시작하는 프로세스 창고에 눌려 있고, 호출이 끝난 후에 함수의 반환 값도 창고에 저장됩니다.창고의 선진적인 특징이 있기 때문에 창고는 특히 호출 현장을 보존/복원하는 데 편리하다.이런 의미에서 우리는 창고를 임시 데이터를 저장하고 교환하는 메모리 구역으로 볼 수 있다.
상수 세그먼트:
상수 세그먼트는 일반적으로 컴파일러가 생성한 데이터를 포함합니다. (사용자가 정의한 읽기 전용 데이터와 다르다.)예를 들어 하나의 문장 a=2+3 컴파일러가 2+3 컴파일러를 5로 하고 상수 5로 상수 구간에 저장한다
일반적인 상황에서 하나의 프로그램은 본질적으로bss단,data단,text단 세 가지로 구성되어 있다. 본 개념은 현재의 컴퓨터 프로그램 설계에서 매우 중요한 기본 개념이다.또한 삽입식 시스템의 디자인에서도 매우 중요하다. 삽입식 시스템이 실행될 때의 메모리 크기 분배, 메모리 단원이 차지하는 공간 크기 문제와 관련된다.
세그먼트 메모리 관리를 사용하는 구조(예를 들어 intel의 80x86 시스템)에서 bs 세그먼트(Block Started by Symbol segment)는 프로그램에서 초기화되지 않은 전역 변수를 저장하는 데 사용되는 메모리 구역을 말한다. 일반적으로 초기화할 때 bs 세그먼트 부분은 삭제된다(bss 세그먼트는 정적 메모리 분배에 속한다. 즉 프로그램이 시작하자마자 이를 삭제한다).
예를 들어 C 언어 프로그램의 컴파일링이 끝난 후에 초기화된 전역 변수가 저장됩니다.데이터 세그먼트에 초기화되지 않은 전역 변수가 저장됩니다.bs 구간에서.
text와 데이터 세그먼트는 모두 실행 가능한 파일에 있습니다. (삽입식 시스템에서는 일반적으로 이미지 파일에 고착화되어 있으며, 시스템이 실행 가능한 파일에서 불러옵니다.)bs 세그먼트는 실행 가능한 파일에 없습니다. 시스템에서 초기화됩니다.
두 개의 애플릿을 다음과 같이 컴파일합니다.
프로그램1:
int ar[30000];
void main() {
    ......
}

프로그램2:
int ar[300000] =  {1, 2, 3, 4, 5, 6 };
void main() {
    ......
}

프로그램 2를 컴파일한 후에 얻은 것을 발견했습니다.exe 파일은 프로그램 1보다 훨씬 크다.왜?
에 자리잡다,...bss 세그먼트, 다른 하나는.데이터 세그먼트의 차이점은 다음과 같습니다.
전역에 초기화되지 않은 변수가 있습니다.bss단에서 구체적으로 하나의 점위부호로 나타난다.글로벌 초기화 변수는 에 저장됩니다.데이터 세그먼트에서함수 내의 자동 변수는 모두 창고에서 공간을 분배한다.bss는 점용하지 않습니다.exe 파일 공간의 내용은 운영체제에서 초기화(삭제)한다.그러나데이터는 프로그램이 초기화해야 하기 때문에 상술한 상황을 초래했다.
참고:
bss단(수동으로 초기화되지 않은 데이터)은 이 단의 데이터에 공간을 분배하지 않고 데이터에 필요한 공간의 크기만 기록합니다.데이터 세그먼트 (수동으로 초기화된 데이터) 는 데이터 분배 공간으로 데이터는 목표 파일에 저장됩니다.DATA 세그먼트에는 초기화된 글로벌 변수와 해당 값이 포함됩니다.BSS 세그먼트 크기는 실행 가능한 파일에서 얻은 다음 링크기는 이 크기의 메모리 블록을 가져와 데이터 세그먼트 뒤에 바짝 붙인다.이 메모리 영역이 프로그램의 주소 공간에 들어간 후 모두 삭제됩니다.DATA 및 BSS 세그먼트를 포함하는 전체 세그먼트를 일반적으로 데이터 영역이라고 합니다.

좋은 웹페이지 즐겨찾기