[OSy] pomoooc KoHlTo!!

Jiri Tousek jiri.tousek at gmail.com
Mon Jan 8 23:31:54 CET 2007


Kopirovani dat bych urcite presunul az do behu vlakna, ktere data
pouzije - v kernel_start neni jasne definovano, v kterem memoryspace
jsme (pokud si dobre vzpominam, mel by to byt vmem idle_threadu).

Jinak pokud si vzpominam, funknci na vypis tlb jsme tam nechali.

Jeste poznamka k ladicim tiskum - je treba mit na pameti, ze
poslednich par tisku se nemusi stihnout vytisknout, i kdyz kod projde
volanim printk().

J.T.

On 1/8/07, Sulthan <sulthan at seznam.cz> wrote:
> Zdravim,
>
> rozeberu to radek po radku.
>
> > /* jedina vec, co jsme zmenili */
> > #define PROGRAM_BEGIN_ADDRESS 0x00000000
> > #define CODE_SEGMENT_SIZE (32*1024)
> > #define EXT_DEVICE_BEGIN 0x90000000
>
> tak tady zrejme chyba nebude :-)
>
> > copyProgram( void) {
>
> navratovy typ jste zrejme zapomneli omylem
>
> > int retVal;
> >
> > uint8_t * src;
> > uint8_t * dest;
> > size_t i;
>
> ok
>
> >
> > /* adress of code segment begin */
> > uint8_t *where = (uint8_t *)PROGRAM_BEGIN_ADDRESS;
> >
> >    retVal = vmalloc(&where, CODE_SEGMENT_SIZE,
> > (VF_VA_USER << VF_VA_SHIFT) | (VF_AT_KUSEG << VF_AT_SHIFT) );
>
> tady je urcite zbytecne psat (VF_AT_KUSEG << VF_AT_SHIFT) , protoze kdyz tu
> adresu zadavate absolutne, tak nemusite urcovat, kde ma alokovat. Pochybuju
> ale, ze by to neco zmenilo.
> >
> > if( retVal != EOK)
> > {
> > dprintk("CODE_SEGMENT allocation error!\n");
> > return retVal;
> > }
> >
> > src = (uint8_t *)EXT_DEVICE_BEGIN;
> > dest = (uint8_t *)PROGRAM_BEGIN_ADDRESS;
>
> ok, tady snad  chyba neni
>
> > for(i = 0; i < (CODE_SEGMENT_SIZE / sizeof(uint8_t)); i++)
> > {
> > dest[i] = src[i];
> > }
>
> Co se vlastne dela pri tomhle kopirovani? Pristup procesoru na virtualni
> adresu src[i] muze vyvolat vypadek stranky (co treba pri vypadku stranky
> vypsat obsah TLB? nevim jak dobre to jde v tomhle jadru, takze bych zacal
> tim, ze bych vypisoval alespon ze nastal vypadek stranky. Na to staci jeden
> dprint v tlb exception handleru.) Potom se hodnota dosadi do dest[i], to
> muze opet vyvolat vypadek stranky. Nevim, co jineho by se mohlo pokazit.
> Muzete ale zkusit trochu to zjednodusit - misto dest[i] = src[i] tam hodit
> a/ dest[i] = 0;
> b/ int x = src[i];
> a sledovat jestli se chovani nezmeni.
>
> >
> > return EOK;
> > }
>
> ok
>
> >
> > /* plus v main.c misto:
> > if (thread_create_new_map(&t, assignment_test, NULL) != EOK) {
> >
> > panic("Cannot create test thread - Not enough memory.\nSystem halted.\n");
> >
> > }
> > je:
> > if (thread_create_new_map(&t, idle_thread2, NULL) != EOK) {
> >
> > panic("Cannot create test thread - Not enough memory.\nSystem halted.\n");
> >
> > }
> > if( EOK != copyProgram() )
> > panic("Copy se podelal!\n");
> >
> > s tim, ze idle_thread2 a idle_thread aktivne vypisuji: "jak sem thred
> > #1"(popr.2)
> > */
>
> Tohle nedovedu uplne posoudit, protoze to jadro neznam, takze nevim, jestli
> je vubec mozne v main.c pouzivat alokaci virtualni pameti. Nebylo by lepsi
> presunout to copy do toho idle vlakna? Stejne se tam jinak vytvari zbytecne.
>
> hodne stesti s ladenim
>
> ondra
>
> _______________________________________________
> OSy mailing list
> OSy at dsrg.mff.cuni.cz
> http://dsrg.mff.cuni.cz/mailman/listinfo/osy
>



More information about the NSWI004 mailing list