00001 00008 #include "routix/system.h" 00009 #include "routix/paging.h" 00010 #include "routix/segm.h" 00011 #include "routix/debug.h" 00012 #include "routix/syscalls.h" 00013 #include "sys/syscalls.h" 00014 #include "error.h" 00015 #include "routix/kalloc.h" 00016 #include <routix/kstdio.h> 00017 #ifndef __TASK 00018 #include "routix/task.h" 00019 #endif 00020 00021 00022 //Nuevas 00023 00024 extern task_struct_t *actual; 00025 00026 00027 00028 // Vector de funciones de llamadas al sistema (grupo Timer) 00029 int (*syscall_mem[MAX_SYSCALLS]) (void) = { 00030 (int (*) (void)) sys_malloc_page, 00031 (int (*) (void)) sys_free_page, 00032 (int (*) (void)) sys_free_mem 00033 }; 00034 00035 00036 00037 /* SYS_MALLOC_PAGE: Esta llamada tiene por función brindarle una pagina a un proceso de usuario, dandole la direccion 00038 * virtual que le corresponde. Esta funcion se encarga también, de actualizar la task_Struct con los nuevos valores. 00039 */ 00040 void *sys_malloc_page(void) 00041 { 00042 //Verificar que la tarea actual no sobrepase la cantidad máxima de páginas utilizadas 00043 word npages_usadas = actual->num_code + actual->num_data; 00044 00045 if ( npages_usadas >= MAX_PAGINAS_POR_TAREA ) 00046 return NULL; //No más memoria para esta tarea 00047 00048 //Debo devolver la dirección mapeada en el espacio virtual de la tarea. Desde la dir virtual TASK_DATA me desplazo 00049 //num_data paginas 00050 addr_t dir_virtual = TASK_DATA + (actual->num_data * PAGINA_SIZE); 00051 00052 struct user_page *mem; 00053 00054 //Posicionarse en el ultimo nodo 00055 for (mem=actual->mdata; mem->next ; mem=mem->next); 00056 00057 //Pedir memoria al Memory Manager 00058 mem->next = umalloc_page (PAGINA_ALLOC, dir_virtual, actual->cr3_backup); 00059 00060 //Si no hay disponible, nos vamos :-( 00061 if (!mem->next) 00062 return NULL; 00063 00064 mem = mem->next; 00065 /* 00066 if (kmapmem( mem->dir , dir_virtual, actual->cr3_backup , PAGE_PRES|PAGE_USER|PAGE_RW) != OK) { 00067 kprintf("\nTEMP: KmapMem Retorno -1"); 00068 } 00069 */ 00070 actual->num_data++; 00071 00072 return (void *) dir_virtual; 00073 } 00074 00075 00076 00077 /* Libera una pagina del User Space NO IMPLEMENTADA */ 00078 int sys_free_page(void *dir) 00079 { 00080 kprintf("SYS_FREE_PAGE\n"); 00081 while(1); 00082 } 00083 00084 00085 // Devuelve la cantidad de paginas libres (utilizada para propositos de depuración) 00086 dword sys_free_mem (void) 00087 { 00088 return kmem_free(); 00089 } 00090 00091 00092 00093 00094