memory.h 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. /************************************************************************
  2. * 0xc0000000 是内核从虚拟地址3G起
  3. * 0x100000 是内核从物理地址1M起
  4. *
  5. * 低端1MB内存中,0x00000000~0x00a0000 是低端640K内存
  6. * 0x00a0000~0x00f0000 是显存
  7. * 0x00f0000~0x0100000 是BIOS数据区
  8. *
  9. * 0xc0000000~0xc0100000 是映射到物理地址的前1MB内存
  10. * 0xc0100000~0xf0000000 是内核地址空间,共503MB
  11. * 0xf0000000~ 是保留给用户的地址空间
  12. ************************************************************************/
  13. #ifndef __KERNEL_MEMORY_H
  14. #define __KERNEL_MEMORY_H
  15. #include "../lib/stdint.h"
  16. #include "../lib/kernel/bitmap.h"
  17. enum pool_flags
  18. {
  19. PF_KERNEL = 1, // 内核内存池
  20. PF_USER = 2 // 用户内存池
  21. };
  22. #define PG_P_1 1 // 页表项或页目录项存在属性位, 1 表示存在
  23. #define PG_P_0 0 // 页表项或页目录项存在属性位, 0 表示不存在
  24. #define PG_RW_R 0 // R/W 属性位值, 读/执行
  25. #define PG_RW_W 2 // R/W 属性位值, 读/写/执行
  26. #define PG_US_S 0 // U/S 属性位值, 系统级
  27. #define PG_US_U 4 // U/S 属性位值, 用户级
  28. // 虚拟地址池,用于虚拟地址管理
  29. struct virtual_addr
  30. {
  31. Bitmap vaddr_bitmap; // 虚拟地址用到的位图结构
  32. uint32_t vaddr_start; // 虚拟地址起始地址
  33. };
  34. extern struct pool kernel_pool, user_pool; // 内核内存池和用户内存池
  35. void mem_init(void); // 内存管理初始化
  36. uint32_t *pte_ptr(uint32_t vaddr);
  37. uint32_t *pde_ptr(uint32_t vaddr);
  38. void *malloc_page(enum pool_flags pf, uint32_t pg_cnt); // 申请 pg_cnt 个虚拟页
  39. void *get_kernel_pages(uint32_t pg_cnt); // 申请内核内存
  40. #endif // __KERNEL_MEMORY_H