[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