fix: memory layout and startup
This commit is contained in:
parent
92d8a91be4
commit
8dc53f662e
7 changed files with 48 additions and 32 deletions
|
|
@ -6,7 +6,7 @@ output_dir := $(root_dir)/output
|
||||||
|
|
||||||
LD := ld
|
LD := ld
|
||||||
CXX := clang++
|
CXX := clang++
|
||||||
CXXFLAGS := -std=c++20 -fpie -fno-strict-aliasing -fno-stack-protector -fno-asynchronous-unwind-tables -fno-exceptions -fno-rtti -fno-common -mno-red-zone -mgeneral-regs-only -ffreestanding -Og -g -Wall -Wextra -Wno-reserved-identifier -I$(root_dir)/include
|
CXXFLAGS := -std=c++20 -fpie -fno-strict-aliasing -fno-stack-protector -fno-asynchronous-unwind-tables -fno-exceptions -fno-rtti -fno-common -mno-red-zone -mgeneral-regs-only -ffreestanding -O2 -g -Wall -Wextra -Wno-reserved-identifier -I$(root_dir)/include
|
||||||
|
|
||||||
source_files := $(shell find $(source_dir) -type f -name "*.cpp")
|
source_files := $(shell find $(source_dir) -type f -name "*.cpp")
|
||||||
object_files := $(patsubst $(source_dir)/%,$(object_dir)/%.o,$(source_files))
|
object_files := $(patsubst $(source_dir)/%,$(object_dir)/%.o,$(source_files))
|
||||||
|
|
@ -23,6 +23,10 @@ kernel.bin: $(object_files)
|
||||||
@echo "Disassembling kernel"
|
@echo "Disassembling kernel"
|
||||||
@objdump -dC $(output_dir)/kernel.bin > $(output_dir)/kernel.asm
|
@objdump -dC $(output_dir)/kernel.bin > $(output_dir)/kernel.asm
|
||||||
@objdump -DC $(output_dir)/kernel.bin > $(output_dir)/kernel_full.asm
|
@objdump -DC $(output_dir)/kernel.bin > $(output_dir)/kernel_full.asm
|
||||||
|
@echo "Dumping strings"
|
||||||
|
@strings -t x $(output_dir)/kernel.bin > $(output_dir)/kernel.strings
|
||||||
|
@echo "Hexdumping sections"
|
||||||
|
@objdump -sC $(output_dir)/kernel.bin > $(output_dir)/kernel.hex
|
||||||
|
|
||||||
|
|
||||||
iso: kernel.bin
|
iso: kernel.bin
|
||||||
|
|
|
||||||
|
|
@ -245,7 +245,7 @@ struct info {
|
||||||
|
|
||||||
inline info* get_multiboot_info() {
|
inline info* get_multiboot_info() {
|
||||||
auto addr = read_symbol("__multiboot_info");
|
auto addr = read_symbol("__multiboot_info");
|
||||||
uint32_t phys = *paddr_t{addr}.access<uint32_t>();
|
uint32_t phys = *paddr_t{addr}.access<volatile uint32_t>();
|
||||||
return paddr_t{phys}.access<info>();
|
return paddr_t{phys}.access<info>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ struct TextAttr {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void initFromLow();
|
||||||
void clear();
|
void clear();
|
||||||
void print(const char* str, TextAttr attr = {});
|
void print(const char* str, TextAttr attr = {});
|
||||||
void print_dec(uint64_t value, TextAttr attr = {});
|
void print_dec(uint64_t value, TextAttr attr = {});
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
|
|
||||||
ENTRY(__start)
|
ENTRY(__start)
|
||||||
|
|
||||||
|
high_base = 0xFFFF800000000000;
|
||||||
|
|
||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
MULTIBOOT_HEADER_PV : ORIGIN = 16k, LENGTH = 4k
|
MULTIBOOT_HEADER_PV : ORIGIN = 16k, LENGTH = 4k
|
||||||
|
|
@ -9,7 +11,7 @@ MEMORY
|
||||||
|
|
||||||
KERNEL_MEMORY_P : ORIGIN = 64k, LENGTH = (1024M - ORIGIN(KERNEL_MEMORY_P))
|
KERNEL_MEMORY_P : ORIGIN = 64k, LENGTH = (1024M - ORIGIN(KERNEL_MEMORY_P))
|
||||||
|
|
||||||
HIGH_KERNEL_V : ORIGIN = 0xFFFF800000000000 + 64k, LENGTH = LENGTH(KERNEL_MEMORY_P)
|
HIGH_KERNEL_V : ORIGIN = high_base + ORIGIN(KERNEL_MEMORY_P), LENGTH = LENGTH(KERNEL_MEMORY_P)
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
|
|
@ -29,31 +31,31 @@ SECTIONS
|
||||||
KEEP(*(.startup_data))
|
KEEP(*(.startup_data))
|
||||||
__startup_data_end__ = .;
|
__startup_data_end__ = .;
|
||||||
} > START_MEMORY_PV
|
} > START_MEMORY_PV
|
||||||
.text : {
|
.text : AT(ADDR(.text) - high_base) {
|
||||||
__text_start__ = .;
|
__text_start__ = .;
|
||||||
*(EXCLUDE_FILE(*trampoline*) .text)
|
*(EXCLUDE_FILE(*trampoline*) .text)
|
||||||
__text_end__ = .;
|
__text_end__ = .;
|
||||||
} > HIGH_KERNEL_V AT > KERNEL_MEMORY_P
|
} > HIGH_KERNEL_V
|
||||||
.rodata : {
|
.rodata : AT(ADDR(.rodata) - high_base) {
|
||||||
__rodata_start__ = .;
|
__rodata_start__ = .;
|
||||||
*(EXCLUDE_FILE(*trampoline*) .rodata)
|
*(EXCLUDE_FILE(*trampoline*) .rodata)
|
||||||
__rodata_end__ = .;
|
__rodata_end__ = .;
|
||||||
} > HIGH_KERNEL_V AT > KERNEL_MEMORY_P
|
} > HIGH_KERNEL_V
|
||||||
.data : {
|
.data : AT(ADDR(.data) - high_base) {
|
||||||
__data_start__ = .;
|
__data_start__ = .;
|
||||||
*(EXCLUDE_FILE(*trampoline*) .data)
|
*(EXCLUDE_FILE(*trampoline*) .data)
|
||||||
__data_end__ = .;
|
__data_end__ = .;
|
||||||
} > HIGH_KERNEL_V AT > KERNEL_MEMORY_P
|
} > HIGH_KERNEL_V
|
||||||
.bss : {
|
.reserved_ranges : AT(ADDR(.reserved_ranges) - high_base) {
|
||||||
__bss_start__ = .;
|
|
||||||
*(EXCLUDE_FILE(*trampoline*) .bss)
|
|
||||||
__bss_end__ = .;
|
|
||||||
} > HIGH_KERNEL_V AT > KERNEL_MEMORY_P
|
|
||||||
.reserved_ranges : {
|
|
||||||
__reserved_ranges_start__ = .;
|
__reserved_ranges_start__ = .;
|
||||||
KEEP(*(.reserved_ranges))
|
KEEP(*(.reserved_ranges))
|
||||||
__reserved_ranges_end__ = .;
|
__reserved_ranges_end__ = .;
|
||||||
} > HIGH_KERNEL_V AT > KERNEL_MEMORY_P
|
} > HIGH_KERNEL_V
|
||||||
|
.bss (NOLOAD) : AT(ADDR(.bss) - high_base) {
|
||||||
|
__bss_start__ = .;
|
||||||
|
*(EXCLUDE_FILE(*trampoline*) .bss)
|
||||||
|
__bss_end__ = .;
|
||||||
|
} > HIGH_KERNEL_V
|
||||||
|
|
||||||
.trampoline_text : {
|
.trampoline_text : {
|
||||||
__trampoline_text_start__ = .;
|
__trampoline_text_start__ = .;
|
||||||
|
|
@ -67,18 +69,18 @@ SECTIONS
|
||||||
__trampoline_data_end__ = .;
|
__trampoline_data_end__ = .;
|
||||||
} > TRAMPOLINE_PV
|
} > TRAMPOLINE_PV
|
||||||
|
|
||||||
.trampoline_bss : {
|
|
||||||
__trampoline_bss_start__ = .;
|
|
||||||
*trampoline*(.bss)
|
|
||||||
__trampoline_bss_end__ = .;
|
|
||||||
} > TRAMPOLINE_PV
|
|
||||||
|
|
||||||
.trampoline_rodata : {
|
.trampoline_rodata : {
|
||||||
__trampoline_rodata_start__ = .;
|
__trampoline_rodata_start__ = .;
|
||||||
*trampoline*(.rodata)
|
*trampoline*(.rodata)
|
||||||
__trampoline_rodata_end__ = .;
|
__trampoline_rodata_end__ = .;
|
||||||
} > TRAMPOLINE_PV
|
} > TRAMPOLINE_PV
|
||||||
|
|
||||||
|
.trampoline_bss (NOLOAD) : {
|
||||||
|
__trampoline_bss_start__ = .;
|
||||||
|
*trampoline*(.bss)
|
||||||
|
__trampoline_bss_end__ = .;
|
||||||
|
} > TRAMPOLINE_PV
|
||||||
|
|
||||||
/DISCARD/ : {
|
/DISCARD/ : {
|
||||||
*(.comment)
|
*(.comment)
|
||||||
*(.eh_frame)
|
*(.eh_frame)
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,8 @@ static void loadMultiboot() {
|
||||||
}
|
}
|
||||||
|
|
||||||
[[maybe_unused]] [[noreturn]] __attribute__((used)) void init() {
|
[[maybe_unused]] [[noreturn]] __attribute__((used)) void init() {
|
||||||
|
initFromLow();
|
||||||
print("Reached init\n", {});
|
print("Reached init\n", {});
|
||||||
//step("multiboot", loadMultiboot);
|
step("multiboot", loadMultiboot);
|
||||||
halt();
|
halt();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,17 +11,14 @@ static constexpr int HEX_TOP_SHIFT = (sizeof(uint64_t) * 8) - HEX_BITS;
|
||||||
|
|
||||||
static const char hex_chars[] = "0123456789ABCDEF";
|
static const char hex_chars[] = "0123456789ABCDEF";
|
||||||
|
|
||||||
static volatile uint32_t* cursor() {
|
static uint32_t cursor;
|
||||||
auto cursor_addr = read_symbol("__cursor");
|
|
||||||
return paddr_t{cursor_addr}.access<volatile uint32_t>();
|
|
||||||
}
|
|
||||||
|
|
||||||
static volatile uint16_t* vga_cell(uint32_t offset) {
|
static volatile uint16_t* vga_cell(uint32_t offset) {
|
||||||
return paddr_t{VGA_PHYS_BASE + offset}.access<volatile uint16_t>();
|
return paddr_t{VGA_PHYS_BASE + offset}.access<volatile uint16_t>();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void next_line() {
|
static void next_line() {
|
||||||
*cursor() = ((*cursor() + BYTES_PER_ROW - 1) / BYTES_PER_ROW) * BYTES_PER_ROW;
|
cursor = ((cursor + BYTES_PER_ROW - 1) / BYTES_PER_ROW) * BYTES_PER_ROW;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void put_char(char ch, uint16_t attr_word) {
|
static void put_char(char ch, uint16_t attr_word) {
|
||||||
|
|
@ -29,12 +26,17 @@ static void put_char(char ch, uint16_t attr_word) {
|
||||||
next_line();
|
next_line();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
*vga_cell(*cursor()) = attr_word | (uint8_t)ch;
|
*vga_cell(cursor) = attr_word | (uint16_t)ch;
|
||||||
*cursor() += BYTES_PER_CELL;
|
cursor += BYTES_PER_CELL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void initFromLow () {
|
||||||
|
auto __cursor = read_symbol("__cursor");
|
||||||
|
cursor = *paddr_t{__cursor}.access<volatile uint32_t>();
|
||||||
}
|
}
|
||||||
|
|
||||||
void clear() {
|
void clear() {
|
||||||
*cursor() = 0;
|
cursor = 0;
|
||||||
for (int i = 0; i < VGA_COLS * VGA_ROWS; i++) {
|
for (int i = 0; i < VGA_COLS * VGA_ROWS; i++) {
|
||||||
*vga_cell(i * BYTES_PER_CELL) = 0;
|
*vga_cell(i * BYTES_PER_CELL) = 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -141,6 +141,12 @@ __clear:
|
||||||
mov $0xb8000, %edi
|
mov $0xb8000, %edi
|
||||||
mov $0x2000, %ecx
|
mov $0x2000, %ecx
|
||||||
rep stosw
|
rep stosw
|
||||||
|
mov $0x3D4, %dx
|
||||||
|
mov $0x0A, %al
|
||||||
|
out %al, %dx
|
||||||
|
inc %dx
|
||||||
|
mov $0x20, %al
|
||||||
|
out %al, %dx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
__print:
|
__print:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue