It will help greatly to go into this guide with some understanding of C and Assembly.
Before you start you will need to install nasm, genisoimage and may want to install qemu or bochs in order to test your OS without rebooting your computer, bochs is preferred as it has more debugging capability than qemu
By the end of this part you should have a very basic OS that can boot. This part of the guide will not cover anything but making a basic OS that does absolutely nothing due to how long it already is. If people like this I will make a part 2 going over how to use C with the OS and write text to the screen.
Booting
The first thing to do is create the main assembly file, I will call it Boot.asm
global entry
MAGIC equ 0x1BADB002 ; These tell the bootloader that we are bootable
FLAGS equ 0
SUM equ -MAGIC
section .text:
align 4 ; Align everything after this to a 4 byte boundary, which the boot header needs to be aligned to
dd MAGIC ; dd means "define double word", a word is usually 2 bytes on most computers, so a dword is 4 bytes. You can think of a word as being a short in C and a dword being an int.
dd FLAGS
dd SUM
entry:
jmp entry ; For now we won't do anything but loop forever.
This should boot and do nothing.
But how do we compile it?
First we need a linker script since grub(the bootloader this tutorial will be using) is loaded below 1 MB so we should load above that!
Now I don't expect you to know how to do this, and neither do I, so I will copy this from littleosbook which is another good tutorial on writing an operating system from scratch.
ENTRY(entry) /* 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 */
}
}
nasm -f elf32 Boot.asm should create a file called Boot.o
Which we can then turn into an elf binary by linking it with ld
@CSharpIsGud fair. that's the painful part - having to write asm code so that c can call it. if you leave out the pop ebp or something then you will most likely get a segfault
@sugarfi a segfault, I wish. I wish I had segfaults, they would of saved much time (I do have segmentation enabled but I have the segments set to span the entire address space as I have paging working)
@CSharpIsGud you still get them, just not the message. qemu will freeze up and reboot. i think it's actually called a triple fault or something, but i just call it a segfault.
@sugarfi Yeah, you get them if you turn on segmentation and actually use it, you get a triple fault if the interrupt handler for them isn't there or causes another fault. however if you don't use segmentation its not even gauranteed that it was caused by something memory related
@sugarfi im not doing syscalls yet because user mode will add some extra effort to the interrupts which I will deal with once I get there instead of changing it later
@CSharpIsGud the problem with that is, not all disks support those. and i would only enter v86 mode when the os was shutting down, so it wouldn't matter.
@CSharpIsGud not really. if you load the files into memory, you can just write them there, and not "save" your changes to the disk until the computer powers off.
@CSharpIsGud think about it. this is a small disk; all the files are stored as a tarball. there are 2 - 4gb of memory available, possibly more. and also, who's ever going to use a hobby os?
@CSharpIsGud both good points. but like i said, lack of docs is a problem; the osdev wiki can be really bad for things beyond a bare-bones kernel, and most google searches yield at best two stackoverflow pages.
@sugarfi I usally found about 10 but they were never about my specific problem and were usually caused by someone making an obvious mistake I would of caught instantly
It will help greatly to go into this guide with some understanding of C and Assembly.
Before you start you will need to install nasm, genisoimage and may want to install qemu or bochs in order to test your OS without rebooting your computer, bochs is preferred as it has more debugging capability than qemu
By the end of this part you should have a very basic OS that can boot.
This part of the guide will not cover anything but making a basic OS that does absolutely nothing due to how long it already is.
If people like this I will make a part 2 going over how to use C with the OS and write text to the screen.
Booting
The first thing to do is create the main assembly file, I will call it
Boot.asm
This should boot and do nothing.
But how do we compile it?
First we need a linker script since grub(the bootloader this tutorial will be using) is loaded below 1 MB so we should load above that!
Now I don't expect you to know how to do this, and neither do I, so I will copy this from littleosbook which is another good tutorial on writing an operating system from scratch.
nasm -f elf32 Boot.asm
should create a file called Boot.oWhich we can then turn into an elf binary by linking it with ld
ld -T link.ld -melf_i386 Boot.o -o kernel
We then must download grub, which can also be found in littleosbook, http://littleosbook.github.com/files/stage2_eltorito
Now we create the folder structure our os iso will be built from
And our grub configuration to put in /boot/grub/menu.lst
Now to run it!
A bash script to automatically compile/link and run the OS
To use bochs you must make a configuration file named bochsrc
You don't need to use GRUB though - it's more fun to write your own bootloader.
@sugarfi It just makes it more painful if you make a mistake
@CSharpIsGud what do you mean?
@sugarfi Do you have any IDEA how long this small mistake took me to fix
imagine not being able to tell if your os is crashing or if the bootloader messed something up
@CSharpIsGud fair. that's the painful part - having to write asm code so that c can call it. if you leave out the
pop ebp
or something then you will most likely get a segfault@sugarfi a segfault, I wish. I wish I had segfaults, they would of saved much time (I do have segmentation enabled but I have the segments set to span the entire address space as I have paging working)
@CSharpIsGud you still get them, just not the message. qemu will freeze up and reboot. i think it's actually called a triple fault or something, but i just call it a segfault.
@sugarfi Yeah, you get them if you turn on segmentation and actually use it, you get a triple fault if the interrupt handler for them isn't there or causes another fault. however if you don't use segmentation its not even gauranteed that it was caused by something memory related
@sugarfi also your running out of time to make your os, as soon as I get into user mode im going straight to writing syscalls and vesa drivers
@CSharpIsGud i already got syscalls
i'm working on loading an elf file
@sugarfi im not doing syscalls yet because user mode will add some extra effort to the interrupts which I will deal with once I get there instead of changing it later
@CSharpIsGud fair. do you have an fs yet?
@sugarfi not yet, im saving a file system for when I have disk io
@CSharpIsGud i just read the whole disk in my bootloader, and i'm going to use v86 mode to write it
@sugarfi im going to use the ata apis instead of switching out of protected mode every time
@CSharpIsGud the problem with that is, not all disks support those. and i would only enter v86 mode when the os was shutting down, so it wouldn't matter.
@sugarfi yeah but most should, and if I want to be able to read and write files at will its a necessity
@CSharpIsGud not really. if you load the files into memory, you can just write them there, and not "save" your changes to the disk until the computer powers off.
@sugarfi it wastes memory that could otherwise be used for programs and if the os crashes or someone hard resets the pc all the changes are lost
@CSharpIsGud think about it. this is a small disk; all the files are stored as a tarball. there are 2 - 4gb of memory available, possibly more. and also, who's ever going to use a hobby os?
@CSharpIsGud i mean, i was going to try the ata apis too, but i couldn't find a good tutorial
@sugarfi Why make it low quality when you can make it high quality, also. I bet thats what they said about linux when it was just a hobby kernel
@CSharpIsGud both good points. but like i said, lack of docs is a problem; the osdev wiki can be really bad for things beyond a bare-bones kernel, and most google searches yield at best two stackoverflow pages.
@sugarfi I usally found about 10 but they were never about my specific problem and were usually caused by someone making an obvious mistake I would of caught instantly
@CSharpIsGud i have the same problem.
@sugarfi big brain moment