[ Milos Stojanovic @ 08.06.2006. 14:01 ] @
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: 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); 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. |