|
@@ -1,6 +1,7 @@
|
|
|
#include "mm.h"
|
|
|
#include "../common/printk.h"
|
|
|
#include "../common/kprint.h"
|
|
|
+#include "../driver/multiboot2/multiboot2.h"
|
|
|
|
|
|
ul Total_Memory = 0;
|
|
|
ul total_2M_pages = 0;
|
|
@@ -8,31 +9,32 @@ ul total_2M_pages = 0;
|
|
|
void mm_init()
|
|
|
{
|
|
|
kinfo("Initializing memory management unit...");
|
|
|
-
|
|
|
+
|
|
|
memory_management_struct.kernel_code_start = (ul)&_text;
|
|
|
memory_management_struct.kernel_code_end = (ul)&_etext;
|
|
|
memory_management_struct.kernel_data_end = (ul)&_edata;
|
|
|
memory_management_struct.kernel_end = (ul)&_end;
|
|
|
|
|
|
-
|
|
|
- struct ARDS *ards_ptr = (struct ARDS *)0xffff800000007e00;
|
|
|
-
|
|
|
- for (int i = 0; i < 32; ++i)
|
|
|
+ struct multiboot_mmap_entry_t *mb2_mem_info;
|
|
|
+ int count;
|
|
|
+ multiboot2_iter(multiboot2_get_memory, mb2_mem_info, &count);
|
|
|
+
|
|
|
+ for (int i = 0; i < count; ++i)
|
|
|
{
|
|
|
|
|
|
- if (ards_ptr->type == 1)
|
|
|
- Total_Memory += ards_ptr->Length;
|
|
|
+ if (mb2_mem_info->type == 1)
|
|
|
+ Total_Memory += mb2_mem_info->len;
|
|
|
|
|
|
|
|
|
- memory_management_struct.e820[i].BaseAddr = ards_ptr->BaseAddr;
|
|
|
- memory_management_struct.e820[i].Length = ards_ptr->Length;
|
|
|
- memory_management_struct.e820[i].type = ards_ptr->type;
|
|
|
+ memory_management_struct.e820[i].BaseAddr = mb2_mem_info->addr;
|
|
|
+ memory_management_struct.e820[i].Length = mb2_mem_info->len;
|
|
|
+ memory_management_struct.e820[i].type = mb2_mem_info->type;
|
|
|
memory_management_struct.len_e820 = i;
|
|
|
|
|
|
- ++ards_ptr;
|
|
|
+ ++mb2_mem_info;
|
|
|
|
|
|
|
|
|
- if (ards_ptr->type > 4 || ards_ptr->Length == 0 || ards_ptr->type < 1)
|
|
|
+ if (mb2_mem_info->type > 4 || mb2_mem_info->len == 0 || mb2_mem_info->type < 1)
|
|
|
break;
|
|
|
}
|
|
|
printk("[ INFO ] Total amounts of RAM : %ld bytes\n", Total_Memory);
|
|
@@ -57,8 +59,6 @@ void mm_init()
|
|
|
}
|
|
|
kinfo("Total amounts of 2M pages : %ld.", total_2M_pages);
|
|
|
|
|
|
-
|
|
|
-
|
|
|
|
|
|
ul max_addr = memory_management_struct.e820[memory_management_struct.len_e820].BaseAddr + memory_management_struct.e820[memory_management_struct.len_e820].Length;
|
|
|
|
|
@@ -78,7 +78,7 @@ void mm_init()
|
|
|
memory_management_struct.count_pages = max_addr >> PAGE_2M_SHIFT;
|
|
|
memory_management_struct.pages_struct_len = ((max_addr >> PAGE_2M_SHIFT) * sizeof(struct Page) + sizeof(long) - 1) & (~(sizeof(long) - 1));
|
|
|
|
|
|
- memset(memory_management_struct.pages_struct, 0x00, memory_management_struct.pages_struct_len);
|
|
|
+ memset(memory_management_struct.pages_struct, 0x00, memory_management_struct.pages_struct_len);
|
|
|
|
|
|
|
|
|
memory_management_struct.zones_struct = (struct Zone *)(((ul)memory_management_struct.pages_struct + memory_management_struct.pages_struct_len + PAGE_4K_SIZE - 1) & PAGE_4K_MASK);
|
|
@@ -154,14 +154,14 @@ void mm_init()
|
|
|
|
|
|
printk_color(ORANGE, BLACK, "zones_struct:%#18lx, count_zones:%#18lx, zones_struct_len:%#18lx\n", memory_management_struct.zones_struct, memory_management_struct.count_zones, memory_management_struct.zones_struct_len);
|
|
|
*/
|
|
|
- ZONE_DMA_INDEX = 0;
|
|
|
- ZONE_NORMAL_INDEX = 0;
|
|
|
+ ZONE_DMA_INDEX = 0;
|
|
|
+ ZONE_NORMAL_INDEX = 0;
|
|
|
|
|
|
- for (int i = 0; i < memory_management_struct.count_zones; ++i)
|
|
|
+ for (int i = 0; i < memory_management_struct.count_zones; ++i)
|
|
|
{
|
|
|
struct Zone *z = memory_management_struct.zones_struct + i;
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
|
|
|
|
|
|
if (z->zone_addr_start == 0x100000000)
|
|
@@ -170,8 +170,8 @@ void mm_init()
|
|
|
|
|
|
memory_management_struct.end_of_struct = (ul)((ul)memory_management_struct.zones_struct + memory_management_struct.zones_struct_len + sizeof(long) * 32) & (~(sizeof(long) - 1));
|
|
|
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
@@ -190,12 +190,11 @@ void mm_init()
|
|
|
printk_color(INDIGO, BLACK, "**cr3:\t%#018lx\n", *phys_2_virt(*(phys_2_virt(cr3)) & (~0xff)) & (~0xff));
|
|
|
*/
|
|
|
|
|
|
-
|
|
|
|
|
|
|
|
|
for (int i = 0; i < 10; ++i)
|
|
|
*(phys_2_virt(global_CR3) + i) = 0UL;
|
|
|
- */
|
|
|
+ */
|
|
|
|
|
|
flush_tlb();
|
|
|
|
|
@@ -204,12 +203,12 @@ void mm_init()
|
|
|
|
|
|
|
|
|
* @brief 初始化内存页
|
|
|
- *
|
|
|
+ *
|
|
|
* @param page 内存页结构体
|
|
|
* @param flags 标志位
|
|
|
* 对于新页面: 初始化struct page
|
|
|
* 对于当前页面属性/flags中含有引用属性或共享属性时,则只增加struct page和struct zone的被引用计数。否则就只是添加页表属性,并置位bmp的相应位。
|
|
|
- * @return unsigned long
|
|
|
+ * @return unsigned long
|
|
|
*/
|
|
|
unsigned long page_init(struct Page *page, ul flags)
|
|
|
{
|
|
@@ -245,11 +244,11 @@ unsigned long page_init(struct Page *page, ul flags)
|
|
|
|
|
|
|
|
|
* @brief 从已初始化的页结构中搜索符合申请条件的、连续num个struct page
|
|
|
- *
|
|
|
+ *
|
|
|
* @param zone_select 选择内存区域, 可选项:dma, mapped in pgt(normal), unmapped in pgt
|
|
|
* @param num 需要申请的连续内存页的数量 num<=64
|
|
|
* @param flags 将页面属性设置成flag
|
|
|
- * @return struct Page*
|
|
|
+ * @return struct Page*
|
|
|
*/
|
|
|
struct Page *alloc_pages(unsigned int zone_select, int num, ul flags)
|
|
|
{
|
|
@@ -310,7 +309,7 @@ struct Page *alloc_pages(unsigned int zone_select, int num, ul flags)
|
|
|
page_init(x, flags);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
return (struct Page *)(memory_management_struct.pages_struct + start_page_num);
|
|
|
}
|
|
|
}
|