[OSy] pomoooc KoHlTo!!
Sulthan
sulthan at seznam.cz
Mon Jan 8 23:04:52 CET 2007
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
More information about the NSWI004
mailing list