Bladeren bron

get memory size info

greatbridf 4 jaren geleden
bovenliggende
commit
7cb648b8c6
4 gewijzigde bestanden met toevoegingen van 52 en 2 verwijderingen
  1. 2 0
      CMakeLists.txt
  2. 10 0
      include/kernel/mem.h
  3. 39 2
      src/boot.s
  4. 1 0
      src/kernel/mem.c

+ 2 - 0
CMakeLists.txt

@@ -28,10 +28,12 @@ include_directories(${PROJECT_SOURCE_DIR}/include)
 set(KERNEL_MAIN_SOURCES src/kernel_main.c
                         src/kernel/interrupt.c
                         src/kernel/stdio.c
+                        src/kernel/mem.c
                         src/kernel/vga.c
                         include/asm/boot.h
                         include/kernel/interrupt.h
                         include/kernel/stdio.h
+                        include/kernel/mem.h
                         include/kernel/vga.h
                         include/types/stdint.h
                         include/kernel_main.h

+ 10 - 0
include/kernel/mem.h

@@ -0,0 +1,10 @@
+#pragma once
+
+#include <types/stdint.h>
+
+struct mem_size_info {
+    uint16_t n_16k_blks;
+    uint16_t n_64k_blks;
+};
+
+extern struct mem_size_info asm_mem_size_info;

+ 39 - 2
src/boot.s

@@ -57,7 +57,36 @@ loader_start:
     movw %cs, %ax
     movw %ax, %ds
 
-# load gdt
+# get memory size info and storage it
+_get_memory_size:
+    xorw %cx, %cx
+    xorw %dx, %dx
+    movw $0xe801, %ax
+
+    int $0x15
+    jc _get_memory_size_error
+
+    cmpb $0x86, %ah # unsupported function
+    je _get_memory_size_error
+    cmpb $0x80, %ah # invalid command
+    je _get_memory_size_error
+
+    jcxz _get_memory_size_use_ax
+    movw %cx, %ax
+    movw %dx, %bx
+
+_get_memory_size_use_ax:
+    movl $(asm_mem_size_info-loader_start), %edx
+    movw %ax, (%edx)
+    addw $2, %dx
+    movw %bx, (%edx)
+    jmp _load_gdt
+
+_get_memory_size_error:
+    xchgw %bx, %bx
+    jmp loader_halt
+
+_load_gdt:
     cli
     lgdt (asm_gdt_descriptor-loader_start)
 
@@ -89,7 +118,7 @@ loader_halt:
     jmp loader_halt
 
 asm_gdt_descriptor:
-    .word (4 * 8) - 1 # size
+    .word (3 * 8) - 1 # size
     .long 0x0600+(asm_gdt_table-loader_start)  # address
 
 .globl asm_gdt_descriptor
@@ -114,3 +143,11 @@ asm_gdt_table:
     .byte 0x92       # access
     .byte 0b11000000 # flag and limit 16:20
     .byte 0x00       # base 24:31
+
+asm_mem_size_info:
+    .word 0x12
+    .word 0x34
+
+.globl asm_mem_size_info
+.type  asm_mem_size_info @object
+.size  asm_mem_size_info, (.-asm_mem_size_info)

+ 1 - 0
src/kernel/mem.c

@@ -0,0 +1 @@
+#include <kernel/mem.h>