реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Что за “Reserved Address” ?, фантомный код изменяет адресс
Beginning
сообщение Dec 27 2007, 10:54
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Есть достаточна большая программа. Вся программа работает из внешнего ОЗУ. Грузится bootloaderom из внешнего ПЗУ. Вначале программы есть модуль проверяющий корректность программы. Он подсчитывает CRC всей программы (находящуюся в ОЗУ) и сверяет с заранее установленным значением. Все переменные находятся вне прошивки, и поэтому не влияют на подсчёт. В старых версиях IAR (4…) всё работало прекрасно. Но поставил версию 5.1 и на тебе, CRC всё время не совпадает. Начал копать и выкопал что, во всей прошивке меняется один адрес (4 байта), находящийся по адресу 0x34. Посмотрел ассемблерный текст, а по этому адресу такая строка:
Цитата
DCD 0 ; Reserved Address

Я нигде в программе не использую этот адрес. В настройках линкера никаких checksum не задействовано. Пытался найти, что за зараза туда лезет в дебагере, но ничего не вышло. Приходится пропускать большие аппаратно зависимые участки кода, а в месте программы, где в железе уже есть изменения этого адреса, в дебагере нет изменений. Господа, какие будут мысли?


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
Baser
сообщение Dec 27 2007, 12:58
Сообщение #2


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



ИАР может добавлять в код какие-то свои идентификаторы, пару байтов. Я когда-то на это натыкался, но посколько это ни на что не влияло, не разбирался. laughing.gif
Go to the top of the page
 
+Quote Post
Beginning
сообщение Dec 27 2007, 13:26
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Цитата
но посколько это ни на что не влияло

Да в моём случае это влияет на подсчёт CRC. Прикол в том, что если я по этому адрессу размещу данные, то они затираются!


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
vmp
сообщение Dec 27 2007, 14:43
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



А это случайно не контрольная сумма для LPCxxxx?
Go to the top of the page
 
+Quote Post
KRS
сообщение Dec 28 2007, 07:22
Сообщение #5


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(vmp @ Dec 27 2007, 17:43) *
А это случайно не контрольная сумма для LPCxxxx?

Нет.
В LPC контрольная сумма, находится по адресу 0x14. Кроме того IAR в выходной файл эту сумму не сохраняет, это делает загрузчик при прошивке флеша.
Go to the top of the page
 
+Quote Post
Beginning
сообщение Dec 28 2007, 08:20
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Процессор SHARP LH525. Вообще странное явление. Анализировл эту переменную, так при старте программы(несколько функций после main), она меняест своё значение, покрайней мере 2 раза. А если бы прога не из RAM, а из flash выполнялась, тогда что?


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Dec 28 2007, 14:50
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



icf в студию. И раз уж отладxиком залезли, то не вижу проблем в локализации команды, модифицирующей память. Именно память, а не переменную, так как линкер никогда в .intvec переменную не поместит.
Go to the top of the page
 
+Quote Post
Beginning
сообщение Dec 28 2007, 16:02
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x0;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x44;
define symbol __ICFEDIT_region_ROM_end__ = 0xFFFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x100000;
define symbol __ICFEDIT_region_RAM_end__ = 0x900000;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x1000;
define symbol __ICFEDIT_size_svcstack__ = 0x100;
define symbol __ICFEDIT_size_irqstack__ = 0x400;
define symbol __ICFEDIT_size_fiqstack__ = 0x400;
define symbol __ICFEDIT_size_undstack__ = 0x100;
define symbol __ICFEDIT_size_abtstack__ = 0x100;
define symbol __ICFEDIT_size_heap__ = 0x8000;
/**** End of ICF editor section. ###ICF###*/


define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];

define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { };
define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { };
define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { };
define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { };
define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { };
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };

initialize by copy { readwrite };
do not initialize { section .noinit };

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

place in ROM_region { readonly };
place in RAM_region { readwrite,
block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK,
block UND_STACK, block ABT_STACK, block HEAP} ;

Ну я мог бы ещё предположить, что это пользовательский код (т.е. мой) изменяет этот адрес. Но я никогда не пользовался этим адресом. Насторожило и то, что по этому адресу, IAR-овский коментарий "Reservid adres".


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Dec 28 2007, 17:51
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



"Reservid adres" как раз понятно почему. Если откроешь стартап с таблицей векторов прерываний, то увидишь, что между Data abort и IRQ нет одного вектора, а это как раз 0x34. В icf вроде все в порядке. Кроме как поймать в отладчике вариантов не вижу. Чудес не бывает. Если до main память дошла неизмененная, то дальше только косяки программы. Кстати, не совсем понятно зачем программа проверяет свою цнлостность? Разве это не дело загрузчика? Хотя это и не отменяет поиск барабашки!
Go to the top of the page
 
