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];
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:stack = new unsigned[stackSize];
stack = new unsigned[stackSize];
context->j_sp = stackSize-1;
context->j_ss = FP_SEG(stack);
Code:
context->j_cs = FP_SEG(threadFunction);
context->j_ip = FP_OFF(threadFunction);
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
♪♫♪
Oh goody... it's my Illudium PU-36 Explosive Space Modulator!
Softversko Inženjerstvo
♪♫♪