2018-09-28 20:35:51 +02:00
|
|
|
/*******************************************************************************/
|
|
|
|
/* COS2000 - Compatible Operating System - LGPL v3 - Hordé Nicolas */
|
|
|
|
/* */
|
2007-04-02 14:58:30 +02:00
|
|
|
#include "types.h"
|
2018-11-22 17:21:15 +01:00
|
|
|
#include "queue.h"
|
2007-04-02 14:58:30 +02:00
|
|
|
|
2018-12-09 00:40:25 +01:00
|
|
|
#ifndef _MEMORY
|
2018-12-12 15:25:04 +01:00
|
|
|
# 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 */
|
2018-10-02 02:16:14 +02:00
|
|
|
|
2018-11-16 15:57:34 +01:00
|
|
|
/* limites de la mémoire 32 bits */
|
2018-12-12 15:25:04 +01:00
|
|
|
# define MAXMEMSIZE 0x100000000
|
|
|
|
# define MAXMEMPAGE 1024*1024
|
|
|
|
# define MAXHEAPSIZE VESA_FBMEM-KERNEL_HEAP
|
|
|
|
# define MAXPAGESSIZE KERNEL_HEAP-KERNEL_PAGES
|
2018-11-16 15:57:34 +01:00
|
|
|
|
2018-10-02 02:16:14 +02:00
|
|
|
/* page directory */
|
2018-12-12 15:25:04 +01:00
|
|
|
# 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) */
|
2018-10-02 02:16:14 +02:00
|
|
|
|
|
|
|
/* page table */
|
2018-12-12 15:25:04 +01:00
|
|
|
# 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) */
|
2018-10-02 02:16:14 +02:00
|
|
|
|
2018-12-09 00:40:25 +01:00
|
|
|
/* Selecteur RPL */
|
2018-12-12 15:25:04 +01:00
|
|
|
# define RPL_RING0 0b00 /* Anneau 0 */
|
|
|
|
# define RPL_RING1 0b01 /* Anneau 1 */
|
|
|
|
# define RPL_RING2 0b01 /* Anneau 2 */
|
|
|
|
# define RPL_RING3 0b11 /* Anneau 3 */
|
2018-12-09 00:40:25 +01:00
|
|
|
|
2018-12-12 15:25:04 +01:00
|
|
|
# define MALLOC_MINIMUM 16
|
2018-11-22 17:21:15 +01:00
|
|
|
|
2018-12-19 07:34:44 +01:00
|
|
|
# define setCR3(addr) \
|
2018-12-09 11:11:39 +01:00
|
|
|
asm volatile ("mov %[memaddr], %%eax; mov %%eax, %%cr3"::[memaddr] "m" (addr) );
|
2018-12-09 00:40:25 +01:00
|
|
|
|
2018-11-22 17:21:15 +01:00
|
|
|
/* Malloc, pour l'attribution de mémoire en heap */
|
2018-12-12 15:25:04 +01:00
|
|
|
typedef struct tmalloc
|
|
|
|
{
|
|
|
|
u32 size:31;
|
|
|
|
u32 used:1;
|
2018-11-22 17:21:15 +01:00
|
|
|
} __attribute__ ((packed)) tmalloc;
|
|
|
|
|
|
|
|
/* Page, pour la gestion de la mémoire virtuelle */
|
2018-12-12 15:25:04 +01:00
|
|
|
typedef struct page
|
|
|
|
{
|
|
|
|
u8 *vaddr;
|
|
|
|
u8 *paddr;
|
|
|
|
TAILQ_ENTRY(page) tailq;
|
|
|
|
} __attribute__ ((packed)) page;
|
2018-11-22 17:21:15 +01:00
|
|
|
|
|
|
|
typedef TAILQ_HEAD(page_s, page) page_t;
|
|
|
|
|
|
|
|
/* Page directory, pour la gestion de la mémoire virtuelle */
|
2018-12-12 15:25:04 +01:00
|
|
|
typedef struct pd
|
|
|
|
{
|
|
|
|
page *addr;
|
|
|
|
page_t page_head;
|
|
|
|
} __attribute__ ((packed)) pd;
|
2018-11-22 17:21:15 +01:00
|
|
|
|
|
|
|
/* vaddrrange, pour la gestion des pages de la mémoire virtuelle */
|
2018-12-12 15:25:04 +01:00
|
|
|
typedef struct vrange
|
|
|
|
{
|
|
|
|
u8 *vaddrlow;
|
|
|
|
u8 *vaddrhigh;
|
|
|
|
TAILQ_ENTRY(vrange) tailq;
|
|
|
|
} __attribute__ ((packed)) vrange;
|
|
|
|
|
|
|
|
typedef TAILQ_HEAD(vrange_s, vrange) vrange_t;
|
|
|
|
|
2018-12-27 14:24:47 +01:00
|
|
|
void virtual_pd_show(pd *dst);
|
2018-12-12 15:25:04 +01:00
|
|
|
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();
|
2018-12-09 00:40:25 +01:00
|
|
|
|
|
|
|
#endif
|