+Quote Post
KRS
сообщение Dec 29 2007, 10:09
Сообщение #10


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(VladislavS @ Dec 28 2007, 20:51) *
между Data abort и IRQ нет одного вектора, а это как раз 0x34

Только адрес у него, не 0x34, а 0x14
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Dec 29 2007, 11:02
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(KRS @ Dec 29 2007, 13:09) *
Только адрес у него, не 0x34, а 0x14


Ну да, вы правы. Вектор действительно 0x14. По нему команда ldr pc,[pc,#24], а по адресу 0x34 собственно адрес функции-обработчика. Так IAR-вский стартап устроен. Я как раз это и подразумевал - не думал, что надо разжевывать очевидное.
Go to the top of the page
 
+Quote Post
KRS
сообщение Dec 29 2007, 14:02
Сообщение #12


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(VladislavS @ Dec 29 2007, 14:02) *
Ну да, вы правы. Вектор действительно 0x14. По нему команда ldr pc,[pc,#24], а по адресу 0x34 собственно адрес функции-обработчика. Так IAR-вский стартап устроен.

Как раз в IAR стартапе, этот адрес пропущен! что видно в исходниках от 5.xx

Код
        SECTION .intvec:CODE:NOROOT(2)

        PUBLIC  __vector
        PUBLIC  __vector_0x14
        PUBLIC  __iar_program_start
        EXTERN  Undefined_Handler
        EXTERN  SWI_Handler
        EXTERN  Prefetch_Handler
        EXTERN  Abort_Handler
        EXTERN  IRQ_Handler
        EXTERN  FIQ_Handler

        ARM
__vector:
       ; All default exception handlers (except reset) are
       ; defined as weak symbol definitions.
       ; If a handler is defined by the application it will take precedence.
        LDR     PC,Reset_Addr          ; Reset
        LDR     PC,Undefined_Addr      ; Undefined instructions
        LDR     PC,SWI_Addr            ; Software interrupt (SWI/SVC)
        LDR     PC,Prefetch_Addr       ; Prefetch abort
        LDR     PC,Abort_Addr          ; Data abort
__vector_0x14:
        DCD     0                      ; RESERVED
        LDR     PC,IRQ_Addr            ; IRQ
        LDR     PC,FIQ_Addr            ; FIQ

Reset_Addr:     DCD   __iar_program_start
Undefined_Addr: DCD   Undefined_Handler
SWI_Addr:       DCD   SWI_Handler
Prefetch_Addr:  DCD   Prefetch_Handler
Abort_Addr:     DCD   Abort_Handler
IRQ_Addr:       DCD   IRQ_Handler
FIQ_Addr:       DCD   FIQ_Handler
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Dec 30 2007, 16:26
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(KRS @ Dec 29 2007, 17:02) *
Как раз в IAR стартапе, этот адрес пропущен! что видно в исходниках от 5.xx


Чего? Кто пропущен? А по какому адресу в вашем примере будет IRQ_Addr: DCD IRQ_Handler ?

В примерах из состава IAR 5.11 этих стартапов больше сотни. Все немного разные. Вы какой-то нетипичный нашли. Вот другой пример:

Код
        SECTION .intvec:CODE:NOROOT(2)
        PUBLIC  __vector
        PUBLIC  __iar_program_start
        EXTERN  AT91F_IRQ_HANDLER

        ARM
__vector:
        ldr  pc,[pc,#+24]            ;; Reset
__und_handler:
        ldr  pc,[pc,#+24]            ;; Undefined instructions
__swi_handler:
        ldr  pc,[pc,#+24]            ;; Software interrupt (SWI/SVC)
__prefetch_handler:
        ldr  pc,[pc,#+24]            ;; Prefetch abort
__data_handler:
        ldr  pc,[pc,#+24]            ;; Data abort
        DC32  0xFFFFFFFF             ;; RESERVED
__irq_handler:
        ldr  pc,[pc,#+24]            ;; IRQ
__fiq_handler:
        ldr  pc,[pc,#+24]            ;; FIQ

        DC32  __iar_program_start
        DC32  __und_handler
        DC32  __swi_handler
        DC32  __prefetch_handler
        DC32  __data_handler
        B .
        DC32  AT91F_IRQ_HANDLER
        DC32  __fiq_handler
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 15:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.015 секунд с 7
ELECTRONIX ©2004-2016