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

 
 
> адреса не выделенной памяти
RLC
сообщение Jan 15 2015, 07:39
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 19-11-14
Из: СПб
Пользователь №: 83 740



Использую NIOS II econom. При отладке в дебагере замечаю что сохранения данных регистров(r2,r3,ra...) просходит по адресам в памяти которые не выделял. Язык программирования "С".

То есть происходит вход в функцию и выпоняетя команда сохранения адреса возврата(stw ra,24(sp)). А SP равен 0xee4bf4c8. При этом адресное пространство RAM у меня 0x800020-0x80A000. При этом в одной и той же функции иногда сохранение происходит(адреса в котором сохраняется и не сохраняется состояние регистров разное, 0xee4bf4c8 и 0xee4c4888 ) а иногда не происходит. и при выходе из функции регитр ra(возврата из функции) равен 0, что при выполнении ret вызывает перезагрузку процесора.
Вопроса 3:
что за адреса?(предполагаю что кэш процессора)
Почему не всегда происходит сохранение?
Что с этим делать?=)

Сообщение отредактировал RLC - Jan 15 2015, 07:41
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
WitFed
сообщение Jan 16 2015, 11:49
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 271
Регистрация: 6-12-11
Из: Taganrog
Пользователь №: 68 701



У Альтеры запись в "мусорные" недопустимые адреса обычно проходит, ничего не вешая.
И чтение из них возвращает -1. Хотя лучше бы всё падало при самом первом глюке, без их наслоения.
А в С нет понятия "массив переменной длины", автоматические переменные массивов в стеке нужно объявлять на максимально возможную константную длину данных, ну или из кучи выделять динамически, если это значение неизвестно.
Очень похоже, что был "заступ" по записи за массив, а в стеке выше локальных переменных и входных параметров вообще много чего интересного сохраняется, в том числе и адреса возвратов из функций, сами значения SP после возврата -- лучше их не трогать, ибо при выходе из функции и восстановлении системных регистров может случиться, что угодно.
Go to the top of the page
 
+Quote Post
RLC
сообщение Jan 16 2015, 12:44
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 19-11-14
Из: СПб
Пользователь №: 83 740



Цитата(WitFed @ Jan 16 2015, 14:49) *
У Альтеры запись в "мусорные" недопустимые адреса обычно проходит, ничего не вешая.
И чтение из них возвращает -1. Хотя лучше бы всё падало при самом первом глюке, без их наслоения.
А в С нет понятия "массив переменной длины", автоматические переменные массивов в стеке нужно объявлять на максимально возможную константную длину данных, ну или из кучи выделять динамически, если это значение неизвестно.
Очень похоже, что был "заступ" по записи за массив, а в стеке выше локальных переменных и входных параметров вообще много чего интересного сохраняется, в том числе и адреса возвратов из функций, сами значения SP после возврата -- лучше их не трогать, ибо при выходе из функции и восстановлении системных регистров может случиться, что угодно.

Ну вот я в отладчике в оочию наблюдал что сохранение в ячейке с адресом 0x55CE FF34 проходит успешно(через Memory Map смотрел), а вот адреное пространств всего лишь от 0x80 0020-0x80 A000. И из этого сумашедшего адреса данные востанавливались успешно! Вот это мне и интересно. а собственно куда сохраняется? Ну а через несколько проходов с такими адресами "вдруг" переставало сохранятся туда. тоесть вроде как команда выполнена, а реально содержимое ячейки как было 0, так и осталось. И с неё содержимое читается как 0 кстати.
У меня было так: вход в функцию и в ней объяляется этот массив. Функция универсальная и разумный объём массива будет только в одном из нескольких случаев(собственно он в этом случае и нужен был). В остальных случаях размерность массива больше может получиться чем объём физически доступной памяти(собственно от 0 до 2^32). Сейчас я в нужном случае вызываю ещё одну функцию в котором и создаётся используемый массив объёмом равным аргумента функции. Тоесть массив выделяется статически, но тогда когда известен размер.
И вот сейчас я задумался что по факту я каждый раз я создаю, но очистки то не происходит! может мне тогда malloc'ом пользоватья и в конце free делать. Тут же сборки мусора не происходит. Или можно free использовать просто от ссылки на массив который статически выделен. Или функция завершается, ссылку на массив теряется (тк он локальный) и можно забыть про очистку... что то я совсем задумался wacko.gif
Go to the top of the page
 
+Quote Post



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

 


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


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