Dynamicznie ladowany kod do ram w ARM7

Aug 25, 2009 8 Replies

Witam.



Poszukuje czegoś co pozwoli mi uzyskac prymitywną formę ładowania do pamięci kodu dynamicznego. Zakładam, że "plik" z kodem jest dostepny w postaci ciagu bajtów, posiadam rownież wystarczającą ilośc RAM (powiedzmy 3x wielkośc kodu). W zasadzie poszukuje jakiegoś relokatora który potrafi kod przenieśc poprawnie w dowolne miejsce RAM. Próbuje googlać ale jakoś nie widzę tego na ARM7. Czy taki projekcik powstał? W drugiej kolejności szukam jakiejś koncepcji wołania z tego kodu mojego API zaszytego we flash. W zasadzie nie jest mi to bardzo potrzebne i traktuje to jako ciekawostkę z ktorej moze się coś urodzi. Ma ktoś jakiś namiar na cos ciekawego w tym temacie? bardzo korci mnie aby logika sterowania byla na karcie SD a "system operacyjny" we flash.


Wystarczy wygenerować kod, który będzie relokowalny. Można go potem uruchomić w dowolnym kawałku pamięci.

Paweł

W zasadzie to połowa sukcesu, interesują mnie jeszcze "resources". Nie wiem jak ze wskaźnikami na takie dane, są rownież względne? Powiedzmy, że mam const char* foo="\33\56\0"; Wymagają relokacji czy nie?

Czy problem polega na tym, że nie wiesz jak napisać relokowalny kod ?

Paweł

Problem w tym, że nie wiem jak to poprawnie zrobić. Czy wymaga to wsparcia "systemu operacyjnego", czy też kod bedzie na dzień dobry calkowicie relokowalny: zarówno kod maszynowy jak i "wskaźniki na dane" symulowane choćby const char*. Nie mam dużych doswiadczeń w ARM i nie wiem czy np. nie pojawią się problemy przekraczania odległości względych adresów, brak możliwości skokow poza jakiś zakres, itd. Wole zapytać niż błądzić po omacku.

Sebastian Biały pisze:

W zagadnieniu tworzenia kodu relokowalnego są dwie podstawy:

- po pierwsze cały kod wykonywalny stosuje tylko względne skoki i pobrania (względem pc)

- po drugie wszystkie dostępy do danych wymagają adresu bazowego, który wcześniej (przed uruchomieniem kodu) trzeba wpisać do któregośtam rejestru; po szczegóły zapraszam do lektury dokumentacji gcc, szukaj w okolicy flagi -fpic.

Ze swojej strony proponuje zobaczyc/zajzec jak to zostalo zrobine eCosie. Paczka nazywa sie objloader (ecos/packages/services/objloader) i umozliwia zaladowanie object file z romu. (eCos mozna siaciagnac z CVS - info

formatting link
:
formatting link

cepu69 pisze:

A może w ogóle nie kombinować aż tak tylko napisać normalny loader/relokator? Struktura pliku ELF jest bardzo prosta a w praktyce kod ARM7 kompilowany przez gcc używa 3-4 typów relokacji (i dodatkowo kolejnych 2 trybu Thumb). Wtedy można pozwolić sobie na pełny luz i ładować bezpośrednio pliki ELF. Dla oszczędności miejsca/transferu mogą być np. spakowane ZIPem (gotowa biblioteka zlib).

Zwyklem byl zawsze zagladac jak to robia inni, zeby nie popelnic nadmiernych herezji;) Powyzsza implementacja jest dla systemu embbeded tak wiec jest mala i przenosna (i386/ppc/arm) tak wiec uwazam, ze jest warta uwagi.

Raczej powinno to byc oczywiste - ladujemy foo.o (object file w formacie elf). Zabawy z binarka (kod/dane bez wszelkich informacji dostarczane przez elfa) odrazu bym sobie darowal.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required