瀏覽代碼

detect memroy

greatbridf 4 年之前
父節點
當前提交
bb030a6eb6
共有 2 個文件被更改,包括 14 次插入2 次删除
  1. 3 2
      include/kernel/mem.h
  2. 11 0
      src/kernel_main.c

+ 3 - 2
include/kernel/mem.h

@@ -2,9 +2,10 @@
 
 #include <types/stdint.h>
 
+// don't forget to add the initial 1m to the total
 struct mem_size_info {
-    uint16_t n_16k_blks;
-    uint16_t n_64k_blks;
+    uint16_t n_1k_blks; // memory between 1m and 16m in 1k blocks
+    uint16_t n_64k_blks; // memory above 16m in 64k blocks
 };
 
 extern struct mem_size_info asm_mem_size_info;

+ 11 - 0
src/kernel_main.c

@@ -1,6 +1,7 @@
 #include <kernel_main.h>
 
 #include <asm/boot.h>
+#include <kernel/mem.h>
 #include <kernel/stdio.h>
 #include <kernel/vga.h>
 
@@ -16,6 +17,16 @@ void kernel_main(void)
         vga_printk((const int8_t*)"A20 is NOT ON\n", 0x0fU);
     }
 
+    uint32_t mem_size = 0;
+    mem_size += 1024 * asm_mem_size_info.n_1k_blks;
+    mem_size += 64 * 1024 * asm_mem_size_info.n_64k_blks;
+
+    char buf[128] = { 0 };
+    snprintf(buf, 128, "Memory size: %d bytes (%d MB), 16k blocks: %d, 64k blocks: %d\n",
+        mem_size, mem_size / 1024 / 1024, (int32_t)asm_mem_size_info.n_1k_blks,
+        (int32_t)asm_mem_size_info.n_64k_blks);
+    vga_printk((const int8_t*)buf, 0x0fu);
+
     vga_printk((const int8_t*)"No work to do, halting...\n", 0x0fU);
 
 _loop: