From 382bd0c5e964dfac9c2e9dda8ef859fd3a91c17e Mon Sep 17 00:00:00 2001 From: pjht Date: Fri, 24 May 2019 09:51:45 -0500 Subject: [PATCH] large restructure --- .gitignore | 3 +- Makefile | 61 ++++++------------ kernel/Makefile | 22 +++++++ kernel/cpu/Makefile | 22 +++++++ kernel/cpu/cpu.a | Bin 0 -> 74144 bytes kernel/cpu/i386/boot.s | 2 + kernel/cpu/x86_64/ports.h | 12 ---- kernel/kernel.a | Bin 0 -> 85216 bytes kernel/kernel.c | 4 +- libc/Makefile | 12 ++++ .../i386 => sysroot/usr/include/cpu}/ports.h | 1 + {libc => sysroot/usr/include}/devbuf.h | 0 {kernel => sysroot/usr/include}/elf.h | 0 {libc => sysroot/usr/include}/errno.h | 0 .../usr/include}/grub/multiboot.h | 0 .../usr/include}/grub/multiboot2.h | 0 .../usr/include}/grub/text_fb_info.h | 0 {libc => sysroot/usr/include}/klog.h | 0 {libc => sysroot/usr/include}/math.h | 0 {libc => sysroot/usr/include}/memory.h | 0 {libc => sysroot/usr/include}/stdio.h | 0 {libc => sysroot/usr/include}/stdlib.h | 0 {libc => sysroot/usr/include}/string.h | 0 {libc => sysroot/usr/include}/tasking.h | 0 24 files changed, 82 insertions(+), 57 deletions(-) create mode 100644 kernel/Makefile create mode 100644 kernel/cpu/Makefile create mode 100644 kernel/cpu/cpu.a delete mode 100644 kernel/cpu/x86_64/ports.h create mode 100644 kernel/kernel.a create mode 100644 libc/Makefile rename {kernel/cpu/i386 => sysroot/usr/include/cpu}/ports.h (99%) rename {libc => sysroot/usr/include}/devbuf.h (100%) rename {kernel => sysroot/usr/include}/elf.h (100%) rename {libc => sysroot/usr/include}/errno.h (100%) rename {libc => sysroot/usr/include}/grub/multiboot.h (100%) rename {libc => sysroot/usr/include}/grub/multiboot2.h (100%) rename {libc => sysroot/usr/include}/grub/text_fb_info.h (100%) rename {libc => sysroot/usr/include}/klog.h (100%) rename {libc => sysroot/usr/include}/math.h (100%) rename {libc => sysroot/usr/include}/memory.h (100%) rename {libc => sysroot/usr/include}/stdio.h (100%) rename {libc => sysroot/usr/include}/stdlib.h (100%) rename {libc => sysroot/usr/include}/string.h (100%) rename {libc => sysroot/usr/include}/tasking.h (100%) diff --git a/.gitignore b/.gitignore index 4a1d388..a8ce85c 100644 --- a/.gitignore +++ b/.gitignore @@ -9,5 +9,4 @@ cpu/memory.h os.iso disk.img libc/libc.a -iso/boot/initrd -sysroot +iso/boot/initrds diff --git a/Makefile b/Makefile index fe4794c..b8de98a 100644 --- a/Makefile +++ b/Makefile @@ -1,20 +1,12 @@ -PLAT=i386 -C_SOURCES = $(wildcard kernel/*.c drivers/$(PLAT)/*.c drivers/$(PLAT)/*/*.c kernel/cpu/$(PLAT)/*.c fs/*.c) -ASM = $(wildcard kernel/cpu/$(PLAT)/*.asm) -S_ASM = $(wildcard kernel/cpu/$(PLAT)/*.s) -LIBC_SOURCES = $(wildcard libc/*.c libc/*/*.c) -LIBC_HEADERS = $(wildcard libc/*.h libc/*/*.h) -OBJ = $(C_SOURCES:.c=.o kernel/cpu/$(PLAT)/boot.o) -ASM_OBJ = $(S_ASM:.s=.o) -S_ASM_OBJ = $(ASM:.asm=.o) -LIBC_OBJ = $(LIBC_SOURCES:.c=.o) -CC = $(shell cat psinfo/$(PLAT)/cc.txt) -AS = $(shell cat psinfo/$(PLAT)/as.txt) -AR = $(shell cat psinfo/$(PLAT)/ar.txt) -NASM = $(shell cat psinfo/$(PLAT)/nasm.txt) +export PLAT=i386 +export CC = $(shell cat psinfo/$(PLAT)/cc.txt) +export AS = $(shell cat psinfo/$(PLAT)/as.txt) +export AR = $(shell cat psinfo/$(PLAT)/ar.txt) +export NASM = $(shell cat psinfo/$(PLAT)/nasm.txt) EMU = $(shell cat psinfo/$(PLAT)/emu.txt) GDB = $(shell cat psinfo/$(PLAT)/gdb.txt) -CFLAGS = -Isysroot/usr/include -Wextra -Wall -Wno-unused-parameter -g -ffreestanding +LINK_OBJ = $(wildcard kernel/kernel.a libc/libc.a cpu/$(PLAT)/boot.o) +export CFLAGS = -Wextra -Wall -Wno-unused-parameter -g -ffreestanding QFLAGS = -hda ext2.img -m 2G -boot d -cdrom os.iso -serial vc #-chardev socket,id=s1,port=3000,host=localhost -serial chardev:s1 .PHONY: sysroot @@ -24,40 +16,27 @@ all: os.iso run: os.iso @$(EMU) $(QFLAGS) -monitor stdio -debug: os.iso kernel/kernel.elf +debug: os.iso kernel.elf @$(EMU) -s $(QFLAGS) & @$(GDB) -ex "target remote localhost:1234" -ex "symbol-file kernel/kernel.elf" -os.iso: kernel/kernel.elf initrd/* initrd/init +os.iso: kernel.elf initrd/* initrd/init @cp kernel/kernel.elf iso/boot @cd initrd; tar -f ../iso/boot/initrd.tar -c * - @# ruby makeinitrd.rb initrd iso/boot/initrd - @grub-mkrescue -o $@ iso + @grub-mkrescue -o $@ iso > /dev/null 2>/dev/null -initrd/init: init/* kernel/start.o - @cd init && make +initrd/init: kernel/start.o + @$(MAKE) -C init @cp init/init initrd/init -kernel/kernel.elf: $(OBJ) $(ASM_OBJ) $(S_ASM_OBJ) libc/libc.a - @$(CC) -z max-page-size=4096 -Xlinker -n -T kernel/cpu/$(PLAT)/linker.ld -o $@ $(CFLAGS) -nostdlib $^ -lgcc +.PHONY: kernel.elf -sysroot: $(LIBC_HEADERS) - @mkdir -p sysroot/usr/include - @cp -r libc/* sysroot/usr/include - @rm -f sysroot/usr/include/libc.a sysroot/usr/include/*.o sysroot/usr/include/*/*.o sysroot/usr/include/*.c sysroot/usr/include/*/*.c - - -libc/libc.a: $(LIBC_OBJ) - @$(AR) rcs $@ $^ - -%.o: %.c sysroot - @$(CC) $(CFLAGS) -c $< -o $@ - -%.o: %.asm - @$(NASM) $< -o $@ - -%.o: %.s - @$(AS) $< -o $@ +kernel.elf: + @$(MAKE) -C kernel + @$(MAKE) -C libc + @$(CC) -z max-page-size=4096 -Xlinker -n -T kernel/cpu/$(PLAT)/linker.ld -o $@ $(CFLAGS) -nostdlib $(LINK_OBJ) -lgcc clean: - @rm -rf kernel/*.o drivers/*/*.o drivers/*/*/*.o cpu/*/*.o fs/*.o libc/libc.a kernel/cstart.o cpu/memory.h os.iso */*.elf iso/boot/initrd.tar + @$(MAKE) clean -C kernel + @$(MAKE) clean -C libc + @$(MAKE) clean -C kernel/cpu diff --git a/kernel/Makefile b/kernel/Makefile new file mode 100644 index 0000000..e063f8e --- /dev/null +++ b/kernel/Makefile @@ -0,0 +1,22 @@ +C_SOURCES = $(wildcard *.c cpu/$(PLAT)/*.c) +ASM = $(wildcard cpu/$(PLAT)/*.asm) +S_ASM = $(wildcard cpu/$(PLAT)/*.s) +OBJ = $(C_SOURCES:.c=.o) +ASM_OBJ = $(S_ASM:.s=.o) +S_ASM_OBJ = $(ASM:.asm=.o) + +kernel.a: $(OBJ) $(ASM_OBJ) $(S_ASM_OBJ) + @$(AR) rcs $@ $^ + +%.o: %.c + @$(CC) -I../sysroot/usr/include $(CFLAGS) -c $< -o $@ + +%.o: %.asm + @$(NASM) $< -o $@ + +%.o: %.s + @$(AS) $< -o $@ + + +clean: + @rm -rf *.o cpu/*/*.o diff --git a/kernel/cpu/Makefile b/kernel/cpu/Makefile new file mode 100644 index 0000000..41520cf --- /dev/null +++ b/kernel/cpu/Makefile @@ -0,0 +1,22 @@ +PLAT=i386 +C_SOURCES = $(wildcard $(PLAT)/*.c) +ASM = $(wildcard $(PLAT)/*.asm) +S_ASM = $(wildcard $(PLAT)/*.s) +OBJ = $(C_SOURCES:.c=.o) +ASM_OBJ = $(S_ASM:.s=.o) +S_ASM_OBJ = $(ASM:.asm=.o) + +cpu.a: $(OBJ) $(ASM_OBJ) $(S_ASM_OBJ) + @$(AR) rcs $@ $^ + +%.o: %.c + @$(CC) -I../../sysroot/usr/include $(CFLAGS) -c $< -o $@ + +%.o: %.asm + @$(NASM) $< -o $@ + +%.o: %.s + @$(AS) $< -o $@ + +clean: + @rm -rf */*.o diff --git a/kernel/cpu/cpu.a b/kernel/cpu/cpu.a new file mode 100644 index 0000000000000000000000000000000000000000..e46d2155a305ac41522623858c18ec706b99901b GIT binary patch literal 74144 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 literal 0 HcmV?d00001 diff --git a/kernel/cpu/i386/boot.s b/kernel/cpu/i386/boot.s index b94ddf2..353b263 100644 --- a/kernel/cpu/i386/boot.s +++ b/kernel/cpu/i386/boot.s @@ -1,3 +1,5 @@ +.extern kmain + # Declare a multiboot header that marks the program as a kernel. .section .multiboot header_start: diff --git a/kernel/cpu/x86_64/ports.h b/kernel/cpu/x86_64/ports.h deleted file mode 100644 index 4f5c6e1..0000000 --- a/kernel/cpu/x86_64/ports.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef PORTS_H -#define PORTS_H - -#include - -uint8_t port_byte_in(uint16_t port); -void port_byte_out(uint16_t port,uint8_t data); -uint16_t port_word_in(uint16_t port); -void port_word_out(uint16_t port,uint16_t data); -uint32_t port_long_in(uint16_t port); -void port_long_out(uint16_t port,uint32_t data); -#endif diff --git a/kernel/kernel.a b/kernel/kernel.a new file mode 100644 index 0000000000000000000000000000000000000000..887224ee25ba2c875c488810e63a07077f5c944c GIT binary patch literal 85216 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 y>>3Ae`$TBJRMXSl?G!kB=aY4 #include "cpu/cpu_init.h" #include "vga_err.h" -#include "elf.h" +#include typedef struct { char filename[100]; char mode[8]; - char uid[8]; + char uid[6]; char gid[8]; char size[12]; char mtime[12]; diff --git a/libc/Makefile b/libc/Makefile new file mode 100644 index 0000000..3b2a88f --- /dev/null +++ b/libc/Makefile @@ -0,0 +1,12 @@ +SOURCES = $(wildcard libc/*.c libc/*/*.c) +HEADERS = $(wildcard libc/*.h libc/*/*.h) +.PHONY: sysroot + +libc.a: $(LIBC_OBJ) + @$(AR) rcs $@ $^ + +%.o: %.c sysroot + @$(CC) -I../sysroot/usr/include $(CFLAGS) -c $< -o $@ + +clean: + @rm -rf *.o libc/libc.a diff --git a/kernel/cpu/i386/ports.h b/sysroot/usr/include/cpu/ports.h similarity index 99% rename from kernel/cpu/i386/ports.h rename to sysroot/usr/include/cpu/ports.h index 4f5c6e1..a5da331 100644 --- a/kernel/cpu/i386/ports.h +++ b/sysroot/usr/include/cpu/ports.h @@ -9,4 +9,5 @@ uint16_t port_word_in(uint16_t port); void port_word_out(uint16_t port,uint16_t data); uint32_t port_long_in(uint16_t port); void port_long_out(uint16_t port,uint32_t data); + #endif diff --git a/libc/devbuf.h b/sysroot/usr/include/devbuf.h similarity index 100% rename from libc/devbuf.h rename to sysroot/usr/include/devbuf.h diff --git a/kernel/elf.h b/sysroot/usr/include/elf.h similarity index 100% rename from kernel/elf.h rename to sysroot/usr/include/elf.h diff --git a/libc/errno.h b/sysroot/usr/include/errno.h similarity index 100% rename from libc/errno.h rename to sysroot/usr/include/errno.h diff --git a/libc/grub/multiboot.h b/sysroot/usr/include/grub/multiboot.h similarity index 100% rename from libc/grub/multiboot.h rename to sysroot/usr/include/grub/multiboot.h diff --git a/libc/grub/multiboot2.h b/sysroot/usr/include/grub/multiboot2.h similarity index 100% rename from libc/grub/multiboot2.h rename to sysroot/usr/include/grub/multiboot2.h diff --git a/libc/grub/text_fb_info.h b/sysroot/usr/include/grub/text_fb_info.h similarity index 100% rename from libc/grub/text_fb_info.h rename to sysroot/usr/include/grub/text_fb_info.h diff --git a/libc/klog.h b/sysroot/usr/include/klog.h similarity index 100% rename from libc/klog.h rename to sysroot/usr/include/klog.h diff --git a/libc/math.h b/sysroot/usr/include/math.h similarity index 100% rename from libc/math.h rename to sysroot/usr/include/math.h diff --git a/libc/memory.h b/sysroot/usr/include/memory.h similarity index 100% rename from libc/memory.h rename to sysroot/usr/include/memory.h diff --git a/libc/stdio.h b/sysroot/usr/include/stdio.h similarity index 100% rename from libc/stdio.h rename to sysroot/usr/include/stdio.h diff --git a/libc/stdlib.h b/sysroot/usr/include/stdlib.h similarity index 100% rename from libc/stdlib.h rename to sysroot/usr/include/stdlib.h diff --git a/libc/string.h b/sysroot/usr/include/string.h similarity index 100% rename from libc/string.h rename to sysroot/usr/include/string.h diff --git a/libc/tasking.h b/sysroot/usr/include/tasking.h similarity index 100% rename from libc/tasking.h rename to sysroot/usr/include/tasking.h