[OSDev] Kilka pytań raczej teoretycznych

0

Witam.
Na początku zwracam się do was panowie moderatorzy: temat jest taki bo chciałem wszystko umieścić w jednym temacie :>
Teraz mam kilka pytań:

  1. Załóżmy że mamy aplikację A pracującą w trybie ring3 kernel?a B pracującego w trybie ring0. Teraz aplikacja NIE UŻYWAJĄC przerwań, IPC musi wywołać funkcję kernel?a. Moje pytanie więc: czy wysterczy zwykły call, czy trzeba coś ambitniejszego (aplikacja zna adres funkcji)

  2. Czy jeśli mam program np:

[BITS 32]
[ORG 0]
GLOBAL _init
_init:
intc BYTE [0xb8000]
jmp _init

który jest załadowany pod losowy adres
i wykonam call'a pod adres _init to jmp _init powinno wykonać się poprawnie (krótki skok), moje pytanie: ile bajtów w pmode obejmuje krótki skok
3. Mam apliklację A (ring3) kernel'a B (ring0) i biblioteke C (ring3)
Teraz A wywułuje syscall i otrzymuje adres procedury w bibliotece i wywołuje call <adres>. Procedura w bibliotece zakończona jest retf. czy to się wykona poprawnie???

Pozdro for all :)

0
  1. Zalezy od dpl-a segmentu, jesli 3 to starczy call, jesli wyzszy to musisz zrobic callgate w gdt.

  2. Czy czasem nie chcesz zrobic programu niezaleznego od polozenia? (np biblioteki) Bo jesli tak to opcja -fPIC w GCC moze cie zainteresowac.

  3. Powinno, oczywiscie jesli ze stronicowaniem i segmentami wszystko ok.

0
Wolverine napisał(a)
  1. Czy czasem nie chcesz zrobic programu niezaleznego od polozenia? (np biblioteki) Bo jesli tak to opcja -fPIC w GCC moze cie zainteresowac.

Dokładnie chce zrobić coś ala DLL [green]

0
  1. Załóżmy że mamy aplikację A pracującą w trybie ring3 kernel?a B pracującego w trybie ring0. Teraz aplikacja NIE UŻYWAJĄC przerwań, IPC musi wywołać funkcję kernel?a. Moje pytanie więc: czy wysterczy zwykły call, czy trzeba coś ambitniejszego (aplikacja zna adres funkcji)

Oczywiście jeżeli DPL Segmentu do którego chcesz sie odwołać jest 3 to możesz to zrobić po przez daleki call, ale jest tak tylko w przypadku gdy docelowy segment kodu jest typu conforming.
Jeżeli docelowy segment kodu był by nonconforming lub conforming z DPL 0,1,2 to mysiałbyś użyć do tego bramki czyli call gate.

  1. Zalezy od dpl-a segmentu, jesli 3 to starczy call, jesli wyzszy to musisz zrobic callgate w gdt.

Wszystko OK, ale dodałbym jeszcze call gate moze być w GDT jak i LDT. Nie może być tylko w IDT.

  1. ile bajtów w pmode obejmuje krótki skok

ort! skok czyli near to jest po prostu skok wewnątrz aktualnego segmentu, jednak są 2 rozróznienia. Skok pod absolutny adres (offset) lub skok pod relatywny adres (względem obecnego EIP). Skok absolutny jest po prostu skokiem pod zadany offset podany jako parametr do instrukcji. W przypadku relatywnego skoku jest to liczba 32bitowa ze znakiem czyli można skoczyć do: adres obecny (EIP) dodać podana liczba ze znakiem. Jest to do przodu i do tyłu o 2147483648 bajtów.

  1. Mam apliklację A (ring3) kernel'a B (ring0) i biblioteke C (ring3)
    Teraz A wywułuje syscall i otrzymuje adres procedury w bibliotece i wywołuje call <adres>. Procedura w bibliotece zakończona jest retf. czy to się wykona poprawnie???

Wszystko wygląda jak należy więc powinno działać poprawnie. O ile oczywiście call jest postaci selektor:offset.

Wszystko można znaleźć w dokumentacjach ze strony intela.

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