Перейти к содержанию
    

Считывание кейлом старт прошивки и ее длину

22 минуты назад, Метценгерштейн сказал:

Не размера только, а ее КС. Я КС добавляю руками, уже к готовому .bin файлу прошивки. Т.о. всегда после самой прошивки

И размера, и КС. Я кладу в неиспользуемые вектора, либо после таблицы векторов (в разных проектах исторически по-разному).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, aaarrr said:

Не разместилось ли что аккурат по тому адресу, где ожидалась добавленная вручную КС.

image.thumb.png.278da6e7bea639267c1bf38f4c894b1e.png

при том, что я имею прошивку, где конец ее до 0x0001E194. Т.е. 0x0001E193- полседний байт прошивки. Со 0x0001E194 добавляю руками КС. А по мапу получается, что-то дописывает ко мне и перетирает?

2 minutes ago, Arlleex said:

И размера, и КС. Я кладу в неиспользуемые вектора, либо после таблицы векторов (в разных проектах исторически по-разному).

Получается, моя задача- стандартная- много когда нужна КС прошивки?

а вектора эти- они не участвуют в теле прошивки? Т.е. при подсчете КС, не будут посчитаны?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, Метценгерштейн сказал:

а вектора эти- они не участвуют в теле прошивки? Т.е. при подсчете КС, не будут посчитаны?

Ну Вы же сами пишете программу - все от Вас только и зависит.

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

В МК загрузчик знает адреса размера прошивки и контрольной суммы и делает все наоборот: читает размер, проходится по всей прошивке кроме контрольной суммы, контрольную сумму добавляет в конце и должен получиться 0.

Ведь никто не мешает КС проверять не единым блоком, а разбитым на несколько отдельных участков памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Метценгерштейн said:

А по мапу получается, что-то дописывает ко мне и перетирает?

Перетирает.

 

1 hour ago, Метценгерштейн said:

а вектора эти- они не участвуют в теле прошивки? Т.е. при подсчете КС, не будут посчитаны?

Участвуют. План такой:

- Резервируете поле в известном месте прошивки (не обязательно в векторах, просто так удобнее), пишете в него 0

- Считаете CRC прошивки, заменяете 0 на результат

В прошивке считаете CRC подряд, убеждаетесь, что на выходе результат 0

В прошивке считаете CRC с нулевым содержимого поля, сравниваете с реальным.

Изменено пользователем aaarrr

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, aaarrr said:

Перетирает.

 

Участвуют. План такой:

- Резервируете поле в известном месте прошивки (не обязательно в векторах, просто так удобнее), пишете в него 0

- Считаете CRC прошивки, заменяете 0 на результат

В прошивке считаете CRC подряд, убеждаетесь, что на выходе результат 0

Картина начинает вырисовываться. Только мне не CRC надо, а хэш. Там один бит поменял, хэш совсем другой.

А коллега выше постом что говорит? Вот не могу его мысль уловить как сделать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, aaarrr сказал:

План такой:

Единым блоком считать КС не получится так. Особенно, если в качестве алгоритма взят CRC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Алгоритм- хэш сумма. Не важно, MD5 или что. Там блоками не считают. Сразу всё. И посчитать надо как-то без самого вкрапления в прошивку этой суммы- исказит результат 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 минут назад, Метценгерштейн сказал:

А коллега выше постом что говорит? Вот не могу его мысль уловить как сделать.

Коллега имел в виду вот что

image.thumb.png.ee4d403769b047cd44731d7f8980ac2a.png

Вот Вы скомпилировали свой hex-файл прошивки. В ней так или иначе предусмотрели 2 служебных поля (пока что пустых): Application Size и CRC32.

1. Дальше сторонней утилитой открываете бинарник и записываете в App Size размер файла прошивки (он же размер образа, лежащего во Flash МК потом).

2. Дальше считаете КС от начала до App Size включительно.

3. Дальше считаете КС до конца файла, исключая App CRC32. Полученную КС кладете в App CRC32 и сохраняете бинарник.

Теперь при старте МК выполняет штатную процедуру загрузки. МК читает App Size, и точно так же как программа подготовки бинарника считает КС. Сверяет с записанной. Совпало - ок, нет - образ записан криво.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо. А если усложнить тем, что моя КС- это 32 байта? Тут как поступить?

Еще раз, мне не CRC32 надо. Мне хэш всего и сразу. Его нельзя по кускам посчитать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, Метценгерштейн сказал:

Спасибо. А если усложнить тем, что моя КС- это 32 байта? Тут как поступить?

А разница? Хоть 100 байт, если места хватит. Насчет блочных хэшей - тоже не вижу проблемы, т.к. блок добивается нулями как на стороне программы подготовки бинарника, так и на стороне МК при "распаковке".

2 минуты назад, Метценгерштейн сказал:

Его нельзя по кускам посчитать.

Можно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все равно еще не улавливаю мысли как сделать.

есть прошивка от 0 до 0x0001E194

B хэш я считаю именно ее, без таблицы векторов и прочего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда задача не решаема. Ибо Вы пытаетесь считать хэш двух разных прошивок - одной с еще неизвестным хэшем, другую - с известным и записанным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Думаем. Решаема. 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

56 minutes ago, Arlleex said:

Единым блоком считать КС не получится так. Особенно, если в качестве алгоритма взят CRC.

Вы правы, посмотрел сейчас - у меня в конце CRC дописывается, поэтому 0. А внутри только длина и номер сборки.

 

15 minutes ago, Метценгерштейн said:

Скорее, надо считать хеш внутри самой прошивки и положить куда-то туда, где он будет вне прошивки.

Достаточно скрипт линкера поправить таким образом, чтобы в конце загрузочного региона оставалось пространство, достаточное для хранения хеша. И спокойно приклеивать его.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, aaarrr said:

Достаточно скрипт линкера поправить таким образом, чтобы в конце загрузочного региона оставалось пространство, достаточное для хранения хеша. И спокойно приклеивать его.

можно попросить раскрыть подробности?

Скрипт линкера- это .sct файл?

Тогда в коде прошивки как это будет выглядеть? Объявляю массив по адресу, что в линкере не учитывается?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...