Multitasking bez pamięci wirtualnej

0

Witam,

Zajmuję się amatorsko programowaniem mikrokontrolerów ARM.
Tworząc oprogramowanie zatrzymałem się na multitaskingu dla programów pod mój system.
Problem polega na adresowaniu skoków/danych w programach gdzie system nie umożliwia wirtualnego adresowania pamięci wynikającego z architektury niektórych mikrokontrolerów. Jedynym rozwiązaniem jakie widzę to adresowanie względne(np. miedzy daną instrukcją), lecz w niektórych przypadkach jest to niemożliwe(znowu w niektórych przypadkach architektura na to nie pozwala), albo kłopotliwe. Problemu by nie było gdyby programy uruchamiane były pod tym samym adresem w pamięci, lecz system nie posiadałby multitaskingu. Myślałem nad kopiowaniu programów(na zmianę) pod dany adres i uruchamianiu, niestety jest to procesożerne.
Podsumowując, potrzebuje uruchomić kilka programów dla mojego systemu - z multitaskingiem nie ma problemu, tylko z adresowaniem, gdyż każdy program ląduje pod innym adresem w pamięci - z braku pamięci wirtualnej.
Widziałem że niektóre osoby z tego forum zajmują się pisaniem systemów operacyjnych - może jakieś wskazówki?
Jak ten problem rozwiązać?

0

Możesz stworzyć małą maszynę wirtualną ;] JVM w zasadzie mógłby się spokojnie obejść bez pamięci wirtualnej.

Ew możliwe że sprawę załatwiłyby relokacje - są używane w plikach Portable Executable (Windows), aby można było dołączyć DLL`ki.

0

Najprościej przy uruchamianiu programu wykonać relokację. Musisz tylko wiedzieć, gdzie w programie są skoki pod adresy określone bezwzględnie i dodać tam odpowiednio adres bazowy programu.

A co do JVM na ARMie - hmm jeśli masz na myśli kostki z ARM-Jazelle, to czemu nie? ;)

0

nie znam sie na arm (na razie), ale widze 2 wyjscia.

  1. relokacja - ustawiasz przy kompilacji adresy relatywne to poczatku kodu, a po zaladowaniu do pamieci dopisujesz do nich adres pod ktory zaladowales kod. tabelka relokacji powinna byc bardzo prosta, offsety 1 po drugim i ich ilosc na poczatku.

dword ilosc
dword offset0
dword offset1
dword offset2
...

pod kazdy offsetX dodajesz image base.
offset to oczywiscie przesuniecie ADRESU (nie instrukcji) wzgledem poczatku kodu.

  1. tworzyc dynamiczny kod.
    w kodzie odwoluj sie do zmiennych przez rejestr+offset (przesuniecie od poczatku kodu). rejestr zaladuj image base'm tuz po zaladowaniu.
    metoda nieco wolniejsza od relokacji, ale za to prostsza, i bardziej kompatybilna.
    ale za to kosztuje cie 1 rejestr.

1 użytkowników online, w tym zalogowanych: 0, gości: 1