jcxz 184 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 2 минуты назад, Integro сказал: Кроме того нужно не забывать что приложение может быть собрано как PIC(Program Intended Code), в этом случае не нужна перелинковка, а загрузчик может положить его туда куда считает нужным. Что такое "Intended"? Про "indepedent" - знаю. Если Вы имели в виду всё-таки последнее, то: А откуда загрузчик узнает о том, что оно так написано? А если оно не так написано, а он его куда-то зафигачит не туда? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 8 minutes ago, jcxz said: Что такое "Intended"? Про "indepedent" - знаю. Спасибо, поправил, сложное слово, Вы так же в нем допустили ошибку :) 8 minutes ago, jcxz said: А откуда загрузчик узнает о том, что оно так написано? А если оно не так написано, а он его куда-то зафигачит не туда? Как я сказал все зависит от задачи и целей, оба подхода могут быть верными Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 14 ноября, 2018 Опубликовано 14 ноября, 2018 (изменено) · Жалоба Just now, jcxz said: А откуда загрузчик знает где у загружаемой программы находится таблица векторов? Вобщем случае она может быть и не в начале образа. И их может быть несколько разных. Всё-таки - VTOR лучше явно устанавливать в самой программе. Хм... А верно ведь. Но, как правило, в своих проектах я изначально знаю, как будет построена архитектура загрузчика и приложения, а также их взаимодействие. С другой стороны, никто не мешает после настройки в загрузчике перенастроить смещение. Тут палка о двух концах - с какой стороны не ломай, исходов будет много, и возможности разные =) Изменено 14 ноября, 2018 пользователем Arlleex Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 2 minutes ago, Arlleex said: Хм... А верно ведь. Адрес таблицы по умолчанию Вы знаете :), если приложение хочет переложить таблицу в RAM это уже проблемы приложения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 20 минут назад, jcxz сказал: А откуда загрузчик знает где у загружаемой программы находится таблица векторов? Вобщем случае она может быть и не в начале образа. И их может быть несколько разных. Всё-таки - VTOR лучше явно устанавливать в самой программе. Как и микроконтроллер, если такая хитрая прошивка будет слинкована без бутлоадера. Очевидно такие прошивки сами настроят что надо, иначе не будут работать совсем. Считать что таблица векторов в начале - размуное умолчание, которое будет работать с прошивками которые "ленятся" устанавливать vtor сами. А еще на младших кортексах нет vtor, но часто есть memremap, которым пускай рулит бутлоадер заточеный на конкретный камень. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 2 минуты назад, Integro сказал: Адрес таблицы по умолчанию Вы знаете :), если приложение хочет переложить таблицу в RAM это уже проблемы приложения. Причём тут RAM не RAM? Я говорил, что в приложении может быть несколько таблиц векторов. В образе прошивки, а не в RAM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 3 minutes ago, jcxz said: Причём тут RAM не RAM? Я говорил, что в приложении может быть несколько таблиц векторов. В образе прошивки, а не в RAM. В любом случае загрузчик знает положение ресет вектора, это и есть начало таблицы. А дальше, это уже кухня приложения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 7 минут назад, Kabdim сказал: Как и микроконтроллер, если такая хитрая прошивка будет слинкована без бутлоадера. Ещё раз повторю: Считаю, что если что-то слинковано (или ещё как-то сделано), неправильно, то правильный бутлоадер такое вообще не должен запускать или прошивать. Потому что он не может знать, что ещё внутри программы завязано на адреса, и попытавшись что-то скорректировать по своему разумению, приведёт к зависанию устройства или превращению его в кирпич. Бутлоадер должен принимать только заранее предусмотренные форматы прошивок, жёстко проверять их и отвергать все, хоть чем-то неподходящие. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 2 minutes ago, jcxz said: Ещё раз повторю: Считаю, что если что слинковано или ещё как-то сделано, неправильно, то правильный бутлоадер такое вообще не должен запускать или прошивать. Потому что он не может знать, что ещё внутри программы завязано на адреса, и попытавшись что-то скорректировать по своему разумению, приведёт к зависанию устройства или превращению его в кирпич. Бутлоадер должен принимать только заранее предусмотренные форматы прошивок, жёстко проверять их и отвергать все, хоть чем-то неподходящие. Из хотя из это логики, бутлодер должен найти в коде приложения инcтрукцию установки верного VTOR? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 12 минут назад, Integro сказал: В любом случае загрузчик знает положение ресет вектора, это и есть начало таблицы. А дальше, это уже кухня приложения. У меня есть прошивки, где в начале лежит таблица своего формата. По которой загрузчик проверяет прошивку. И адрес старта указан в этой таблице. А приложение может быть вообще скомпилировано для работы в ОЗУ, и адрес старта указывать на точку сразу после таблицы. В этой точке находится небольшой код (он как раз - position independent), который просто копирует образ в ОЗУ. А таблица векторов находится где-то внутри образа, по такому адресу который будет выровнен на 256 после копирования в ОЗУ, но не выровнен в образе. 8 минут назад, Integro сказал: Из хотя из это логики, бутлодер должен найти в коде приложения инcтрукцию установки верного VTOR? Нет. Только точку старта. В общем случае конечно может быть таблица в начале и он может оттуда читать адрес старта, но не обязательно. К тому же при такой компоновке бывают проблемы с генерацией CRC32 для всего образа прошивки для некоторых МК в IAR: для МК LPC невозможно охватить CRC начальную часть таблицы векторов находящейся в начале образа - CRC не сходится никак. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 22 minutes ago, jcxz said: У меня есть прошивки, где в начале лежит таблица своего формата. По которой загрузчик проверяет прошивку. И адрес старта указан в этой таблице. А приложение может быть вообще скомпилировано для работы в ОЗУ, и адрес старта указывать на точку сразу после таблицы. В этой точке находится небольшой код (он как раз - position independent), который просто копирует образ в ОЗУ. А таблица векторов находится где-то внутри образа, по такому адресу который будет выровнен на 256 после копирования в ОЗУ, но не выровнен в образе. Вот, о чем я и говорю!) Все зависит от целей и задачи! Для вашего примера кто-то мог реализовать распаковку приложения в ОЗУ из самого приложения(в этом случае система могла быть еще гибче), вы же это сделали в загрузчике. В любом случае, сразу после входа в main Вы уверены в том что стек настроен, и вектор таблицы смотрит на вашу дефолтную таблицу (на ту где лежит ресет вектор). И было бы любезно :) с точки зрения бутлодера подготовить систему к такому состоянию. Вас ведь не смущает что загрузчик устанавливает стек поинтер? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 7 минут назад, Integro сказал: В любом случае, сразу после входа в main Вы уверены в том что стек настроен, и вектор таблицы смотрит на вашу дефолтную таблицу (на ту где лежит ресет вектор). И было бы любезно :) с точки зрения бутлодера подготовить систему к такому состоянию. Вообще-то программа начинается задолго до main(). И VTOR у меня устанавливается задолго до main(). Цитата Вас ведь не смущает что загрузчик устанавливает стек поинтер? Причём тут? загрузчик и основная программа многократно устанавливают оба SP. И SP у меня также устанавливается в самой запускаемой программе в самом её начале. Можно конечно его и в бутлоадере установить, но необязательно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 1 hour ago, jcxz said: Что такое "Intended"? Про "indepedent" - знаю. Если Вы имели в виду всё-таки последнее, то: Лингвисты, хех. Вообще-то "position-independent code" :-))) И вообще, не путайте ТС, он и сам легко запутается :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 1 час назад, jcxz сказал: Нет. Только точку старта. В общем случае конечно может быть таблица в начале и он может оттуда читать адрес старта, но не обязательно. Ну хорошо начнем с истоков, в какой таблице по референс мануалу арма лежит адрес точки старта? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 8 минут назад, Kabdim сказал: Ну хорошо начнем с истоков, в какой таблице по референс мануалу арма лежит адрес точки старта? Точки старта чего? И при чём ту референс мануал ARM? Прочитайте мои сообщения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться