Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

8086 asm i pravljenje konteksta

[es] :: Asembler :: 8086 asm i pravljenje konteksta

[ Pregleda: 2261 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Milos Stojanovic
Belgrade

Član broj: 10343
Poruke: 1864
195.252.89.*

ICQ: 282954730
Sajt: www.sietf.org


+7 Profil

icon 8086 asm i pravljenje konteksta08.06.2006. u 14:01 - pre 217 meseci
Ukratko, zanima me kako radi pcreate_thread, tj. šta se smešta u registre pri pravljenju novog konteksta

A sad malo detaljnije:
Imam klasu Scheduler koja je zadužena za promenu konteksta, tj. drži sve ready threadove u listi i kada trenutno aktivnom threadu istekne procesorsko vreme, on vadi sledeći iz liste i skače na njegov kontekst, koristeći neki home-made longjmp.

Meni je problem sledeće: Kako generisati novi kontekst za novi thread?
Postoji struktura jmp_buf koja sadrži sve relevantne registre, iz koje longjmp učitava sve registre i smešta ih na odgovarajući način u realne registre procesora
Code:
typedef struct __jmp_buf{
    unsigned    j_ax;
    unsigned    j_bx;
    unsigned    j_cx;
    unsigned    j_dx;

    unsigned    j_sp;
    unsigned    j_ss;
    unsigned    j_flag;
    unsigned    j_cs;
    unsigned    j_ip;
    unsigned    j_bp;
    unsigned    j_di;
    unsigned    j_es;
    unsigned    j_si;
    unsigned    j_ds;
} jmp_buf[1]; 

Jasno mi je da pri kreiranju novog konteksta nije bitno koje vrednosti dodeli registrima j_ax, j_bx, j_cx, j_dx. Jasno mi je takođe da stack moram da alociram i onda postavim određene registre, recimo ovako:
Code:
    stack = new unsigned[stackSize];
    stack = new unsigned[stackSize];
    context->j_sp = stackSize-1;
    context->j_ss = FP_SEG(stack);
Dalje, treba postaviti i Program Counter na ulaznu adresu f-je koja treba da se pozove u novom threadu, to je ok, to radim ovako:
Code:

    context->j_cs = FP_SEG(threadFunction);
    context->j_ip = FP_OFF(threadFunction);

Ali moje pitanje je, šta raditi sa ostalim registrima? Da li flag registar treba da postavim na 0x0, a bp na istu vrednost koja je u sp ? I šta sa registrima di, es, si, ds?

btw, nisam bio siguran gde da postavim temu, ali mislim da je prikladnije ovde nego u C forumu.
ex. trooper
Oh goody... it's my Illudium PU-36 Explosive Space Modulator!
Softversko Inženjerstvo
♪♫♪
 
Odgovor na temu

cynique
Ivan Štambuk
Zagreb@Croatia

Član broj: 93690
Poruke: 155
193.198.17.*

ICQ: 106979934
Sajt: istambuk.blogspot.com


Profil

icon Re: 8086 asm i pravljenje konteksta13.06.2006. u 13:54 - pre 217 meseci
Nisam čuo za pcreate_thread, vjerojatno misliš na pthread_create(3T) :D

Imao sam tu sreću da nikad nisam radio na nekom live 8086 čudu (osim pod NTVDM :D), ali mislim da sve registre osim cs:ip i ss:sp možeš postaviti na bilo koju vrijednost, jer ionako kad pozivaju sw prekide se njihova vrijednost uništava, pa je za očekivati da ne bi trebali ništa pretpostavljati u njima za inicijalizacije threada.

BTW i ja radim za seminar emulator nekoliko različitih schedulera (FCFS, SJF, RR..) te implementaciju svih važnijih sinkronizacijskih primitiva (semafori, mutexi, monitori), skupa sa logiranjem svih SYN-sekvenci, mogućnošću replaya, detekcijom deadlocka...Koristim NT fibers (oni nisu preemptively scheduled od kernela, već samo kažu kad se sljedeći fiber može dispatchati) za emulaciju threadova, tako da ne trebam ručno spremati vlastiti analog win32 CONTEXT struktura pri isteku thread quantuma, nema brljanja sa hardverskim timerom..

Na windozima općenito threadovi pri kreiranju imaju sam EIP i ESP inicijaliziran na sigurne vrijednosti, te selektore na sljedeće konstante (proguglajte ih):

U Ring3:
FS = KGDT_R3_TEB
ES = DS = SS = KGDT_R3_DATA
CS = KGDT_R3_CODE

U Ring0:
FS = KGDT_R0_PCR
DS = ES = KGDT_R3_DATA
CS = KGDT_R0_CODE


Pri pozivu win32 API se očekuju nemijenjane vrijednosti ESI, EDI i EBX registara, osim za par iznimki (callback fje). Mnijem da MS-DOS nema ovakve garancije. Najbolje bi bilo da se u debuggeru igraš sa stvarnim library fjama i vidiš koje su vrijednosti u pojedinim registrima.

HTH :)
 
Odgovor na temu

[es] :: Asembler :: 8086 asm i pravljenje konteksta

[ Pregleda: 2261 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.