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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM32 Cortex-M4 - ремап адресов для внешней программы, Как? И стоит ли вообще?
VHEMaster
сообщение Dec 25 2015, 06:16
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 28-08-15
Пользователь №: 88 191



И снова, доброго времени суток! Просто запустить внешнюю программу из под SDRAM мне оказалось мало.
Есть адрес SDRAM: 0x8000 0000 - 0x807F FFFF
И есть адрес внутренней флешки со всем нужным API (типа BIOS): 0x0800 0000 - 0x081F FFFF

Собственно, внешней ОЗУ много, и камень STM32F429 весьма серьёзен, хотелось бы сделать многозадачную ОС на RTOS с поддержкой запуска внешних приложений. Проблема следующая:
Как сделать ремап адресов в этой внешней программе?
Допустим, есть виртуальная память, которая ремапится следующим образом:
0x0000 0000 - 0x000F FFFF в 0x8000 0000 - 0x800F FFFF- память программ
0x0010 0000 - 0x001F FFFF в 0x8010 0000 - 0x801F FFFF - оперативная память данной программы

Да, понятно, что нужно прописать нечто вроде следующего:
if ((Address >= 0x00000) && (Address <= 0xFFFFF))
STM32Address = 0x80000000 + (Address - 0x00000);


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

"Вообще, зачем нужен конкретный ремап? Почему бы в линкере не сделать нужные адреса самостоятельно?"
Проблема в том, что одна и та же программа может быть запущена несколько раз. Калькулятор, на худой пример. Ну или данное адресное пространство уже может быть занято другой программой.

Вот как сделать так, чтобы можно было сделать этакое "виртуальное адресное пространство?"

Ну и задача... Использую CooCox CoIDE и GCC компилятор.

Сообщение отредактировал VHEMaster - Dec 25 2015, 06:19
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 25 2015, 06:46
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(VHEMaster @ Dec 25 2015, 09:16) *
Вот как сделать так, чтобы можно было сделать этакое "виртуальное адресное пространство?"

Никак. Для этого есть процессоры, которые это умеют.
Между прочим, некоторые компиляторы умеют генерить PIC (position-independent code). То есть такой код, который может выполняться из любых адресов.
Go to the top of the page
 
+Quote Post
VHEMaster
сообщение Dec 25 2015, 06:59
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 28-08-15
Пользователь №: 88 191



Цитата(scifi @ Dec 25 2015, 08:46) *
некоторые компиляторы умеют генерить PIC (position-independent code).

А умеет ли его GCC?..
Go to the top of the page
 
+Quote Post
mantech
сообщение Dec 25 2015, 07:26
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(VHEMaster @ Dec 25 2015, 09:16) *
Вот как сделать так, чтобы можно было сделать этакое "виртуальное адресное пространство?"


Нужен контроллер с MMU, в нем есть режимы виртуальной адресации, защиты и автоматической трансляции адресов.

Сообщение отредактировал mantech - Dec 25 2015, 07:27
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 25 2015, 07:28
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(VHEMaster @ Dec 25 2015, 09:59) *
А умеет ли его GCC?..

Гугл говорит, что умеет.
Кстати, есть ещё один вариант: генерить перемещаемый ELF. При этом нужно сделать загрузчик, который сможет загружать этот ELF в память по требуемым адресам.
Go to the top of the page
 
+Quote Post
VHEMaster
сообщение Dec 25 2015, 07:31
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 28-08-15
Пользователь №: 88 191



Цитата(scifi @ Dec 25 2015, 09:28) *
Кстати, есть ещё один вариант: генерить перемещаемый ELF. При этом нужно сделать загрузчик, который сможет загружать этот ELF в память по требуемым адресам.

Как это сделать, подскажите, пожалуйста?) *.elf файл при компиляции создаётся.
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 25 2015, 07:55
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(VHEMaster @ Dec 25 2015, 10:31) *
Как это сделать, подскажите, пожалуйста?

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

Цитата(VHEMaster @ Dec 25 2015, 10:31) *
*.elf файл при компиляции создаётся.

Ну и что? Это же не тот эльф, который вам нужен. Короче, копайте в этом направлении.
Go to the top of the page
 
+Quote Post
VHEMaster
сообщение Dec 25 2015, 07:59
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 28-08-15
Пользователь №: 88 191



Цитата(scifi @ Dec 25 2015, 09:55) *
Ну и что? Это же не тот эльф, который вам нужен. Короче, копайте в этом направлении.

Окей, погуглю. А почему не тот?
Go to the top of the page
 
+Quote Post
Uuftc
сообщение Dec 25 2015, 16:10
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 3-10-04
Из: Кукуево-Дальнее
Пользователь №: 767



Цитата(VHEMaster @ Dec 25 2015, 10:59) *
Окей, погуглю. А почему не тот?

MMU умеет транслировать адреса в адресное пространство процесса.
В нашем случае MMU нет, но это не проблема - посмотрите в сторону, как грузятся динамические либы (.dll, .so) - загрузчик работает примерно так:
* загружает либу в RAM
* смотрит в специальную секцию в либе, где указаны адреса, которые надо поправить (прямые обращения к памяти, прямые переходы и пр.), далее правит их в RAM исходя из начального адреса, по которому загружен модуль.
Вам все равно надо будет определиться с загрузчиком, который будет грузить программы. С него и начните. Еще можно почерпнуть вдохновение http://www.uclinux.org/
Go to the top of the page
 
+Quote Post
mantech
сообщение Dec 25 2015, 19:27
Сообщение #10


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(Uuftc @ Dec 25 2015, 19:10) *
* смотрит в специальную секцию в либе, где указаны адреса, которые надо поправить (прямые обращения к памяти, прямые переходы и пр.), далее правит их в RAM исходя из начального адреса, по которому загружен модуль.


Это довольно сложные программы, по сути дизассемблер своего рода...
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Dec 25 2015, 19:49
Сообщение #11


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Загрузчикам нет необходимости что-то дизассемблировать, списки настраиваемых адресов присутствуют в исполняемом файле.
Go to the top of the page
 
+Quote Post
mantech
сообщение Dec 25 2015, 20:25
Сообщение #12


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(Genadi Zawidowski @ Dec 25 2015, 22:49) *
Загрузчикам нет необходимости что-то дизассемблировать, списки настраиваемых адресов присутствуют в исполняемом файле.


Распишите алгоритм кратенько, тоже интересно rolleyes.gif
Go to the top of the page
 
+Quote Post
Uuftc
сообщение Dec 26 2015, 01:39
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 3-10-04
Из: Кукуево-Дальнее
Пользователь №: 767



Цитата(mantech @ Dec 25 2015, 23:25) *
Распишите алгоритм кратенько, тоже интересно rolleyes.gif

Кратенько здесь
Патчится код, загруженный в RAM. новое значение = старое + смещение, по которому загружен модуль.
Список чего патчить готовит компилятор.
Подробнее - гуглить "Relocation code". Можно начать с Wiki

Удачного хака!
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 26 2015, 06:29
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Вот тут обсуждение загрузчика ELF для STM32. Товарищ утверждает, что адаптировал загрузчик под Cortex-M и сконфигурировал gcc так, чтобы он выдавал ему правильный ELF. Код загрузчика здесь.
Go to the top of the page
 
+Quote Post
mantech
сообщение Dec 26 2015, 09:43
Сообщение #15


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(scifi @ Dec 26 2015, 09:29) *
сконфигурировал gcc так, чтобы он выдавал ему правильный ELF.


Жаль, что не ИАР crying.gif
Go to the top of the page
 
+Quote Post

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

 


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


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