Adresowanie skoków względem adresu pobranego z pamięci

Jestem coraz bliżej opublikowania własnego jądra. Ponieważ czasu mało i jestem zbyt mało doświadczony w temacie, to musiałem używać wiele haków. Pierwszym jest obsługa modułów. Moduł jest ładowany przez Gruba, a system inicjalizuje go poprzez skok na początek pamięci modułu (adres jest dostarczany poprzez specjalną strukturę w pamięci utworzoną przez Gruba). By to wszystko mogło jakoś działać, to postanowiłem, że jądro, przed odwołaniem się do kodu modułu, będzie pod odpowiedni obszar w pamięci kłaść adres początku modułu. Wiem, że to nie bardzo będzie działać z wielordzeniowością i podobnymi rozwiązaniami, chyba że będę stronicować pamięć dla takich modułów, lecz to i tak wykracza na razie poza moje możliwości - dopiero się uczę programować systemy operacyjne,

Teraz jest problem - wszelkie skoki, czyli instrukcje sterujące (warunki, pętle, skok do etykiety), spowodują potrójny błąd procesora, więc reset komputera. Czy da się zmusić gcc, by generował kod, obliczający wszelkie adresy na podstawie wartości ze zmiennej pod stałym adresem?

Tak, by:

int i;
while ('\0' != *str) {
...
++str;
}

Nie powodowało restartu komputera?

Jak robisz własny system to potrzebujesz do niego odpowiedniego kompilatora, ewentualnie zapewniasz wsparcie we własnym systemie dla formatu plików wykonywalnych, dla linuxa to będzie np ELF.

GCC to tool chain, on nie generuje kodu tylko kompiluje.

Poza tym uważam, że to nie jest najlepsze miejsce na zadawanie tego typu pytań. Architektura systemów operacyjnych ich programowanie i projektowanie to bardzo trudna dziedzina dodatkowo, którą interesuje się może 1% programistów, a jeszcze mniej coś w tym temacie naprawdę umie.

2 polubienia