feat: generate bootable iso
This commit is contained in:
parent
a202fadc9e
commit
33d96c6d68
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
|
@ -11,7 +11,7 @@ jobs:
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install build-essential llvm lld nasm
|
sudo apt-get install build-essential llvm lld nasm mtools
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
make
|
make
|
||||||
|
|
6
.gitignore
vendored
6
.gitignore
vendored
|
@ -1,7 +1,13 @@
|
||||||
*.o
|
*.o
|
||||||
*.img
|
*.img
|
||||||
*.bin
|
*.bin
|
||||||
|
*.iso
|
||||||
*~
|
*~
|
||||||
|
|
||||||
*.elf
|
*.elf
|
||||||
|
*.a
|
||||||
*.dump
|
*.dump
|
||||||
|
vmstupid
|
||||||
|
|
||||||
|
|
||||||
|
/sysroot
|
||||||
|
|
29
Makefile
29
Makefile
|
@ -5,10 +5,13 @@
|
||||||
AS = nasm
|
AS = nasm
|
||||||
LD = ld.lld
|
LD = ld.lld
|
||||||
OBJDUMP = llvm-objdump
|
OBJDUMP = llvm-objdump
|
||||||
|
QEMU = qemu-system-i386
|
||||||
RM = rm -f
|
RM = rm -f
|
||||||
|
MKCWD = mkdir -p $(@D)
|
||||||
|
INSTALL = install
|
||||||
|
|
||||||
BIN_DIR = bin
|
BIN_DIR = bin
|
||||||
DOC_DIR = doc
|
DOC_DIR = docs
|
||||||
KERNEL_DIR = kernel
|
KERNEL_DIR = kernel
|
||||||
LIB_DIR = lib
|
LIB_DIR = lib
|
||||||
TOOLS_DIR = tools
|
TOOLS_DIR = tools
|
||||||
|
@ -16,22 +19,28 @@ 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
|
||||||
|
QEMUFLAGS = -serial stdio
|
||||||
|
|
||||||
GARBADGE = stupid.img
|
GARBADGE = stupid.iso
|
||||||
|
|
||||||
include $(KERNEL_DIR)/build.mk
|
include $(KERNEL_DIR)/build.mk
|
||||||
|
include $(LIB_DIR)/build.mk
|
||||||
|
include $(BIN_DIR)/build.mk
|
||||||
|
|
||||||
all: stupid.img
|
all: stupid.iso
|
||||||
|
|
||||||
stupid.img: $(KERNEL_BIN) $(KERNEL_DUMP)
|
sysroot: $(KERNEL_BIN) $(KERNEL_DUMP) $(LIBS_BIN)
|
||||||
|
$(INSTALL) -d $@
|
||||||
|
$(INSTALL) -d $@/bin
|
||||||
|
$(INSTALL) -d $@/lib
|
||||||
|
$(INSTALL) $(KERNEL_BIN) $@
|
||||||
|
$(INSTALL) $(LIBS_BIN) $@/lib
|
||||||
|
|
||||||
#stupid.img: floppy.bin kern.bin
|
stupid.iso: sysroot
|
||||||
# mkdosfs -F 12 -C $@ 1440
|
$(CREATE-ISO) $@ $<
|
||||||
# dd status=noxfer conv=notrunc if=floppy.bin of=$@
|
|
||||||
# mcopy -i $@ kern.bin ::kern.sys
|
|
||||||
|
|
||||||
%.dump: %.elf
|
run: stupid.iso
|
||||||
$(OBJDUMP) -D $^ > $@
|
$(QEMU) $(QEMUFLAGS) -cdrom $<
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) $(GARBADGE)
|
$(RM) $(GARBADGE)
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
# StupidOS
|
# StupidOS
|
||||||
|
|
||||||
32-bit Operating System in assembly.
|
32-bit Operating System in assembly.
|
||||||
|
|
||||||
|
|
0
bin/build.mk
Normal file
0
bin/build.mk
Normal file
|
@ -1,9 +1,9 @@
|
||||||
include kernel/drivers/build.mk
|
include kernel/drivers/build.mk
|
||||||
|
|
||||||
KERNEL_SRCS = head.s gdt.s idt.s paging.s lib/log.s
|
KERNEL_SRCS = head.s gdt.s pic.s isr.s idt.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 = stupid.elf
|
KERNEL_BIN = vmstupid
|
||||||
KERNEL_DUMP = $(KERNEL_BIN:.elf=.dump)
|
KERNEL_DUMP = $(KERNEL_BIN).dump
|
||||||
|
|
||||||
KERNEL_ASFLAGS = $(ASFLAGS) -D__KERNEL__
|
KERNEL_ASFLAGS = $(ASFLAGS) -D__KERNEL__
|
||||||
|
|
||||||
|
@ -12,8 +12,11 @@ GARBADGE += $(KERNEL_OBJS) $(KERNEL_BIN) $(KERNEL_DUMP)
|
||||||
$(KERNEL_BIN): $(KERNEL_OBJS)
|
$(KERNEL_BIN): $(KERNEL_OBJS)
|
||||||
$(LD) -T $(KERNEL_DIR)/linker.ld -nostdlib -o $@ $^
|
$(LD) -T $(KERNEL_DIR)/linker.ld -nostdlib -o $@ $^
|
||||||
|
|
||||||
|
$(KERNEL_DUMP): $(KERNEL_BIN)
|
||||||
|
$(OBJDUMP) -D $^ > $@
|
||||||
|
|
||||||
kernel/lib/%.o: lib/base/%.s
|
kernel/lib/%.o: lib/base/%.s
|
||||||
mkdir -p $(@D)
|
@$(MKCWD)
|
||||||
$(AS) -felf -o $@ $< $(KERNEL_ASFLAGS)
|
$(AS) -felf -o $@ $< $(KERNEL_ASFLAGS)
|
||||||
|
|
||||||
kernel/%.o: kernel/%.s
|
kernel/%.o: kernel/%.s
|
||||||
|
|
|
@ -29,14 +29,21 @@ entry:
|
||||||
extern serial_init
|
extern serial_init
|
||||||
call serial_init
|
call serial_init
|
||||||
|
|
||||||
|
LOG msg_hello_world
|
||||||
|
|
||||||
extern setup_gdt
|
extern setup_gdt
|
||||||
call setup_gdt
|
call setup_gdt
|
||||||
|
|
||||||
|
extern setup_pic
|
||||||
|
call setup_pic
|
||||||
|
|
||||||
extern setup_idt
|
extern setup_idt
|
||||||
call setup_idt
|
call setup_idt
|
||||||
|
|
||||||
extern setup_paging
|
int3
|
||||||
call setup_paging
|
|
||||||
|
;extern setup_paging
|
||||||
|
;call setup_paging
|
||||||
|
|
||||||
LOG file
|
LOG file
|
||||||
|
|
||||||
|
@ -44,4 +51,8 @@ hang:
|
||||||
hlt
|
hlt
|
||||||
jmp hang
|
jmp hang
|
||||||
|
|
||||||
|
|
||||||
|
section .rodata
|
||||||
|
|
||||||
|
msg_hello_world db "StupidOS ", STUPID_VERSION, 0
|
||||||
file db __FILE__, 0
|
file db __FILE__, 0
|
||||||
|
|
20
kernel/idt.s
20
kernel/idt.s
|
@ -2,15 +2,33 @@
|
||||||
section .text
|
section .text
|
||||||
global setup_idt
|
global setup_idt
|
||||||
setup_idt:
|
setup_idt:
|
||||||
|
%assign i 0
|
||||||
|
extern isr %+ i
|
||||||
|
mov eax, isr %+ i
|
||||||
|
mov [idt_entries + i * 4], ax
|
||||||
|
shr eax, 16
|
||||||
|
mov word [idt_entries + i * 4 + 2], 0x8
|
||||||
|
mov byte [idt_entries + i * 4 + 5], 0x8E
|
||||||
|
mov [idt_entries + i * 4 + 6], ax
|
||||||
|
|
||||||
|
%assign i i+1
|
||||||
|
%rep 32
|
||||||
|
%endrep
|
||||||
lidt [idt_ptr]
|
lidt [idt_ptr]
|
||||||
|
sti
|
||||||
ret
|
ret
|
||||||
|
|
||||||
section .data
|
section .data
|
||||||
|
|
||||||
idt_ptr:
|
idt_ptr:
|
||||||
dw idt_entries.end - idt_entries - 1
|
dw 256 * 8
|
||||||
dd idt_entries
|
dd idt_entries
|
||||||
|
|
||||||
idt_entries:
|
idt_entries:
|
||||||
times 256 dd 0x00000000, 0x00000000
|
times 256 dd 0x00000000, 0x00000000
|
||||||
|
;; dw isr_low
|
||||||
|
;; dw kernel cs
|
||||||
|
;; db zero
|
||||||
|
;; db attr
|
||||||
|
;; dw isr_high
|
||||||
.end:
|
.end:
|
||||||
|
|
87
kernel/isr.s
Normal file
87
kernel/isr.s
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
[BITS 32]
|
||||||
|
|
||||||
|
%include "base.inc"
|
||||||
|
|
||||||
|
%macro ISR_NO_ERR 1
|
||||||
|
global isr%1
|
||||||
|
isr%1:
|
||||||
|
cli
|
||||||
|
push byte 0
|
||||||
|
push byte %1
|
||||||
|
jmp isr_handler
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
%macro ISR_ERR 1
|
||||||
|
global isr%1
|
||||||
|
isr%1:
|
||||||
|
cli
|
||||||
|
push byte 1
|
||||||
|
push byte %1
|
||||||
|
jmp isr_handler
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
section .text
|
||||||
|
|
||||||
|
ISR_NO_ERR 0
|
||||||
|
ISR_NO_ERR 1
|
||||||
|
ISR_NO_ERR 2
|
||||||
|
ISR_NO_ERR 3
|
||||||
|
ISR_NO_ERR 4
|
||||||
|
ISR_NO_ERR 5
|
||||||
|
ISR_NO_ERR 6
|
||||||
|
ISR_NO_ERR 7
|
||||||
|
ISR_ERR 8
|
||||||
|
ISR_NO_ERR 9
|
||||||
|
ISR_ERR 10
|
||||||
|
ISR_ERR 11
|
||||||
|
ISR_ERR 12
|
||||||
|
ISR_ERR 13
|
||||||
|
ISR_ERR 14
|
||||||
|
ISR_NO_ERR 15
|
||||||
|
ISR_NO_ERR 16
|
||||||
|
ISR_NO_ERR 17
|
||||||
|
ISR_NO_ERR 18
|
||||||
|
ISR_NO_ERR 19
|
||||||
|
ISR_NO_ERR 20
|
||||||
|
ISR_NO_ERR 21
|
||||||
|
ISR_NO_ERR 22
|
||||||
|
ISR_NO_ERR 23
|
||||||
|
ISR_NO_ERR 24
|
||||||
|
ISR_NO_ERR 25
|
||||||
|
ISR_NO_ERR 26
|
||||||
|
ISR_NO_ERR 27
|
||||||
|
ISR_NO_ERR 28
|
||||||
|
ISR_NO_ERR 29
|
||||||
|
ISR_NO_ERR 30
|
||||||
|
ISR_NO_ERR 31
|
||||||
|
|
||||||
|
global isr_handler
|
||||||
|
isr_handler:
|
||||||
|
pusha
|
||||||
|
|
||||||
|
mov ax, ds
|
||||||
|
push eax
|
||||||
|
mov ax, 0x10
|
||||||
|
mov ds, ax
|
||||||
|
mov es, ax
|
||||||
|
mov fs, ax
|
||||||
|
mov gs, ax
|
||||||
|
|
||||||
|
LOG msg_interrupt
|
||||||
|
|
||||||
|
pop eax
|
||||||
|
mov ds, ax
|
||||||
|
mov es, ax
|
||||||
|
mov fs, ax
|
||||||
|
mov gs, ax
|
||||||
|
|
||||||
|
popa
|
||||||
|
add esp, 8
|
||||||
|
|
||||||
|
sti
|
||||||
|
iret
|
||||||
|
|
||||||
|
section .rodata
|
||||||
|
|
||||||
|
msg_interrupt db "interrupt", 0
|
||||||
|
file db __FILE__, 0
|
24
kernel/pic.s
Normal file
24
kernel/pic.s
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
[BITS 32]
|
||||||
|
section .text
|
||||||
|
|
||||||
|
global setup_pic
|
||||||
|
setup_pic:
|
||||||
|
mov al, 0x11
|
||||||
|
out 0x20, al
|
||||||
|
out 0xA0, al
|
||||||
|
|
||||||
|
mov al, 0x20
|
||||||
|
out 0x21, al
|
||||||
|
mov al, 0x28
|
||||||
|
out 0xA1, al
|
||||||
|
|
||||||
|
mov al, 4
|
||||||
|
out 0x21, al
|
||||||
|
mov al, 2
|
||||||
|
out 0xA1, al
|
||||||
|
|
||||||
|
; mask all
|
||||||
|
mov al, 0xFF
|
||||||
|
out 0x21, al
|
||||||
|
out 0xA1, al
|
||||||
|
ret
|
10
lib/base.inc
10
lib/base.inc
|
@ -1,10 +1,16 @@
|
||||||
extern log_impl
|
extern log_impl
|
||||||
|
|
||||||
%macro LOG 1
|
%macro LOG 1-*
|
||||||
|
%rep %0
|
||||||
|
%rotate -1
|
||||||
push %1
|
push %1
|
||||||
|
%endrep
|
||||||
push file
|
push file
|
||||||
|
|
||||||
call log_impl
|
call log_impl
|
||||||
|
|
||||||
add esp, 8
|
add esp, 4
|
||||||
|
%rep %0
|
||||||
|
add esp, 4
|
||||||
|
%endrep
|
||||||
%endmacro
|
%endmacro
|
||||||
|
|
2
lib/base/build.mk
Normal file
2
lib/base/build.mk
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
LIBS += base
|
||||||
|
base_SRCS = log.s
|
|
@ -56,10 +56,13 @@ log_impl:
|
||||||
add esp, 4
|
add esp, 4
|
||||||
%else
|
%else
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
.loop:
|
||||||
mov eax, [ebp + 12]
|
mov eax, [ebp + 12]
|
||||||
push eax
|
push eax
|
||||||
call putstr
|
call putstr
|
||||||
add esp, 4
|
add esp, 4
|
||||||
|
.end:
|
||||||
|
|
||||||
%ifdef __KERNEL__
|
%ifdef __KERNEL__
|
||||||
mov al, 0xA
|
mov al, 0xA
|
||||||
|
|
24
lib/build.mk
Normal file
24
lib/build.mk
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
LIBS_BIN =
|
||||||
|
|
||||||
|
define LIBS_TEMPLATE
|
||||||
|
|
||||||
|
$(1)_BIN = lib$(1).a
|
||||||
|
|
||||||
|
$(1)_OBJS = $$(addprefix lib/$(1)/, $$($(1)_SRCS:.s=.o))
|
||||||
|
|
||||||
|
$$($(1)_BIN): $$($(1)_OBJS)
|
||||||
|
ar rcs $$@ $$^
|
||||||
|
|
||||||
|
GARBADGE += $$($(1)_OBJS) $$($(1)_BIN)
|
||||||
|
LIBS_BIN += $$($(1)_BIN)
|
||||||
|
|
||||||
|
endef
|
||||||
|
|
||||||
|
LIBS =
|
||||||
|
|
||||||
|
include lib/*/build.mk
|
||||||
|
|
||||||
|
$(foreach lib, $(LIBS), $(eval $(call LIBS_TEMPLATE,$(lib))))
|
||||||
|
|
||||||
|
lib/%.o: lib/%.s
|
||||||
|
$(AS) $(ASFLAGS) -o $@ $<
|
|
@ -4,6 +4,6 @@ $(1) = $$(addprefix $$(TOOLS_DIR)/, $$(shell echo -n $(1) | tr A-Z a-z))
|
||||||
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
TOOLS = GIT-VERSION
|
TOOLS = GIT-VERSION CREATE-ISO
|
||||||
|
|
||||||
$(foreach tool, $(TOOLS), $(eval $(call TOOLS_TEMPLATE,$(tool))))
|
$(foreach tool, $(TOOLS), $(eval $(call TOOLS_TEMPLATE,$(tool))))
|
||||||
|
|
26
tools/create-iso
Executable file
26
tools/create-iso
Executable file
|
@ -0,0 +1,26 @@
|
||||||
|
#!/bin/env sh
|
||||||
|
|
||||||
|
grub_config=$(cat <<EOF
|
||||||
|
|
||||||
|
set timeout=15
|
||||||
|
set default=0
|
||||||
|
|
||||||
|
menuentry "StupidOS" {
|
||||||
|
echo "verify system integrity"
|
||||||
|
hashsum --hash sha256 --check /boot/hashfile --prefix /
|
||||||
|
multiboot /vmstupid
|
||||||
|
boot
|
||||||
|
}
|
||||||
|
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
|
||||||
|
gen_iso_file() {
|
||||||
|
mkdir -p "$2/boot/grub"
|
||||||
|
echo "$grub_config" > "$2/boot/grub/grub.cfg"
|
||||||
|
sha256sum "$2"/vmstupid > "$2/boot/hashfile"
|
||||||
|
|
||||||
|
grub-mkrescue -o $1 $2
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_iso_file "$1" "$2"
|
Loading…
Reference in a new issue