2016-12-28 9 views
0

Я читал this tutorialзачем нужен скрипт компоновщика и код запуска?

Я мог бы следовать за руководством и запускать код. но у меня есть вопросы.

1) Зачем нам нужен как адрес загрузки, так и адрес времени выполнения. Насколько я понимаю, это потому, что мы также поставили .data во флэш; так почему мы не запускаем приложение там, но вам нужен код запуска, чтобы скопировать его в ОЗУ?

http://www.bravegnu.org/gnu-eprog/c-startup.html

2) Зачем нам нужен компоновщика сценарий и стартовый код здесь. Могу ли я не просто создать источник C, как показано ниже, и запустить его с qemu?

arm-none-eabi-gcc -nostdlib -o sum_array.elf sum_array.c 

Большое спасибо

ответ

0

1) .data раздел содержит переменные. Переменные, ну, переменные - они меняются во время выполнения. Переменные должны быть в ОЗУ, чтобы их можно было легко изменить во время выполнения. Вспышка, в отличие от ОЗУ, не всегда изменяется во время выполнения. Вспышка содержит начальные значения переменных в разделе .data. Код запуска копирует раздел .data из флэш-памяти в ОЗУ для инициализации переменных времени выполнения в ОЗУ.

2) Linker-script: Объектный код, созданный вашим компилятором, не был помещен в карту памяти микроконтроллера. Это работа компоновщика, и поэтому вам нужен сценарий компоновщика. Сценарий компоновщика вводится в компоновщик и содержит некоторые инструкции относительно местоположения и объема памяти системы.

Код запуска: ваша программа на C, начинающаяся с main, не работает в вакууме, но делает некоторые предположения об окружающей среде. Например, предполагается, что инициализированные переменные уже инициализированы до выполнения main. Код запуска необходим для установки всех вещей, которые предполагается на месте, когда выполняется main (т. Е. Среда времени выполнения). Указатель стека - это еще один пример того, что инициализируется в коде запуска, до выполнения main. И если вы используете C++, то конструкторы статических объектов вызывают из кода запуска, до выполнения main.

0

1) Зачем нам нужен как адрес загрузки, так и адрес времени выполнения.

Хотя в большинстве случаев можно запускать код из ROM с памятью, часто код будет выполняться быстрее из ОЗУ. В некоторых случаях также может быть намного больше ОЗУ, в котором ПЗУ и код приложения могут быть сжаты в ПЗУ, поэтому исполняемый код не может быть просто скопирован из ПЗУ, а также декомпрессирован, что позволяет использовать гораздо большее приложение, чем доступное ПЗУ.

В ситуациях, когда код хранится на носителях массовой памяти, не связанных с памятью, таких как флэш-память NAND, он не может быть выполнен в любом случае и должен быть загружен в оперативную память каким-то загрузчиком.

2) Для чего нужен скрипт компоновщика и код запуска. Могу ли я не просто создать источник C, как показано ниже, и запустить его с qemu?

Сценарий компоновщика определяет расположение памяти вашей цели и приложения. Поскольку этот учебник предназначен для простого программирования, для работы с ним нет ОС. Аналогично, код запуска требуется, по крайней мере, для установки начального указателя стека, инициализации статических данных и перехода к основному.На встроенной системе также необходимо инициализировать различные аппаратные средства, такие как PLL, контроллеры памяти и т. Д.

2

Ваш первый вопрос был дан в руководстве.

Когда вы загружаете программу в операционную систему, ваш раздел .data, в основном ненулевые глобалы, загружается из «двоичного» в правый смещение в памяти для вас, так что когда ваша программа запускает эти ячейки памяти, которые Представьте, что ваши переменные имеют эти значения.

unsigned int x=5; 
unsigned int y; 

Как программист на языке C вы пишете вышеуказанный код, и вы ожидаете, что x будет 5, когда вы впервые начнете использовать его? Ну, если вы загружаетесь со вспышки, голой металл, у вас нет операционной системы, чтобы скопировать это значение в баран для вас, кто-то должен это сделать. Кроме того, весь материал .data должен быть в состоянии вспышки, номер 5 должен быть где-то во вспышке, чтобы его можно было скопировать в ram. Поэтому для этого вам нужен адрес флэш-памяти и адрес ram. Два адреса для одного и того же.

И это начинает отвечать на ваш второй вопрос. Для каждой строки кода C, которую вы пишете, вы принимаете такие вещи, как, например, любая функция может вызывать любую другую функцию. Вы хотели бы иметь возможность вызывать функции да? И вы хотели бы иметь локальные переменные, и вам нужно, чтобы переменная x выше была равна 5, и вы могли бы предположить, что y будет равно нулю, хотя, к счастью, компиляторы начинают предупреждать об этом. Код запуска как минимум для общего C устанавливает указатель стека, который позволяет вам вызывать другие функции и иметь локальные переменные и имеет функции более одной или двух строк кода, он нули .bss, чтобы переменная y выше равен нулю, и он копирует значение 5 в ram, так что x готов к работе, когда выполняется запуск функции C точки входа C.

Если у вас нет операционной системы, тогда у вас должен быть код, чтобы сделать это, и да, существует много много песочниц и наборов инструментов, которые настроены для различных платформ, у которых уже есть сценарий запуска и компоновщика, чтобы вы могли просто

gcc -O myprog.elf myprog.c 

Теперь это не означает, что вы можете сделать системные вызовы без ... система ... Printf, Еореп и т.д. Но если вы загрузите один из этих компилированных инструментов это не означает, что вы не на самом деле нужны написать сценарий компоновщика или загрузчик.

Но по-прежнему ценная информация, обратите внимание, что код запуска и сценарий компоновщика необходимы для программ на базе операционной системы, это только то, что нативные компиляторы для вашей операционной системы предполагают, что вы собираетесь писать программы для этой операционной системы , и в результате они предоставляют сценарий компоновщика и код запуска в этой инструментальной цепочке.