sys_mem.c

Go to the documentation of this file.
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 

Generated on Sun May 30 18:38:35 2004 for Routix OS by doxygen 1.3.6