Что делают шестнадцатеричные записи Intel типа 03 или 05 в программе iHex для ARM?

Что делают шестнадцатеричные записи Intel типа 03 или 05 в программе iHex?

Тип записи 03: Адрес начального сегмента Для процессоров 80x86 указывает начальное содержимое регистров CS:IP. Поле адреса — 0000, количество байтов — 04, первые два байта — значение CS, последние два — значение IP.

Тип записи 05: Начальный линейный адрес Поле адреса — 0000 (не используется), количество байтов — 04. Четыре байта данных представляют собой 32-битное значение, загруженное в регистр EIP ЦП 80386 и выше.

Имеют ли они смысл для программы ARM?

Всякий раз, когда я генерирую .hex для программирования встроенного ARM, окончание выглядит примерно так:

:10851400B4040020BC040020BC040020C4040020D7
:10852400C4040020CC040020CC040020D404002087
:10853400D4040020DC040020DC040020E404002037
:10854400E4040020EC040020EC040020F4040020E7
:10855400F4040020FC040020FC040020FFFFFFFFC3
:048564000000020011
:0400000508002910B6
:00000001FF

Я отредактировал приложение для программирования, чтобы игнорировать эту запись, и только сегодня коллега сообщил, что его компилятор создал запись типа 03 в предпоследней строке, что помешало программировать MPU.

Почему objcopy создает эти записи? Могу ли я запретить ему это делать?

Соответствующие строки Makefile:

 FORMAT = ihex
 OBJCOPY = arm-elf-objcopy

  %.hex: %.elf
    @echo
    @echo $(MSG_FLASH) $@
    $(OBJCOPY) -O $(FORMAT) $< $@

person SF.    schedule 10.10.2014    source источник
comment
страница ARM здесь имеет некоторую специфичную для ARM интерпретацию.   -  person unwind    schedule 10.10.2014


Ответы (1)


Имеют ли они смысл для программы ARM?

Программа ARM всегда будет иметь установленную точку входа, даже если вы предоставили векторную таблицу в чистом металлическом корпусе.

Программа arm-*-objcopy не очень интеллектуальна и просто создает запись 03, когда адрес входа находится в пределах первого мегабайта из соображений совместимости, и 05 в противном случае.

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

person Turbo J    schedule 10.10.2014
comment
Хорошо знать! Я попытался найти документацию objcopy, касающуюся этого поведения, поскольку оно также удивило меня в другой цели, аналогично поломав инструмент, когда он столкнулся с одним из этих типов. - person Jubatian; 10.05.2018