mem.h 3.2 KB

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