/*******************************************************************************/ /* COS2000 - Compatible Operating System - LGPL v3 - Hordé Nicolas */ /* */ #include "types.h" #include "queue.h" #ifndef _MEMORY #define _MEMORY #define TOPAGE(addr) (addr) >> 12 #define TOPD(addr) ((addr) & 0xFFC00000) >> 22 #define TOPT(addr) ((addr) & 0x003FF000) >> 12 #define TOPG(addr) (addr) & 0x00000FFF #define PAGESIZE 4096 /* Taille d'une page */ #define PAGENUMBER 1024 /* Nombre de pages */ #define KERNELSIZE PAGESIZE*PAGENUMBER*2 /* 2 pages de 4mo en identity mapping */ #define IDT_ADDR 0x00000000 /* adresse de la IDT */ #define GDT_ADDR 0x00000800 /* adresse de la GDT */ #define KERNEL_PD_ADDR 0x00001000 /* adresse de la page directory */ #define KERNEL_STACK_ADDR 0x0009FFFF /* adresse de la pile du kernel */ #define KERNEL_CODE_ADDR 0x00100000 /* adresse du code du noyau */ #define KERNEL_PAGES 0x00800000 /* adresse des pages */ #define KERNEL_HEAP 0x10000000 /* adresse du heap */ #define VESA_FBMEM 0x38000000 /* adresse du framebuffer VESA */ #define USER_CODE 0x40000000 /* adresse du code utilisateur */ #define USER_STACK 0xE0000000 /* adresse de la pile utilisateur */ /* limites de la mémoire 32 bits */ #define MAXMEMSIZE 0x100000000 #define MAXMEMPAGE 1024*1024 #define MAXHEAPSIZE VESA_FBMEM-KERNEL_HEAP #define MAXPAGESSIZE KERNEL_HEAP-KERNEL_PAGES /* page directory */ #define PAGE_NOFLAG 0x0 #define PAGE_PRESENT 0b000000001/* page directory / table */ #define PAGE_WRITE 0b000000010 /* page lecture ecriture */ #define PAGE_ALL 0b000000100 /* accessible user & supervisor */ #define PAGE_WTROUGH 0b000001000 /* write-through cache */ #define PAGE_NOCACHE 0b000010000 /* cache desactivé */ #define PAGE_ACCESS 0b000100000 /* page accedée */ #define PAGE_4MB 0b010000000 /* page de 4mb au lieu de 4k (NECESSITE PSE)*/ /* page table */ #define PAGE_CACHE 0b000010000 /* page en cache */ #define PAGE_DIRTY 0b001000000 /* page écrite */ #define PAGE_GLOBAL 0b100000000 /* évite que le TLB mette à jour l'adresse dans le cache si CR4 est remis à zéro (NECESSITE CR4) */ /* Selecteur RPL */ #define RPL_RING0 0b00 /* Anneau 0 */ #define RPL_RING1 0b01 /* Anneau 1 */ #define RPL_RING2 0b01 /* Anneau 2 */ #define RPL_RING3 0b11 /* Anneau 3 */ #define MALLOC_MINIMUM 16 #define setcr3(addr) \ asm volatile ("mov %[memaddr], %%eax; mov %%eax, %%cr3"::[memaddr] "m" (addr) ); /* Malloc, pour l'attribution de mémoire en heap */ typedef struct tmalloc { u32 size:31; u32 used:1; } __attribute__ ((packed)) tmalloc; /* Page, pour la gestion de la mémoire virtuelle */ typedef struct page { u8 *vaddr; u8 *paddr; TAILQ_ENTRY(page) tailq; } __attribute__ ((packed)) page; typedef TAILQ_HEAD(page_s, page) page_t; /* Page directory, pour la gestion de la mémoire virtuelle */ typedef struct pd { page *addr; page_t page_head; } __attribute__ ((packed)) pd; /* vaddrrange, pour la gestion des pages de la mémoire virtuelle */ typedef struct vrange { u8 *vaddrlow; u8 *vaddrhigh; TAILQ_ENTRY(vrange) tailq; } __attribute__ ((packed)) vrange; typedef TAILQ_HEAD(vrange_s, vrange) vrange_t; void panic(u8 *string); void memset(void *dst, u8 val, u32 count,u32 size); void memcpy(void *src, void *dst, u32 count, u32 size); u32 memcmp(void *src, void *dst, u32 count, u32 size); u64 getmemoryfree(void); u64 physical_getmemorysize(); void physical_page_use(u32 page); void physical_page_free(u32 page); void physical_range_use(u64 addr,u64 len); void physical_range_free(u64 addr,u64 len); u8* physical_page_getfree(void); void physical_init(void); void initpaging(void); void virtual_init(void); tmalloc *mallocpage(u64 size); void *vmalloc(u32 size); void vfree(void *vaddr); page *virtual_page_getfree(void); pd *virtual_pd_create(); void virtual_pd_destroy(pd *dst); void virtual_page_free(u8* vaddr); u8* virtual_to_physical(u8 *vaddr); void virtual_pd_page_remove(u8* vaddr); void virtual_pd_page_add(pd *dst, u8* vaddr, u8 * paddr, u32 flags); void virtual_range_use(pd *dst, u8 *vaddr, u8 *paddr, u64 len, u32 flags); void virtual_range_free(pd *dst, u8 *vaddr, u64 len); void virtual_range_new(pd *dst, u8 *vaddr, u64 len, u32 flags); void malloc_init(void); void identity_init(void); void registry_init(void); u32 getmallocused(void); u32 getmallocfree(void); u32 getmallocnonallocated(void); u32 virtual_getpagesfree(); #endif