diff --git a/.gitignore b/.gitignore index 4bc5c22..fa4cf84 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ boot.bin dittoOS.img +**/*.o +**/*.elf +**/*.iso \ No newline at end of file diff --git a/Makefile b/Makefile index 07f2fd0..769468c 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,37 @@ -prog: bin image +OBJECTS = loader.o kmain.o +CC = gcc +CFLAGS = -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector \ + -nostartfiles -nodefaultlibs -Wall -Wextra -Werror -c +LDFLAGS = -T link.ld -melf_i386 +AS = nasm +ASFLAGS = -f elf -image: - dd status=noxfer conv=notrunc if=boot.bin of=dittoOS.img +all: kernel.elf -bin: - nasm -f bin -o boot.bin boot.asm +kernel.elf: $(OBJECTS) + ld $(LDFLAGS) $(OBJECTS) -o kernel.elf -run: prog - qemu-system-x86_64 dittoOS.img \ No newline at end of file +os.iso: kernel.elf + cp kernel.elf iso/boot/kernel.elf + genisoimage -R \ + -b boot/grub/stage2_eltorito \ + -no-emul-boot \ + -boot-load-size 4 \ + -A os \ + -input-charset utf8 \ + -quiet \ + -boot-info-table \ + -o os.iso \ + iso + +run: os.iso + bochs -f bochsrc.txt -q + +%.o: %.c + $(CC) $(CFLAGS) $< -o $@ + +%.o: %.s + $(AS) $(ASFLAGS) $< -o $@ + +clean: + rm -rf *.o kernel.elf os.iso \ No newline at end of file diff --git a/bochslog.txt b/bochslog.txt new file mode 100644 index 0000000..c395ae3 --- /dev/null +++ b/bochslog.txt @@ -0,0 +1,173 @@ +00000000000i[ ] Bochs x86 Emulator 2.6.9 +00000000000i[ ] Built from SVN snapshot on April 9, 2017 +00000000000i[ ] Compiled on Mar 15 2019 at 16:24:28 +00000000000i[ ] System configuration +00000000000i[ ] processors: 1 (cores=1, HT threads=1) +00000000000i[ ] A20 line support: yes +00000000000i[ ] IPS is set to 1000000 +00000000000i[ ] CPU configuration +00000000000i[ ] SMP support: yes, quantum=16 +00000000000i[ ] level: 6 +00000000000i[ ] APIC support: xapic +00000000000i[ ] FPU support: yes +00000000000i[ ] MMX support: yes +00000000000i[ ] 3dnow! support: yes +00000000000i[ ] SEP support: yes +00000000000i[ ] SIMD support: sse2 +00000000000i[ ] XSAVE support: no +00000000000i[ ] AES support: no +00000000000i[ ] SHA support: no +00000000000i[ ] MOVBE support: no +00000000000i[ ] ADX support: no +00000000000i[ ] x86-64 support: yes +00000000000i[ ] 1G paging support: no +00000000000i[ ] MWAIT support: yes +00000000000i[ ] Optimization configuration +00000000000i[ ] RepeatSpeedups support: no +00000000000i[ ] Fast function calls: no +00000000000i[ ] Handlers Chaining speedups: no +00000000000i[ ] Devices configuration +00000000000i[ ] PCI support: i440FX i430FX +00000000000i[ ] Networking: no +00000000000i[ ] Sound support: no +00000000000i[ ] USB support: UHCI +00000000000i[ ] VGA extension support: vbe +00000000000i[MEM0 ] allocated memory at 0x7f25f076c010. after alignment, vector=0x7f25f076d000 +00000000000i[MEM0 ] 32,00MB +00000000000i[MEM0 ] mem block size = 0x00020000, blocks=256 +00000000000i[MEM0 ] rom at 0xfffe0000/131072 ('/usr/share/bochs/BIOS-bochs-latest') +00000000000i[CPU0 ] WARNING: 3DNow! is not implemented yet ! +00000000000i[PLUGIN] init_dev of 'pci' plugin device by virtual method +00000000000i[DEV ] i440FX PMC present at device 0, function 0 +00000000000i[PLUGIN] init_dev of 'pci2isa' plugin device by virtual method +00000000000i[DEV ] PIIX3 PCI-to-ISA bridge present at device 1, function 0 +00000000000i[PLUGIN] init_dev of 'cmos' plugin device by virtual method +00000000000i[CMOS ] Using local time for initial clock +00000000000i[CMOS ] Setting initial clock to: Fri Mar 15 18:05:38 2019 (time0=1552669538) +00000000000i[PLUGIN] init_dev of 'dma' plugin device by virtual method +00000000000i[DMA ] channel 4 used by cascade +00000000000i[PLUGIN] init_dev of 'pic' plugin device by virtual method +00000000000i[PLUGIN] init_dev of 'pit' plugin device by virtual method +00000000000i[PIT ] PIT using realtime synchronisation method +00000000000i[PLUGIN] init_dev of 'vga' plugin device by virtual method +00000000000i[MEM0 ] Register memory access handlers: 0x0000000a0000 - 0x0000000bffff +00000000000i[VGA ] interval=200000, mode=realtime +00000000000i[MEM0 ] Register memory access handlers: 0x0000e0000000 - 0x0000e0ffffff +00000000000i[BXVGA ] VBE Bochs Display Extension Enabled +00000000000i[MEM0 ] rom at 0xc0000/41472 ('/usr/share/bochs/VGABIOS-lgpl-latest') +00000000000i[PLUGIN] init_dev of 'floppy' plugin device by virtual method +00000000000i[DMA ] channel 2 used by Floppy Drive +00000000000i[FLOPPY] Using boot sequence cdrom, none, none +00000000000i[FLOPPY] Floppy boot signature check is enabled +00000000000i[PLUGIN] init_dev of 'acpi' plugin device by virtual method +00000000000i[DEV ] ACPI Controller present at device 1, function 3 +00000000000i[PLUGIN] init_dev of 'ioapic' plugin device by virtual method +00000000000i[IOAPIC] initializing I/O APIC +00000000000i[MEM0 ] Register memory access handlers: 0x0000fec00000 - 0x0000fec00fff +00000000000i[IOAPIC] IOAPIC enabled (base address = 0xfec00000) +00000000000i[PLUGIN] init_dev of 'keyboard' plugin device by virtual method +00000000000i[KBD ] will paste characters every 400 keyboard ticks +00000000000i[PLUGIN] init_dev of 'harddrv' plugin device by virtual method +00000000000i[HD ] CD on ata0-0: 'os.iso' +00000000000i[CD1 ] load cdrom with path='os.iso' +00000000000i[CD1 ] Opening image file as a cd. +00000000000i[HD ] Media present in CD-ROM drive +00000000000i[HD ] Capacity is 235 sectors (0,46 MB) +00000000000i[PLUGIN] init_dev of 'pci_ide' plugin device by virtual method +00000000000i[DEV ] PIIX3 PCI IDE controller present at device 1, function 1 +00000000000i[PLUGIN] init_dev of 'unmapped' plugin device by virtual method +00000000000i[PLUGIN] init_dev of 'biosdev' plugin device by virtual method +00000000000i[PLUGIN] init_dev of 'speaker' plugin device by virtual method +00000000000e[PCSPK ] Failed to open /dev/console: Keine Berechtigung +00000000000e[PCSPK ] Deactivating beep on console +00000000000i[PLUGIN] init_dev of 'extfpuirq' plugin device by virtual method +00000000000i[PLUGIN] init_dev of 'parallel' plugin device by virtual method +00000000000i[PAR ] parallel port 1 at 0x0378 irq 7 +00000000000i[PLUGIN] init_dev of 'serial' plugin device by virtual method +00000000000i[SER ] com1 at 0x03f8 irq 4 (mode: null) +00000000000i[PLUGIN] init_dev of 'iodebug' plugin device by virtual method +00000000000i[PLUGIN] init_dev of 'usb_uhci' plugin device by virtual method +00000000000i[DEV ] USB UHCI present at device 1, function 2 +00000000000i[UHCI ] USB UHCI initialized +00000000000i[PLUGIN] register state of 'pci' plugin device by virtual method +00000000000i[PLUGIN] register state of 'pci2isa' plugin device by virtual method +00000000000i[PLUGIN] register state of 'cmos' plugin device by virtual method +00000000000i[PLUGIN] register state of 'dma' plugin device by virtual method +00000000000i[PLUGIN] register state of 'pic' plugin device by virtual method +00000000000i[PLUGIN] register state of 'pit' plugin device by virtual method +00000000000i[PLUGIN] register state of 'vga' plugin device by virtual method +00000000000i[PLUGIN] register state of 'floppy' plugin device by virtual method +00000000000i[PLUGIN] register state of 'unmapped' plugin device by virtual method +00000000000i[PLUGIN] register state of 'biosdev' plugin device by virtual method +00000000000i[PLUGIN] register state of 'speaker' plugin device by virtual method +00000000000i[PLUGIN] register state of 'extfpuirq' plugin device by virtual method +00000000000i[PLUGIN] register state of 'parallel' plugin device by virtual method +00000000000i[PLUGIN] register state of 'serial' plugin device by virtual method +00000000000i[PLUGIN] register state of 'iodebug' plugin device by virtual method +00000000000i[PLUGIN] register state of 'usb_uhci' plugin device by virtual method +00000000000i[PLUGIN] register state of 'acpi' plugin device by virtual method +00000000000i[PLUGIN] register state of 'ioapic' plugin device by virtual method +00000000000i[PLUGIN] register state of 'keyboard' plugin device by virtual method +00000000000i[PLUGIN] register state of 'harddrv' plugin device by virtual method +00000000000i[PLUGIN] register state of 'pci_ide' plugin device by virtual method +00000000000i[SYS ] bx_pc_system_c::Reset(HARDWARE) called +00000000000i[CPU0 ] cpu hardware reset +00000000000i[APIC0 ] allocate APIC id=0 (MMIO enabled) to 0x0000fee00000 +00000000000i[CPU0 ] CPU[0] is the bootstrap processor +00000000000i[CPU0 ] CPUID[0x00000000]: 00000005 68747541 444d4163 69746e65 +00000000000i[CPU0 ] CPUID[0x00000001]: 00000633 00010800 00002008 17cbfbff +00000000000i[CPU0 ] CPUID[0x00000002]: 00000000 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x00000003]: 00000000 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x00000004]: 00000000 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x00000005]: 00000040 00000040 00000003 00000020 +00000000000i[CPU0 ] CPUID[0x80000000]: 80000008 68747541 444d4163 69746e65 +00000000000i[CPU0 ] CPUID[0x80000001]: 00000633 00000000 00000101 ebd3f3ff +00000000000i[CPU0 ] CPUID[0x80000002]: 20444d41 6c687441 74286e6f 7020296d +00000000000i[CPU0 ] CPUID[0x80000003]: 65636f72 726f7373 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x80000004]: 00000000 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x80000005]: 01ff01ff 01ff01ff 40020140 40020140 +00000000000i[CPU0 ] CPUID[0x80000006]: 00000000 42004200 02008140 00000000 +00000000000i[CPU0 ] CPUID[0x80000007]: 00000000 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x80000008]: 00003028 00000000 00000000 00000000 +00000000000i[PLUGIN] reset of 'pci' plugin device by virtual method +00000000000i[PLUGIN] reset of 'pci2isa' plugin device by virtual method +00000000000i[PLUGIN] reset of 'cmos' plugin device by virtual method +00000000000i[PLUGIN] reset of 'dma' plugin device by virtual method +00000000000i[PLUGIN] reset of 'pic' plugin device by virtual method +00000000000i[PLUGIN] reset of 'pit' plugin device by virtual method +00000000000i[PLUGIN] reset of 'vga' plugin device by virtual method +00000000000i[PLUGIN] reset of 'floppy' plugin device by virtual method +00000000000i[PLUGIN] reset of 'acpi' plugin device by virtual method +00000000000i[PLUGIN] reset of 'ioapic' plugin device by virtual method +00000000000i[PLUGIN] reset of 'keyboard' plugin device by virtual method +00000000000i[PLUGIN] reset of 'harddrv' plugin device by virtual method +00000000000i[PLUGIN] reset of 'pci_ide' plugin device by virtual method +00000000000i[PLUGIN] reset of 'unmapped' plugin device by virtual method +00000000000i[PLUGIN] reset of 'biosdev' plugin device by virtual method +00000000000i[PLUGIN] reset of 'speaker' plugin device by virtual method +00000000000i[PLUGIN] reset of 'extfpuirq' plugin device by virtual method +00000000000i[PLUGIN] reset of 'parallel' plugin device by virtual method +00000000000i[PLUGIN] reset of 'serial' plugin device by virtual method +00000000000i[PLUGIN] reset of 'iodebug' plugin device by virtual method +00000000000i[PLUGIN] reset of 'usb_uhci' plugin device by virtual method +00000000000i[ ] set SIGINT handler to bx_debug_ctrlc_handler +00000000000i[ ] dbg: Quit +00000000000i[CPU0 ] CPU is in real mode (active) +00000000000i[CPU0 ] CS.mode = 16 bit +00000000000i[CPU0 ] SS.mode = 16 bit +00000000000i[CPU0 ] EFER = 0x00000000 +00000000000i[CPU0 ] | EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000000 +00000000000i[CPU0 ] | ESP=00000000 EBP=00000000 ESI=00000000 EDI=00000000 +00000000000i[CPU0 ] | IOPL=0 id vip vif ac vm rf nt of df if tf sf zf af pf cf +00000000000i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D +00000000000i[CPU0 ] | CS:f000( 1e00| 0| 0) ffff0000 0000ffff 0 0 +00000000000i[CPU0 ] | DS:0000( 0000| 0| 0) 00000000 0000ffff 0 0 +00000000000i[CPU0 ] | SS:0000( 0000| 0| 0) 00000000 0000ffff 0 0 +00000000000i[CPU0 ] | ES:0000( 0000| 0| 0) 00000000 0000ffff 0 0 +00000000000i[CPU0 ] | FS:0000( 0000| 0| 0) 00000000 0000ffff 0 0 +00000000000i[CPU0 ] | GS:0000( 0000| 0| 0) 00000000 0000ffff 0 0 +00000000000i[CPU0 ] | EIP=0000fff0 (0000fff0) +00000000000i[CPU0 ] | CR0=0x60000010 CR2=0x00000000 +00000000000i[CPU0 ] | CR3=0x00000000 CR4=0x00000000 +00000000000i[CMOS ] Last time is 1552669538 (Fri Mar 15 18:05:38 2019) +00000000000i[SIM ] quit_sim called with exit code 0 diff --git a/bochsrc.txt b/bochsrc.txt new file mode 100644 index 0000000..ad72300 --- /dev/null +++ b/bochsrc.txt @@ -0,0 +1,9 @@ +megs: 32 +display_library: sdl +romimage: file=/usr/share/bochs/BIOS-bochs-latest +vgaromimage: file=/usr/share/bochs/VGABIOS-lgpl-latest +ata0-master: type=cdrom, path=os.iso, status=inserted +boot: cdrom +log: bochslog.txt +clock: sync=realtime, time0=local +cpu: count=1, ips=1000000 \ No newline at end of file diff --git a/boot.elf b/boot.elf deleted file mode 100644 index fff3f88..0000000 Binary files a/boot.elf and /dev/null differ diff --git a/iso/boot/grub/menu.lst b/iso/boot/grub/menu.lst new file mode 100644 index 0000000..3ec275a --- /dev/null +++ b/iso/boot/grub/menu.lst @@ -0,0 +1,5 @@ + default=0 + timeout=0 + + title dittoOS + kernel /boot/kernel.elf \ No newline at end of file diff --git a/iso/boot/grub/stage2_eltorito b/iso/boot/grub/stage2_eltorito new file mode 100644 index 0000000..9e1617c Binary files /dev/null and b/iso/boot/grub/stage2_eltorito differ diff --git a/kmain.c b/kmain.c new file mode 100644 index 0000000..bc6f94f --- /dev/null +++ b/kmain.c @@ -0,0 +1,13 @@ +int main() { + return 0; +} + +int sum_of_three(int arg1, int arg2, int arg3) { + return arg1 + arg2 + arg3; +} + +struct example { + unsigned char config; /* bit 0 - 7 */ + unsigned short address; /* bit 8 - 23 */ + unsigned char index; /* bit 24 - 31 */ +} __attribute__((packed)); \ No newline at end of file diff --git a/link.ld b/link.ld new file mode 100644 index 0000000..4600a28 --- /dev/null +++ b/link.ld @@ -0,0 +1,26 @@ +ENTRY(loader) /* the name of the entry label */ + +SECTIONS { + . = 0x00100000; /* the code should be loaded at 1 MB */ + + .text ALIGN (0x1000) : /* align at 4 KB */ + { + *(.text) /* all text sections from all files */ + } + + .rodata ALIGN (0x1000) : /* align at 4 KB */ + { + *(.rodata*) /* all read-only data sections from all files */ + } + + .data ALIGN (0x1000) : /* align at 4 KB */ + { + *(.data) /* all data sections from all files */ + } + + .bss ALIGN (0x1000) : /* align at 4 KB */ + { + *(COMMON) /* all COMMON sections from all files */ + *(.bss) /* all bss sections from all files */ + } +} \ No newline at end of file diff --git a/loader.s b/loader.s new file mode 100644 index 0000000..e9f5d66 --- /dev/null +++ b/loader.s @@ -0,0 +1,33 @@ +global loader ; the entry symbol for ELF +extern sum_of_three + +MAGIC_NUMBER equ 0x1BADB002 ; define the magic number constant +FLAGS equ 0x0 ; multiboot flags +CHECKSUM equ -MAGIC_NUMBER ; calculate the checksum + ; (magic number + checksum + flags should equal 0) + +KERNEL_STACK_SIZE equ 4096 ; size of stack in bytes + +section .bss +align 4 ; align at 4 bytes +kernel_stack: ; label points to beginning of memory + resb KERNEL_STACK_SIZE ; reserve stack for the kernel + +section .text: ; start of the text (code) section +align 4 ; the code must be 4 byte aligned + dd MAGIC_NUMBER ; write the magic number to the machine code, + dd FLAGS ; the flags, + dd CHECKSUM ; and the checksum + +loader: ; the loader label (defined as entry point in linker script) + mov eax, 0xCAFEBABE ; place the number 0xCAFEBABE in the register eax + + mov esp, kernel_stack + KERNEL_STACK_SIZE ; point esp to the start of the + ; stack (end of memory area) + + push dword 3 ; arg3 + push dword 2 ; arg2 + push dword 1 ; arg1 + call sum_of_three ; call the function, the result will be in eax +.loop: + jmp .loop ; loop forever \ No newline at end of file