Build Multiboot 2 file

This commit is contained in:
Alex Kotov 2022-11-27 16:10:32 +04:00
parent d565cebb97
commit 466fde1d2c
Signed by: kotovalexarian
GPG Key ID: 553C0EBBEB5D5F08
6 changed files with 135 additions and 10 deletions

View File

@ -1,6 +1,4 @@
.PHONY: $(MRUBYVISOR)
CCPREFIX = /home/kotovalexarian/repos/global/tailix/cross/root/bin/x86_64-elf-
CCPREFIX = /home/kotovalexarian/repos/global/tailix/cross/root/bin/i386-elf-
AR = $(CCPREFIX)ar
AS = $(CCPREFIX)as
@ -8,12 +6,14 @@ CC = $(CCPREFIX)gcc
LD = $(CCPREFIX)ld
RAKE = rake
RANLIB = $(CCPREFIX)ranlib
QEMU = qemu-system-i386
ABS_REPO = $(shell pwd)
IMAGE = image.iso
ROOTFS = rootfs
DEST = dest
SRC = src
GRUBCFG = $(ROOTFS)/boot/grub/grub.cfg
LIBKERNAUX = $(DEST)/lib/libkernaux.a
@ -22,29 +22,32 @@ MRUBYVISOR = $(ROOTFS)/boot/mrubyvisor.multiboot2
MRUBY_NAME = mrubyvisor
.PHONY: $(IMAGE) $(MRUBYVISOR)
all: runc
runc: $(IMAGE)
qemu-system-x86_64 -cdrom $< -serial stdio -display none
$(QEMU) -cdrom $< -serial stdio -display none
runw: $(IMAGE)
qemu-system-x86_64 -cdrom $< -serial stdio
$(QEMU) -cdrom $< -serial stdio
clean:
rm -rf $(MRUBYVISOR) $(DEST)/*
$(MAKE) -C $(SRC) clean
$(IMAGE): $(GRUBCFG) $(MRUBYVISOR)
grub-mkrescue $(ROOTFS) -o $@
$(MRUBYVISOR): $(LIBKERNAUX) $(LIBMRUBY)
make -C src mrubyvisor.multiboot2
cp src/mrubyvisor.multiboot2 $@
$(MAKE) -C $(SRC) mrubyvisor.multiboot2 CCPREFIX='$(CCPREFIX)' DEST='$(ABS_REPO)/$(DEST)'
cp $(SRC)/mrubyvisor.multiboot2 $@
$(LIBKERNAUX):
cd vendor/libkernaux && ./autogen.sh
cd vendor/libkernaux && ./configure --host='x86_64-elf' --prefix='$(ABS_REPO)/$(DEST)' --enable-freestanding --with-drivers --with-libc AR='$(AR)' AS='$(AS)' CC='$(CC)' LD='$(LD)' RANLIB='$(RANLIB)'
cd vendor/libkernaux && make
cd vendor/libkernaux && make install
cd vendor/libkernaux && ./configure --host='i386-elf' --prefix='$(ABS_REPO)/$(DEST)' --enable-freestanding --with-drivers --with-libc AR='$(AR)' AS='$(AS)' CC='$(CC)' LD='$(LD)' RANLIB='$(RANLIB)'
cd vendor/libkernaux && $(MAKE)
cd vendor/libkernaux && $(MAKE) install
$(LIBMRUBY): $(LIBKERNAUX)
cd vendor/mruby && $(RAKE) MRUBY_CONFIG='$(ABS_REPO)/build_config.rb' CROSS_AR='$(AR)' CROSS_CC='$(CC)' CROSS_LD='$(LD)'

3
src/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
*.o
/mrubyvisor.multiboot2

View File

@ -0,0 +1,37 @@
AR = $(CCPREFIX)ar
AS = $(CCPREFIX)as
CC = $(CCPREFIX)gcc
LD = $(CCPREFIX)ld
RANLIB = $(CCPREFIX)ranlib
MRUBYVISOR = mrubyvisor.multiboot2
CFLAGS = \
-std=gnu99 \
-pedantic \
-Wall \
-Wextra \
-ffreestanding \
-fno-builtin \
-fno-stack-protector \
-I$(DEST)/include
CPPFLAGS = \
-DKERNAUX_DEBUG
OBJS = start.S.o
all: $(MRUBYVISOR)
clean:
rm -f $(MRUBYVISOR) $(OBJS)
$(MRUBYVISOR): $(OBJS)
$(CC) -T linker.ld -o $@ $^ -ffreestanding -nostdlib -lkernaux -lmruby -lgcc -Wl,-L$(DEST)/lib
grub-file --is-x86-multiboot2 $@
%.c.o: %.c
$(CC) -c $< -o $@ $(CFLAGS) $(CPPFLAGS)
%.S.o: %.S
$(AS) $< -o $@

38
src/linker.ld Normal file
View File

@ -0,0 +1,38 @@
OUTPUT_ARCH("i386")
ENTRY(_start)
_kernel_offset = 0xC0000000; /* 3 GB */
_kernel_phys_base = 4M;
_kernel_virt_base = (_kernel_phys_base + _kernel_offset);
_kernel_stack_size = _kernel_stack_end - _kernel_stack_start;
SECTIONS
{
. = _kernel_phys_base;
.text BLOCK(4K) : ALIGN(4K)
{
*(.multiboot)
*(.text)
}
.rodata BLOCK(4K) : ALIGN(4K)
{
*(.rodata)
}
.data BLOCK(4K) : ALIGN(4K)
{
*(.data)
}
.bss BLOCK(4K) : ALIGN(4K)
{
*(COMMON)
*(.bss)
}
_kernel_size = . - _kernel_phys_base;
}

44
src/start.S Normal file
View File

@ -0,0 +1,44 @@
.set MULTIBOOT_MAGIC, 0xE85250D6
.set MULTIBOOT_ARCH, 0
.set MULTIBOOT_LENGTH, 16 + 8
.set MULTIBOOT_CHECKSUM, -(MULTIBOOT_MAGIC + MULTIBOOT_ARCH + MULTIBOOT_LENGTH)
.section .multiboot
.align 4
.long MULTIBOOT_MAGIC
.long MULTIBOOT_ARCH
.long MULTIBOOT_LENGTH
.long MULTIBOOT_CHECKSUM
.long 0
.long 8
.section .bss
.global _kernel_stack_start
.global _kernel_stack_end
.align 16
_kernel_stack_start:
.skip 16384 # 16 KiB
_kernel_stack_end:
.section .text
.global _start
.type _start, @function
_start:
mov $_kernel_stack_end, %esp // Initialize stack
push %ebx // Multiboot information pointer
push %eax // Multiboot magic number
//call main
.size _start, . - _start