Upload files to "/"
This commit is contained in:
71
Makefile
Normal file
71
Makefile
Normal file
@ -0,0 +1,71 @@
|
||||
# === Config ===
|
||||
TARGET := boot/espresso.bin
|
||||
ISO := boot/espresso.iso
|
||||
CC := i686-elf-gcc
|
||||
AS := i686-elf-as
|
||||
NASM := nasm
|
||||
NASMFLAGS := -f elf32
|
||||
CFLAGS := -std=gnu99 -ffreestanding -O2 -Wall -Wextra -msse
|
||||
LDFLAGS := -T linker.ld -ffreestanding -O2 -nostdlib
|
||||
SRC_DIRS := kernel drivers src lib
|
||||
INCLUDE_DIRS := include
|
||||
INCLUDES := $(addprefix -I, $(INCLUDE_DIRS))
|
||||
ISO_DIR := isodir
|
||||
BOOT_DIR := $(ISO_DIR)/boot
|
||||
GRUB_DIR := $(BOOT_DIR)/grub
|
||||
GRUB_CFG := grub.cfg
|
||||
|
||||
# === File collection ===
|
||||
C_SRCS := $(foreach dir, $(SRC_DIRS), $(shell find $(dir) -name '*.c'))
|
||||
S_SRCS := boot.s crti.s crtn.s misc_asm.s
|
||||
NASM_SRCS := idt.asm isr128.asm gdt.asm isr_stub_table.asm
|
||||
CRTI_OBJ := crti.o
|
||||
CRTBEGIN_OBJ := $(shell $(CC) $(CFLAGS) -print-file-name=crtbegin.o)
|
||||
CRTEND_OBJ := $(shell $(CC) $(CFLAGS) -print-file-name=crtend.o)
|
||||
CRTN_OBJ := crtn.o
|
||||
OBJS := $(C_SRCS:.c=.o) $(S_SRCS:.s=.o) $(NASM_SRCS:.asm=.o)
|
||||
|
||||
OBJ_LINK_LIST := $(CRTI_OBJ) $(CRTBEGIN_OBJ) $(OBJS) $(CRTEND_OBJ) $(CRTN_OBJ)
|
||||
INTERNAL_OBJS := $(CRTI_OBJ) $(OBJS) $(CRTN_OBJ)
|
||||
|
||||
# === Build all targets ===
|
||||
build: all iso run clean
|
||||
|
||||
# === Default target ===
|
||||
all: $(TARGET)
|
||||
|
||||
# === Linking ===
|
||||
$(TARGET): boot.o $(filter-out boot.o, $(OBJ_LINK_LIST))
|
||||
@mkdir -p $(dir $@)
|
||||
$(CC) $(LDFLAGS) -o $@ $^ -lgcc
|
||||
|
||||
# === Compiling C files ===
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
|
||||
|
||||
# === Assembling S files ===
|
||||
%.o: %.s
|
||||
$(AS) $< -o $@
|
||||
|
||||
%.o: %.asm
|
||||
$(NASM) $(NASMFLAGS) $< -o $@
|
||||
|
||||
# === ISO generation ===
|
||||
iso: $(TARGET)
|
||||
@grub-file --is-x86-multiboot $(TARGET) && echo "multiboot confirmed" || (echo "not multiboot" && exit 1)
|
||||
mkdir -p $(GRUB_DIR)
|
||||
cp $(TARGET) $(BOOT_DIR)/
|
||||
cp $(GRUB_CFG) $(GRUB_DIR)/
|
||||
grub-mkrescue -o $(ISO) $(ISO_DIR)
|
||||
|
||||
# === Run in QEMU ===
|
||||
run: iso
|
||||
qemu-system-i386 -kernel $(TARGET) -drive file=espresso.img,format=raw,if=ide,readonly=off,rerror=report,werror=report -cpu qemu32,sse2 #-singlestep
|
||||
|
||||
# === Clean all build artifacts ===
|
||||
clean:
|
||||
rm -f $(INTERNAL_OBJS) $(TARGET) $(ISO)
|
||||
rm -rf $(ISO_DIR)
|
||||
|
||||
.PHONY: all clean iso run
|
||||
|
10
isr128.asm
Normal file
10
isr128.asm
Normal file
@ -0,0 +1,10 @@
|
||||
[bits 32]
|
||||
global isr128
|
||||
extern isr_handler
|
||||
extern common_isr_stub
|
||||
|
||||
isr128:
|
||||
cli
|
||||
push dword 0 ; No error code
|
||||
push dword 128 ; Interrupt number
|
||||
jmp common_isr_stub
|
85
isr_stub_table.asm
Normal file
85
isr_stub_table.asm
Normal file
@ -0,0 +1,85 @@
|
||||
[bits 32]
|
||||
global isr_stub_table
|
||||
global isr0, isr1, isr2, isr3, isr4, isr5, isr6, isr7
|
||||
global isr8, isr9, isr10, isr11, isr12, isr13, isr14, isr15
|
||||
global isr16, isr17, isr18, isr19, isr20, isr21, isr22, isr23
|
||||
global isr24, isr25, isr26, isr27, isr28, isr29, isr30, isr31
|
||||
|
||||
extern isr_handler
|
||||
extern _push_regs
|
||||
extern _pop_regs
|
||||
|
||||
%macro ISR_NOERR 1
|
||||
isr%1:
|
||||
cli
|
||||
push dword 0 ; Fake error code
|
||||
push dword %1 ; Interrupt number
|
||||
jmp isr_common_stub
|
||||
%endmacro
|
||||
|
||||
%macro ISR_ERR 1
|
||||
isr%1:
|
||||
cli
|
||||
push dword %1 ; Interrupt number
|
||||
jmp isr_common_stub
|
||||
%endmacro
|
||||
|
||||
; ISRs 0-31 (exceptions)
|
||||
ISR_NOERR 0
|
||||
ISR_NOERR 1
|
||||
ISR_NOERR 2
|
||||
ISR_NOERR 3
|
||||
ISR_NOERR 4
|
||||
ISR_NOERR 5
|
||||
ISR_NOERR 6
|
||||
ISR_NOERR 7
|
||||
ISR_ERR 8 ; Double fault
|
||||
ISR_NOERR 9
|
||||
ISR_ERR 10 ; Invalid TSS
|
||||
ISR_ERR 11 ; Segment not present
|
||||
ISR_ERR 12 ; Stack segment fault
|
||||
ISR_ERR 13 ; General protection fault
|
||||
ISR_ERR 14 ; Page fault
|
||||
ISR_NOERR 15
|
||||
ISR_NOERR 16
|
||||
ISR_NOERR 17
|
||||
ISR_NOERR 18
|
||||
ISR_NOERR 19
|
||||
ISR_NOERR 20
|
||||
ISR_NOERR 21
|
||||
ISR_NOERR 22
|
||||
ISR_NOERR 23
|
||||
ISR_NOERR 24
|
||||
ISR_NOERR 25
|
||||
ISR_NOERR 26
|
||||
ISR_NOERR 27
|
||||
ISR_NOERR 28
|
||||
ISR_NOERR 29
|
||||
ISR_ERR 30 ; Security exception
|
||||
ISR_NOERR 31
|
||||
|
||||
isr_common_stub:
|
||||
call _push_regs
|
||||
push ds
|
||||
push es
|
||||
push fs
|
||||
push gs
|
||||
|
||||
mov ax, 0x10
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
mov fs, ax
|
||||
mov gs, ax
|
||||
|
||||
push esp
|
||||
call isr_handler
|
||||
add esp, 4
|
||||
|
||||
pop gs
|
||||
pop fs
|
||||
pop es
|
||||
pop ds
|
||||
call _pop_regs
|
||||
add esp, 8
|
||||
sti
|
||||
iret
|
71
linker.ld
Normal file
71
linker.ld
Normal file
@ -0,0 +1,71 @@
|
||||
/* The bootloader will look at this image and start execution at the symbol
|
||||
designated as the entry point. */
|
||||
ENTRY(_start)
|
||||
|
||||
/* Tell where the various sections of the object files will be put in the final
|
||||
kernel image. */
|
||||
SECTIONS
|
||||
{
|
||||
/* It used to be universally recommended to use 1M as a start offset,
|
||||
as it was effectively guaranteed to be available under BIOS systems.
|
||||
However, UEFI has made things more complicated, and experimental data
|
||||
strongly suggests that 2M is a safer place to load. In 2016, a new
|
||||
feature was introduced to the multiboot2 spec to inform bootloaders
|
||||
that a kernel can be loaded anywhere within a range of addresses and
|
||||
will be able to relocate itself to run from such a loader-selected
|
||||
address, in order to give the loader freedom in selecting a span of
|
||||
memory which is verified to be available by the firmware, in order to
|
||||
work around this issue. This does not use that feature, so 2M was
|
||||
chosen as a safer option than the traditional 1M. */
|
||||
. = 2M;
|
||||
|
||||
/* First put the multiboot header, as it is required to be put very early
|
||||
in the image or the bootloader won't recognize the file format.
|
||||
Next we'll put the .text section. */
|
||||
.text BLOCK(4K) : ALIGN(4K)
|
||||
{
|
||||
KEEP(*(.multiboot))
|
||||
*(.text)
|
||||
}
|
||||
|
||||
/* Read-only data. */
|
||||
.rodata BLOCK(4K) : ALIGN(4K)
|
||||
{
|
||||
*(.rodata)
|
||||
}
|
||||
|
||||
/* Read-write data (initialized) */
|
||||
.data BLOCK(4K) : ALIGN(4K)
|
||||
{
|
||||
*(.data)
|
||||
}
|
||||
|
||||
/* Read-write data (uninitialized) and stack */
|
||||
.bss BLOCK(4K) : ALIGN(4K)
|
||||
{
|
||||
*(COMMON)
|
||||
*(.bss)
|
||||
}
|
||||
|
||||
/* Include the list of initialization functions sorted. */
|
||||
.init_array :
|
||||
{
|
||||
crti.o(.init_array)
|
||||
KEEP (*(SORT(EXCLUDE_FILE(crti.o crtn.o) .init_array.*)))
|
||||
KEEP (*(EXCLUDE_FILE(crti.o crtn.o) .init_array))
|
||||
crtn.o(.init_array)
|
||||
}
|
||||
|
||||
/* Include the list of termination functions sorted. */
|
||||
.fini_array :
|
||||
{
|
||||
crti.o(.fini_array)
|
||||
KEEP (*(SORT(EXCLUDE_FILE(crti.o crtn.o) .fini_array.*)))
|
||||
KEEP (*(EXCLUDE_FILE(crti.o crtn.o) .fini_array))
|
||||
crtn.o(.fini_array)
|
||||
}
|
||||
|
||||
/* The compiler may produce other sections, by default it will put them in
|
||||
a segment with the same name. Simply add stuff here as needed. */
|
||||
}
|
||||
|
62
misc_asm.s
Normal file
62
misc_asm.s
Normal file
@ -0,0 +1,62 @@
|
||||
/*
|
||||
A bunch of functions I could have written in C (or not), but decided not to,
|
||||
Mostly so I could get more experience in assembler.
|
||||
*/
|
||||
|
||||
/*
|
||||
DO NOT USE "pusha" AND/OR "popa"!!!
|
||||
THEY ARE DEPRECATED (or something like that)
|
||||
AND SHOULD NOT BE USED!!!
|
||||
INSTEAD PUSH/POP REGISTERS ON/OFF THE STACK INDIVIDUALLY!!!
|
||||
*/
|
||||
|
||||
|
||||
.section .text
|
||||
|
||||
.global _enable_paging_asm
|
||||
|
||||
.global _push_regs
|
||||
.global _pop_regs
|
||||
|
||||
.global _hang_asm
|
||||
|
||||
_enable_paging_asm:
|
||||
push %eax
|
||||
|
||||
mov %cr0, %eax
|
||||
or $0x80000000, %eax
|
||||
mov %eax, %cr0
|
||||
|
||||
pop %eax
|
||||
|
||||
ret
|
||||
|
||||
_push_regs:
|
||||
push %eax
|
||||
push %ebx
|
||||
push %ecx
|
||||
push %edx
|
||||
push %esi
|
||||
push %edi
|
||||
push %esp
|
||||
push %ebp
|
||||
|
||||
ret
|
||||
|
||||
_pop_regs:
|
||||
pop %ebp
|
||||
pop %esp
|
||||
pop %edi
|
||||
pop %esi
|
||||
pop %edx
|
||||
pop %ecx
|
||||
pop %ebx
|
||||
pop %eax
|
||||
|
||||
ret
|
||||
|
||||
_hang_asm:
|
||||
hlt
|
||||
jmp _hang_asm
|
||||
|
||||
.section .data
|
Reference in New Issue
Block a user