[OSy] Problem s procesy

Milan Burda milan.burda at gmail.com
Thu Dec 27 19:01:39 CET 2007


ahoj,

my sme mali tiez na zaciatku problem pri prepnuti sa do user-mode threadu.
chyba spocivala v tom, ze sme si do prvotneho context frame, ktory si dany
thread precita zo svojho stacku v switch_cpu_context (sys.S), ulozili status
register s nastavenym KSU na 10b. problem je v tom ze:

        /*
         * Restore the status register.
         */
        lw      $t0, OFFSET_STATUS($sp)
        mtc0    $t0, $status

        /*
         * Continue in what the target thread was doing
         * when it was suspended.

         */
        j       $ra
        addiu   $sp, EX_STACK_FRAME

najskor sa nastavi status register. co v user-mode znamena ze od tejto
chvile nieje
pristupny KSEG0 cez adresy 0x8000000 - 0x9FFFFFFF, lenze kod tejto
funkcie je v KSEG0
pamati. cize procesor nedokaze ani len precitat nasledujucu
instrukciu, ktorou je skok
na adresu danou RA registrom :)

da sa to riesit tak, ze sa tie instrukcie prehodia a status register
na nastavi v branch delay
slote toho jumpu....

        lw      $t0, OFFSET_STATUS($sp)
        addiu   $sp, EX_STACK_FRAME

        j       $ra
        mtc0    $t0, $status


ono ajtak sa user-mode thread najskor spusta v kernel-mode, lebo je
nutne prepnut z kernel na user stack,
cize switch_cpu_context funkcia sa nezmeni, ale ta finta s branch
delay slotom sa tak ci tak zide,
pokial sa inicializacny kod neumiestni priamo do librt prisptupneho
cez USEG, kde tento problem nenastane...

s pozdravom
Milan Burda

On Dec 27, 2007 3:20 PM, Miloslav Beno <beno at mbox.dkm.cz> wrote:
> Dobry den,
>
> pokousime se implementovat uzivatelska vlakna. Obraz programu mame umisteny
> do USEG na adrese 0x0. Stack uzivatelskeho procesu je v USEG na zacatku
> prvni stranky za obrazem programu.
>
> Vytvarime thread stejnym postupem jako kernel thread, ale vrchol zasobniku
> je v USEGu a status registr je inicializovany jako user mode. GP registr a
> RET registr ma hodnotu 0x0.
> Pri prepnuti na toto vlakno se program pokousi sahnout na adresu 0xffffff74.
>
> Pokud status registr inicializujeme na kernel mode a stack adresujeme v
> KSEG0, vse bezi bez problemu. Nevime jestli na neco nezapominame. Budeme
> radi za jakykoliv hint.
>
> Dekujeme.
>
>
> _______________________________________________
> OSy mailing list
> OSy at dsrg.mff.cuni.cz
> https://dsrg.mff.cuni.cz/mailman/listinfo/osy
>




More information about the NSWI004 mailing list