mem.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #pragma once
  2. #include <types/size.h>
  3. #include <types/stdint.h>
  4. #ifdef __cplusplus
  5. extern "C" {
  6. #endif
  7. // don't forget to add the initial 1m to the total
  8. struct mem_size_info {
  9. uint16_t n_1k_blks; // memory between 1m and 16m in 1k blocks
  10. uint16_t n_64k_blks; // memory above 16m in 64k blocks
  11. };
  12. struct e820_mem_map_entry_20 {
  13. uint64_t base;
  14. uint64_t len;
  15. uint32_t type;
  16. };
  17. struct e820_mem_map_entry_24 {
  18. struct e820_mem_map_entry_20 in;
  19. uint32_t acpi_extension_attr;
  20. };
  21. /*
  22. * page directory entry
  23. *
  24. * p : present (1)
  25. * rw : allow write (1)
  26. * us : allow user access (1)
  27. * pwt : todo
  28. * pcd : todo
  29. * a : accessed for linear address translation (1)
  30. * d : dirty (1) (ignored)
  31. * ps : use 4MiB pages (ignored)
  32. * addr: page table address
  33. */
  34. struct page_directory_entry_in {
  35. uint32_t p : 1;
  36. uint32_t rw : 1;
  37. uint32_t us : 1;
  38. uint32_t pwt : 1;
  39. uint32_t pcd : 1;
  40. uint32_t a : 1;
  41. uint32_t d : 1;
  42. uint32_t ps : 1;
  43. uint32_t ignored : 4;
  44. page_t pt_page : 20;
  45. };
  46. typedef union page_directory_entry {
  47. uint32_t v;
  48. struct page_directory_entry_in in;
  49. } page_directory_entry;
  50. /*
  51. * page table entry
  52. *
  53. * p : present (1)
  54. * rw : allow write (1)
  55. * us : allow user access (1)
  56. * pwt : todo
  57. * pcd : todo
  58. * a : accessed for linear address translation (1)
  59. * d : dirty (1)
  60. * pat : todo (ignored)
  61. * g : used in cr4 mode (ignored)
  62. * addr: physical memory address
  63. */
  64. struct page_table_entry_in {
  65. uint32_t p : 1;
  66. uint32_t rw : 1;
  67. uint32_t us : 1;
  68. uint32_t pwt : 1;
  69. uint32_t pcd : 1;
  70. uint32_t a : 1;
  71. uint32_t d : 1;
  72. uint32_t pat : 1;
  73. uint32_t g : 1;
  74. uint32_t ignored : 3;
  75. page_t page : 20;
  76. };
  77. typedef union page_table_entry {
  78. uint32_t v;
  79. struct page_table_entry_in in;
  80. } page_table_entry;
  81. struct page_attr {
  82. uint32_t read : 1;
  83. uint32_t write : 1;
  84. uint32_t system : 1;
  85. uint32_t cow : 1;
  86. };
  87. struct page {
  88. page_t phys_page_id;
  89. size_t* ref_count;
  90. struct page_attr attr;
  91. struct page* next;
  92. };
  93. struct mm_attr {
  94. uint32_t read : 1;
  95. uint32_t write : 1;
  96. uint32_t system : 1;
  97. };
  98. struct mm {
  99. void* start;
  100. size_t len;
  101. struct mm_attr attr;
  102. struct page* pgs;
  103. struct mm* next;
  104. page_directory_entry* pd;
  105. };
  106. // in kernel_main.c
  107. extern uint8_t e820_mem_map[1024];
  108. extern uint32_t e820_mem_map_count;
  109. extern uint32_t e820_mem_map_entry_size;
  110. extern uint32_t kernel_size;
  111. extern struct mem_size_info mem_size_info;
  112. #define KERNEL_HEAP_START ((void*)0x30000000)
  113. #define KERNEL_HEAP_LIMIT ((void*)0x40000000)
  114. struct mem_blk_flags {
  115. uint8_t is_free;
  116. uint8_t has_next;
  117. uint8_t _unused2;
  118. uint8_t _unused3;
  119. };
  120. struct mem_blk {
  121. size_t size;
  122. struct mem_blk_flags flags;
  123. // the first byte of the memory space
  124. // the minimal allocated space is 4 bytes
  125. uint8_t data[4];
  126. };
  127. int init_heap(void);
  128. void* k_malloc(size_t size);
  129. void k_free(void* ptr);
  130. // translate physical address to linear address
  131. void* p_ptr_to_v_ptr(phys_ptr_t p_ptr);
  132. // translate linear address to physical address
  133. phys_ptr_t v_ptr_to_p_ptr(struct mm* mm_area, void* v_ptr);
  134. #define KERNEL_PAGE_DIRECTORY_ADDR ((page_directory_entry*)0x00000000)
  135. void init_mem(void);
  136. #define SD_TYPE_CODE_SYSTEM (0x9a)
  137. #define SD_TYPE_DATA_SYSTEM (0x92)
  138. #define SD_TYPE_CODE_USER (0xfa)
  139. #define SD_TYPE_DATA_USER (0xf2)
  140. #define SD_TYPE_TSS (0x89)
  141. typedef struct segment_descriptor_struct {
  142. uint64_t limit_low : 16;
  143. uint64_t base_low : 16;
  144. uint64_t base_mid : 8;
  145. uint64_t access : 8;
  146. uint64_t limit_high : 4;
  147. uint64_t flags : 4;
  148. uint64_t base_high : 8;
  149. } segment_descriptor;
  150. void create_segment_descriptor(
  151. segment_descriptor* sd,
  152. uint32_t base,
  153. uint32_t limit,
  154. uint32_t flags,
  155. uint32_t access);
  156. #ifdef __cplusplus
  157. }
  158. #endif