feat: print available memory
This commit is contained in:
parent
a5581d8b7d
commit
5b60e93b97
4
Makefile
4
Makefile
|
@ -18,7 +18,9 @@ TOOLS_DIR = tools
|
||||||
|
|
||||||
include $(TOOLS_DIR)/build.mk
|
include $(TOOLS_DIR)/build.mk
|
||||||
|
|
||||||
ASFLAGS = -DSTUPID_VERSION=\"$(shell $(GIT-VERSION))\" -Ilib
|
ASFLAGS = -DSTUPID_VERSION="\"$(shell $(GIT-VERSION))\"" -Ilib \
|
||||||
|
-DBUILD_DATE="\"$(shell date --iso)\"" \
|
||||||
|
-DNASM_VERSION="\"$(shell nasm -v)\""
|
||||||
QEMUFLAGS = -serial stdio
|
QEMUFLAGS = -serial stdio
|
||||||
|
|
||||||
GARBADGE = stupid.iso
|
GARBADGE = stupid.iso
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
include kernel/drivers/build.mk
|
include kernel/drivers/build.mk
|
||||||
|
|
||||||
KERNEL_SRCS = head.s gdt.s pic.s isr.s idt.s paging.s lib/log.s
|
KERNEL_SRCS = head.s gdt.s pic.s isr.s idt.s pmm.s paging.s lib/log.s
|
||||||
KERNEL_OBJS = $(addprefix kernel/, $(KERNEL_SRCS:.s=.o) $(DRIVERS_OBJS))
|
KERNEL_OBJS = $(addprefix kernel/, $(KERNEL_SRCS:.s=.o) $(DRIVERS_OBJS))
|
||||||
KERNEL_BIN = vmstupid
|
KERNEL_BIN = vmstupid
|
||||||
KERNEL_DUMP = $(KERNEL_BIN).dump
|
KERNEL_DUMP = $(KERNEL_BIN).dump
|
||||||
|
|
||||||
KERNEL_ASFLAGS = $(ASFLAGS) -D__KERNEL__
|
KERNEL_ASFLAGS = $(ASFLAGS) -D__KERNEL__ -Ikernel
|
||||||
|
|
||||||
GARBADGE += $(KERNEL_OBJS) $(KERNEL_BIN) $(KERNEL_DUMP)
|
GARBADGE += $(KERNEL_OBJS) $(KERNEL_BIN) $(KERNEL_DUMP)
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
[BITS 32]
|
[BITS 32]
|
||||||
|
|
||||||
%include "base.inc"
|
%include "base.inc"
|
||||||
|
%include "multiboot.inc"
|
||||||
|
|
||||||
MULTIBOOT_MAGIC equ 0x1BADB002
|
MULTIBOOT_MAGIC equ 0x1BADB002
|
||||||
MULTIBOOT_ALIGN equ 1 << 0
|
MULTIBOOT_ALIGN equ 1 << 0
|
||||||
|
@ -23,13 +24,28 @@ section .text
|
||||||
global entry
|
global entry
|
||||||
entry:
|
entry:
|
||||||
mov esp, stack_top
|
mov esp, stack_top
|
||||||
|
|
||||||
cli
|
cli
|
||||||
|
|
||||||
|
mov edi, eax
|
||||||
|
mov esi, ebx
|
||||||
|
|
||||||
|
;; initialize serial (mostly used for debug)
|
||||||
extern serial_init
|
extern serial_init
|
||||||
call serial_init
|
call serial_init
|
||||||
|
|
||||||
|
;; eax <- magic
|
||||||
|
;; ebx <- multiboot struct
|
||||||
|
cmp edi, 0x2BADB002
|
||||||
|
je .multiboot_valid
|
||||||
|
|
||||||
|
LOG err_invalid_boot_magic, edi
|
||||||
|
jmp hang
|
||||||
|
|
||||||
|
.multiboot_valid:
|
||||||
|
|
||||||
LOG msg_hello_world
|
LOG msg_hello_world
|
||||||
|
mov eax, [esi + mb_info.bootloader_name]
|
||||||
|
LOG msg_boot_info, eax
|
||||||
|
|
||||||
extern setup_gdt
|
extern setup_gdt
|
||||||
call setup_gdt
|
call setup_gdt
|
||||||
|
@ -40,20 +56,32 @@ entry:
|
||||||
extern setup_idt
|
extern setup_idt
|
||||||
call setup_idt
|
call setup_idt
|
||||||
|
|
||||||
;extern setup_paging
|
push esi
|
||||||
;call setup_paging
|
extern setup_pmm
|
||||||
|
call setup_pmm
|
||||||
|
add esp, 4
|
||||||
|
test eax, 0
|
||||||
|
jz .mem_ok
|
||||||
|
|
||||||
int3
|
LOG err_cannot_map_memory
|
||||||
|
|
||||||
LOG file
|
jmp hang
|
||||||
|
|
||||||
|
.mem_ok:
|
||||||
|
|
||||||
|
extern setup_paging
|
||||||
|
call setup_paging
|
||||||
|
|
||||||
cli
|
|
||||||
hang:
|
hang:
|
||||||
|
cli
|
||||||
hlt
|
hlt
|
||||||
jmp hang
|
jmp hang
|
||||||
|
|
||||||
|
|
||||||
section .rodata
|
section .rodata
|
||||||
|
|
||||||
msg_hello_world db "StupidOS ", STUPID_VERSION, 0
|
msg_hello_world db "StupidOS v", STUPID_VERSION, " (built with ", NASM_VERSION, " on ", BUILD_DATE, ")", 0
|
||||||
|
msg_boot_info db "Bootloader: %s", 0
|
||||||
|
err_invalid_boot_magic db "[ERROR] Invalid boot magic (got: %x, expected: 0x2BADB002)", 0
|
||||||
|
err_cannot_map_memory db "[ERROR] Can't map memory", 0
|
||||||
|
|
||||||
file db __FILE__, 0
|
file db __FILE__, 0
|
||||||
|
|
|
@ -4,6 +4,7 @@ ENTRY(entry)
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
. = 1M;
|
. = 1M;
|
||||||
|
kernel_start = .;
|
||||||
|
|
||||||
.text : ALIGN(4) {
|
.text : ALIGN(4) {
|
||||||
KEEP(*(.multiboot))
|
KEEP(*(.multiboot))
|
||||||
|
@ -22,4 +23,6 @@ SECTIONS
|
||||||
*(COMMON)
|
*(COMMON)
|
||||||
*(.bss)
|
*(.bss)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kernel_end = .;
|
||||||
}
|
}
|
||||||
|
|
66
kernel/multiboot.inc
Normal file
66
kernel/multiboot.inc
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
struc mb_info
|
||||||
|
.flags: resd 1
|
||||||
|
|
||||||
|
;; flags[0] is set
|
||||||
|
.mem_lower: resd 1
|
||||||
|
.mem_upper: resd 1
|
||||||
|
|
||||||
|
;; flags[1] is set
|
||||||
|
.boot_device: resd 1
|
||||||
|
|
||||||
|
;; flags[2] is set
|
||||||
|
.cmdline: resd 1
|
||||||
|
|
||||||
|
;; flags[3] is set
|
||||||
|
.mods_count: resd 1
|
||||||
|
.mods_addr: resd 1
|
||||||
|
|
||||||
|
;; flags[4] || flags[4] is set
|
||||||
|
.syms: resd 4
|
||||||
|
|
||||||
|
;; flags[6] is set
|
||||||
|
.mmap_length: resd 1
|
||||||
|
.mmap_addr: resd 1
|
||||||
|
|
||||||
|
;; flags[7] is set
|
||||||
|
.drives_length: resd 1
|
||||||
|
.drives_addr: resd 1
|
||||||
|
|
||||||
|
;; flags[8] is set
|
||||||
|
.config_table: resd 1
|
||||||
|
|
||||||
|
;; flags[9] is set
|
||||||
|
.bootloader_name: resd 1
|
||||||
|
|
||||||
|
;; flags[10] is set
|
||||||
|
.apm_table: resd 1
|
||||||
|
|
||||||
|
;;
|
||||||
|
.vbe_control_info: resd 1
|
||||||
|
.vbe_mode_info: resd 1
|
||||||
|
.vbe_mode: resw 1
|
||||||
|
.vbe_interface_seg: resw 1
|
||||||
|
.vbe_interface_off: resw 1
|
||||||
|
.vbe_interface_len: resw 1
|
||||||
|
|
||||||
|
.framebuffer_addr: resq 1
|
||||||
|
.framebuffer_pitch: resd 1
|
||||||
|
.framebuffer_width: resd 1
|
||||||
|
.framebuffer_height: resd 1
|
||||||
|
.framebuffer_bpp: resb 1
|
||||||
|
.framebuffer_type: resb 1
|
||||||
|
.framebuffer_misc: resw 3
|
||||||
|
endstruc
|
||||||
|
|
||||||
|
struc mb_mmap
|
||||||
|
.size: resd 1
|
||||||
|
.addr: resq 1
|
||||||
|
.length: resq 1
|
||||||
|
.type: resd 1
|
||||||
|
endstruc
|
||||||
|
|
||||||
|
%define MB_MEMORY_AVAILABLE 1
|
||||||
|
%define MB_MEMORY_RESERVED 2
|
||||||
|
%define MB_MEMORY_ACPI 3
|
||||||
|
%define MB_MEMORY_NVS 4
|
||||||
|
%define MB_MEMORY_BADRAM 5
|
|
@ -1,5 +1,11 @@
|
||||||
[BITS 32]
|
[BITS 32]
|
||||||
|
|
||||||
|
PE_PRESENT equ 1 << 0
|
||||||
|
PE_WRITABLE equ 1 << 1
|
||||||
|
PE_USERMODE equ 1 << 2
|
||||||
|
PE_ACCESSED equ 1 << 5
|
||||||
|
PE_DIRTY equ 1 << 6
|
||||||
|
|
||||||
section .data
|
section .data
|
||||||
align 4096
|
align 4096
|
||||||
|
|
||||||
|
|
74
kernel/pmm.s
Normal file
74
kernel/pmm.s
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
[BITS 32]
|
||||||
|
|
||||||
|
%include "base.inc"
|
||||||
|
%include "multiboot.inc"
|
||||||
|
|
||||||
|
section .text
|
||||||
|
global setup_pmm
|
||||||
|
setup_pmm:
|
||||||
|
push ebp
|
||||||
|
mov ebp, esp
|
||||||
|
push edi
|
||||||
|
push esi
|
||||||
|
push ebx
|
||||||
|
|
||||||
|
mov edi, [ebp + 8]
|
||||||
|
|
||||||
|
mov eax, [edi]
|
||||||
|
and eax, 0x40 ; (1 << 6)
|
||||||
|
jz .no_mmap
|
||||||
|
mov esi, [edi + mb_info.mmap_length]
|
||||||
|
mov ebx, [edi + mb_info.mmap_addr]
|
||||||
|
.loop:
|
||||||
|
mov eax, ebx
|
||||||
|
LOG msg_mmap_entry, dword [eax + mb_mmap.addr + 4], \
|
||||||
|
dword [eax + mb_mmap.addr], \
|
||||||
|
dword [eax + mb_mmap.length + 4], \
|
||||||
|
dword [eax + mb_mmap.length], \
|
||||||
|
dword [eax + mb_mmap.type]
|
||||||
|
mov eax, [ebx + mb_mmap.size]
|
||||||
|
add eax, 0x4
|
||||||
|
add ebx, eax
|
||||||
|
sub esi, eax
|
||||||
|
jnz .loop
|
||||||
|
|
||||||
|
jmp .end_mem_detection
|
||||||
|
|
||||||
|
.no_mmap:
|
||||||
|
LOG warn_no_mmap
|
||||||
|
mov eax, [edi]
|
||||||
|
and eax, 0x1
|
||||||
|
jz .err
|
||||||
|
|
||||||
|
xor eax, eax
|
||||||
|
mov ecx, [edi + mb_info.mem_lower]
|
||||||
|
shl ecx, 0xA ; ecx * 1KiB
|
||||||
|
LOG msg_mem_block, eax, ecx
|
||||||
|
mov eax, 0x100000
|
||||||
|
mov ecx, [edi + mb_info.mem_upper]
|
||||||
|
shl ecx, 0xA
|
||||||
|
LOG msg_mem_block, eax, ecx
|
||||||
|
|
||||||
|
.end_mem_detection:
|
||||||
|
|
||||||
|
xor eax, eax
|
||||||
|
jmp .end
|
||||||
|
.err:
|
||||||
|
mov eax, 1
|
||||||
|
.end:
|
||||||
|
pop ebx
|
||||||
|
pop esi
|
||||||
|
pop ebx
|
||||||
|
leave
|
||||||
|
ret
|
||||||
|
|
||||||
|
section .rodata
|
||||||
|
warn_no_mmap db "[WARN] mmap flag not set", 0
|
||||||
|
msg_mmap_entry db "Memory Map Entry:", 0xA
|
||||||
|
db 0x9, "Address: (hi): %x (lo): %x", 0xA
|
||||||
|
db 0x9, "Length: (hi): %x (lo): %x", 0xA
|
||||||
|
db 0x9, "Type: %x", 0
|
||||||
|
msg_mem_block db "Free Memory:", 0xA
|
||||||
|
db 0x9, "Address: %x", 0xA
|
||||||
|
db 0x9, "Length: %x", 0
|
||||||
|
file db __FILE__, 0
|
|
@ -30,7 +30,6 @@ putstr:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
puthex:
|
puthex:
|
||||||
xchg bx, bx
|
|
||||||
push ebp
|
push ebp
|
||||||
mov ebp, esp
|
mov ebp, esp
|
||||||
push edi
|
push edi
|
||||||
|
|
Loading…
Reference in a new issue