2016-12-12 1 views
2

텍스트, 데이터, 스택 및 힙과 같은 다른 메모리 세그먼트에 대해 알게되었습니다. 제 질문은 :여기서 메모리 세그먼트가 정의되어 있습니까?

1- 이러한 섹션 간의 경계가 정의되는 곳은 어디입니까? 컴파일러인가, OS인가?

2 컴파일러 나 OS가 각 섹션에 속한 주소를 아는 방법은 무엇입니까? 우리는 어디에서 그것을 정의해야합니까?

+1

C 언어 자체는 그 중 어떤 것에 대해서도 말할 것도 없습니다. –

+1

태그가 포함 된 임베디드이므로이 게시물 [마이크로 컨트롤러의 다양한 메모리 유형은 무엇입니까?] (http://electronics.stackexchange.com/questions/237740/what-resides-in-the-different-memory-types -of-a-microcontroller)는 수술 시스템에 대한 이야기보다 유용 할 수 있습니다. – Lundin

답변

4

이 답변은 Linux와 같은 OS를 실행하는보다 범용적인 컴퓨팅 플랫폼보다는 특수 목적의 임베디드 시스템이라는 관점에서 나온 것입니다.

여기서 각 섹션 간의 경계는 정의되어 있습니까? 컴파일러인가, OS인가?

컴파일러도 OS도 마찬가지입니다. 메모리 섹션의 위치를 ​​결정하는 것은 링커입니다. 컴파일러는 소스 코드에서 객체 파일을 생성합니다. 링커는 링커 스크립트 파일을 사용하여 메모리에있는 개체 파일을 찾습니다. 링커 스크립트 (또는 링커 지시문) 파일은 프로젝트의 일부인 파일로, ROM 및 RAM과 같은 다양한 메모리 유형의 유형, 크기 및 주소를 식별합니다. 링커 프로그램은 링커 스크립트 파일의 정보를 사용하여 각 메모리가 시작되는 위치를 확인합니다. 그런 다음 링커는 개체 파일의 각 유형의 메모리를 적절한 메모리 섹션에 배치합니다. 예를 들어, 코드는 대개 ROM에있는 .text 섹션에 있습니다. 변수는 RAM에있는 .data 또는 .bss 섹션에 있습니다. 스택과 힙 또한 RAM에 저장됩니다. 링커가 한 섹션을 채우면 해당 섹션의 크기를 알게되고 다음 섹션을 시작할 위치를 알 수 있습니다. 예를 들어, .bss 섹션은 .data 섹션이 끝난 곳에서 시작할 수 있습니다.

스택 및 힙 크기는 링커 스크립트 파일이나 IDE의 프로젝트 옵션으로 지정할 수 있습니다.

임베디드 시스템 용 IDE는 일반적으로 프로젝트를 만들 때 일반 링커 스크립트 파일을 자동으로 제공합니다. 제네릭 링커 파일은 많은 프로젝트에 적합하므로 사용자 정의 할 필요가 없습니다. 그러나 대상 하드웨어와 응용 프로그램을 사용자 정의 할 때 링커 스크립트 파일을 사용자 정의해야 할 수도 있습니다. 예를 들어 외부 ROM이나 RAM을 보드에 추가하면 해당 메모리에 대한 정보를 링커 스크립트에 추가해야 링커가 그곳에서 물건을 찾는 방법을 알 수 있습니다.

링커는 각 섹션이 메모리에 있었던 방식을 설명하는 맵 파일을 생성 할 수 있습니다. 기본적으로지도 파일이 생성되지 않을 수 있으며 검토하려면 빌드 옵션을 켜야 할 수 있습니다.

컴파일러 또는 운영 체제는 각 섹션에 속한 주소를 어떻게 알 수 있습니까?

글쎄, 컴파일러 나 OS가 실제로이 정보를 알고 있다고 생각하지 않습니다. 최소한 정보를 쿼리 할 수는 없습니다. 컴파일러는 정보를 알 수 없도록 링커에서 메모리 섹션을 찾기 전에 작업을 마쳤습니다. 운영 체제, 그럼 어떻게 설명할까요? 임베디드 애플리케이션은 OS를 사용하지 않을 수도 있습니다. OS는 애플리케이션에 서비스를 제공하는 코드 일뿐입니다. 운영체제는 메모리 섹션의 경계가 어디인지를 알지 못하며 상관하지 않습니다. 모든 정보는 이미 OS가 실행될 때까지 실행 가능한 코드로 구워집니다.

어디에서 정의해야합니까?

링커 스크립트 (또는 링커 지시문) 파일을보고 링커 설명서를 읽으십시오. 링커 스크립트는 링커에 입력되고 대략적인 메모리 개요를 제공합니다. 링커는 모든 것을 메모리에 저장하고 각 섹션의 범위를 결정합니다.

2

섹션은 OS와 느슨하게 연결된 형식으로 정의됩니다. 예를 들어 리눅스에서는 ELF이고, Mac OS에서는 Mach-O입니다.

99.9 %의 경우 프로그래머로 섹션을 명시 적으로 정의하지 마십시오. 컴파일러는 어디에 넣어야할지 압니다. 당신의 쿼리에 대한

4

: -이 섹션 사이의 경계가 정의

? 컴파일러인가, OS인가?

답변은 OS입니다.

.text 세그먼트 (실행 코드), 데이터 세그먼트 (변수) 및 기타 프로그램 세그먼트의 레이아웃에 대한 보편적 인 공통 주소 지정 체계가 없습니다. 그러나 프로그램 자체의 레이아웃 자체는 프로그램을 실행할 시스템 (OS)에 따라 잘 형성됩니다.

컴파일러 또는 운영 체제가 각 섹션에 속한 주소를 아는 방법은 무엇입니까? 우리는 어디에서 그것을 정의해야합니까?

나는 3 질문에 당신이 질문을 나누어 : - 텍스트 (코드)와 데이터 섹션과 제한에 대한

를?

텍스트 및 데이터는 컴파일러에서 준비합니다. 컴파일러에 대한 요구 사항은 액세스 가능한지 확인하고 주소 공간의 아래 부분에 팩을 포장하는 것입니다. 액세스 가능한 주소 공간은 하드웨어에 의해 제한됩니다 (예 : 명령 포인터 레지스터가 32 비트이면 텍스트 주소 공간은 4 GiB가됩니다.

힙 섹션 및 제한 정보 사용 가능한 총 RAM 메모리입니까?

텍스트 및 데이터 이후에 위의 영역은 힙입니다. 가상 메모리를 사용하면 힙은 사실상 최대 주소 공간에 가깝게 자랄 수 있습니다.

스택과 힙에 정적 크기 제한이 있습니까?

프로세스 주소 공간의 마지막 세그먼트가 스택입니다. 스택은 주소 공간의 끝 세그먼트를 가져 와서 끝에서 시작하여 아래로 자랍니다.

힙이 커지고 스택이 커지기 때문에 기본적으로 서로를 제한합니다. 또한 두 유형의 세그먼트 모두 쓰기가 가능하기 때문에 둘 중 하나가 경계를 넘어서는 것이 항상 위반 한 것은 아니므로 버퍼 나 스택 오버플로를 가질 수 있습니다. 이제는 일어나는 것을 막을 수있는 메커니즘이 있습니다.

각 프로세스가 시작될 힙 (스택)에 대한 제한이 있습니다. 이 제한은 런타임에 변경 될 수 있습니다 (brk()/sbrk() 사용).기본적으로 프로세스에 힙 공간이 더 필요하고 할당 된 공간이 부족하면 표준 라이브러리가 OS에 호출을 보냅니다. OS는 사용자 라이브러리가 관리 할 페이지를 할당합니다. 나는. 프로그램이 1 KiB를 원하면 OS는 추가로 4 KiB를주고 라이브러리는 프로그램에 1 KiB를주고 다음에 프로그램을 요청할 때 3 KiB를 사용하도록 남겨 둡니다.

대부분의 경우 레이아웃은 텍스트, 데이터, 힙 (자라기), 할당되지 않은 공간, 마지막으로 스택 (자랍니다)이됩니다. 그들은 모두 동일한 주소 공간을 공유합니다.

관련 문제