Этот ответ с точки зрения более специализированной встроенной системы, а не более универсальной вычислительной платформы, работающей под ОС, такой как Linux.
Где указаны границы между этими разделами? Это в компиляторе или ОС?
Ни компилятор, ни ОС не делают этого. Это компоновщик, который определяет, где расположены разделы памяти. Компилятор генерирует объектные файлы из исходного кода. Компилятор использует файл сценария компоновщика для поиска объектных файлов в памяти. Файл сценария компоновщика (или директива компоновщика) является файлом, который является частью проекта, и определяет тип, размер и адрес различных типов памяти, таких как ПЗУ и ОЗУ. Программа-компоновщик использует информацию из файла сценария компоновщика, чтобы узнать, где начинается каждая память. Затем компоновщик находит каждый тип памяти из объектного файла в соответствующем разделе памяти. Например, код идет в разделе .text, который обычно находится в ПЗУ. Переменные идут в разделе .data или .bss, которые находятся в ОЗУ. Стек и куча также идут в ОЗУ. Когда компоновщик заполняет один раздел, он узнает размер этого раздела и может знать, с чего начать следующий раздел. Например, раздел .bss может начинаться там, где заканчивается раздел .data.
Размер стека и кучи может быть указан в файле сценария компоновщика или в качестве параметров проекта в среде IDE.
IDE для встроенных систем обычно при создании проекта автоматически создает общий файл сценария компоновщика. Общий файл компоновщика подходит для многих проектов, поэтому вам, возможно, никогда не придется его настраивать. Но по мере того, как вы настраиваете свое целевое оборудование и приложение, вы также обнаружите, что вам также нужно настроить файл сценария компоновщика. Например, если вы добавляете внешнее ПЗУ или ОЗУ на плату, тогда вам нужно будет добавить информацию об этой памяти в сценарий компоновщика, чтобы компоновщик знал, как найти там вещи.
Компонент может создавать файл карты, который описывает, как каждый раздел находился в памяти. Файл карты не может быть сгенерирован по умолчанию, и вам может потребоваться включить опцию сборки, если вы хотите ее просмотреть.
Как компилятор или ОС знают, какие адреса принадлежат каждому разделу?
Ну, я не считаю, что компилятор или ОС действительно знают эту информацию, по крайней мере, не в том смысле, что вы можете запросить их для получения информации. Компилятор завершил свою работу до того, как разделы памяти расположены компоновщиком, поэтому компилятор не знает эту информацию. ОС, ну, как я это объясню? Встроенное приложение может даже не использовать ОС. ОС - это всего лишь код, предоставляющий услуги для приложения. ОС не знает и не заботится о том, где находятся границы разделов памяти. Вся эта информация уже выпекается в исполняемый код к моменту запуска ОС.
Должно ли мы определить его в любом месте?
Просмотрите файл сценария компоновщика (или ссылку) и прочитайте руководство по компоновщику. Сценарий компоновщика вводится в компоновщик и обеспечивает грубые очертания памяти. Компилятор находит все в памяти и определяет степень каждого раздела.
Сам язык C не имеет ничего, что можно сказать о любом из них. –
Поскольку это помечено встроенным, этот пост [Что находится в разных типах памяти микроконтроллера?] (Http://electronics.stackexchange.com/questions/237740/what-resides-in-the-different-memory-types -о-микроконтроллер) может быть более полезным, чем говорить о оперативных системах. – Lundin