Better ELF header parsing.

This commit is contained in:
Alexander Myltsev 2022-11-25 10:42:07 +00:00
parent 1d4edf4e0c
commit f564a042d8
3 changed files with 18 additions and 10 deletions

View File

@ -8,7 +8,7 @@ GDB=x86_64-elf-gdb
endif endif
CFLAGS = -fno-pic -ffreestanding -static -fno-builtin -fno-strict-aliasing \ CFLAGS = -fno-pic -ffreestanding -static -fno-builtin -fno-strict-aliasing \
-O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -Os -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer
CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector) CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector)
run: image.bin run: image.bin

View File

@ -1,7 +1,7 @@
#include "port.h" #include "port.h"
#include "../string.h" #include "../string.h"
char* const video_memory = (char*) 0xb8000; static char* const video_memory = (char*) 0xb8000;
enum colors16 { enum colors16 {
black = 0, black = 0,

24
mbr.S
View File

@ -30,9 +30,12 @@ get_drive_geometry:
.equ ELF32_PHENTSIZE_OFFSET, ELF32_PHDR_OFFSET + 14 .equ ELF32_PHENTSIZE_OFFSET, ELF32_PHDR_OFFSET + 14
.equ ELF32_PHNUM_OFFSET, ELF32_PHENTSIZE_OFFSET + 2 .equ ELF32_PHNUM_OFFSET, ELF32_PHENTSIZE_OFFSET + 2
.equ ELF32_PHDR_P_OFFSET, 4 .equ ELF32_PHDR_P_OFFSET, 4
.equ ELF32_PHDR_PTYPE_OFFSET, 0
.equ ELF32_PHDR_FILESZ_OFFSET, 4*4 .equ ELF32_PHDR_FILESZ_OFFSET, 4*4
.equ KERNEL_OFFSET, 0x1000 .equ KERNEL_OFFSET, 0x1000
.equ PT_LOAD, 1
.equ MBR_SECTORS, 2 .equ MBR_SECTORS, 2
.equ SECTOR_BASE, 1 .equ SECTOR_BASE, 1
.equ ELFHDR_SECTORS, 8 .equ ELFHDR_SECTORS, 8
@ -48,18 +51,23 @@ load_kernel:
mov KERNEL_OFFSET + ELF32_ENTRY_OFFSET, %si mov KERNEL_OFFSET + ELF32_ENTRY_OFFSET, %si
mov %si, entry // store entry point mov %si, entry // store entry point
#if 0 mov KERNEL_OFFSET + ELF32_PHNUM_OFFSET, %si
mov KERNEL_OFFSET + ELF32_PHNUM_OFFSET, %ax read_segment:
dec %ax // no offset to the first entry dec %si // no offset to the first entry
mov %si, %ax
mulb KERNEL_OFFSET + ELF32_PHENTSIZE_OFFSET mulb KERNEL_OFFSET + ELF32_PHENTSIZE_OFFSET
mov %ax, %di mov %ax, %di
add KERNEL_OFFSET + ELF32_PHDR_OFFSET, %di add KERNEL_OFFSET + ELF32_PHDR_OFFSET, %di
// now di holds offset to the last phentry // now di holds offset to the phentry
#else mov KERNEL_OFFSET + ELF32_PHDR_PTYPE_OFFSET(%di), %ax
mov KERNEL_OFFSET + ELF32_PHDR_OFFSET, %di cmp $PT_LOAD, %ax
// now di holds offset to the first phentry jnz read_segment // not a PT_LOAD segment
#endif
mov KERNEL_OFFSET + ELF32_PHDR_FILESZ_OFFSET(%di), %ax mov KERNEL_OFFSET + ELF32_PHDR_FILESZ_OFFSET(%di), %ax
test %ax, %ax
jz read_segment // empty segment
// now di holds offset to the last phentry loaded from file, ax its filesz
add KERNEL_OFFSET + ELF32_PHDR_P_OFFSET(%di), %ax add KERNEL_OFFSET + ELF32_PHDR_P_OFFSET(%di), %ax
sub $0x1000, %ax // we won't load the header sub $0x1000, %ax // we won't load the header
add $SECTOR_SIZE - 1, %ax add $SECTOR_SIZE - 1, %ax