Write Your Own 64-bit Operating System Kernel From Scratch
This respository holds all the source code for this YouTube tutorial series.
You can find the revision for a specific episode on this page.
You can find pre-built ISO files for this kernel at this repository.
Considering supporting this work via my Patreon page.
Prerequisites
- A text editor such as VS Code.
- Docker for creating our build-environment.
- Qemu for emulating our operating system.
- Remember to add Qemu to the path so that you can access it from your command-line. (Windows instructions here)
Setup
Build an image for our build-environment:
docker build buildenv -t myos-buildenv
Build
Enter build environment:
- Linux or MacOS:
docker run --rm -it -v "$(pwd)":/root/env myos-buildenv
- Windows (CMD):
docker run --rm -it -v "%cd%":/root/env myos-buildenv
- Windows (PowerShell):
docker run --rm -it -v "${pwd}:/root/env" myos-buildenv
- Please use the linux command if you are using
WSL
,msys2
orgit bash
- NOTE: If you are having trouble with an unshared drive, ensure your docker daemon has access to the drive you're development environment is in. For Docker Desktop, this is in "Settings > Shared Drives" or "Settings > Resources > File Sharing".
Build for x86 (other architectures may come in the future):
make build-x86_64
- If you are using Qemu, please close it before running this command to prevent errors.
To leave the build environment, enter exit
.
Emulate
You can emulate your operating system using Qemu: (Don't forget to add qemu to your path!)
qemu-system-x86_64 -cdrom dist/x86_64/kernel.iso
- Note: Close the emulator when finished, so as to not block writing to
kernel.iso
for future builds.
If the above command fails, try one of the following:
- Windows:
qemu-system-x86_64 -cdrom dist/x86_64/kernel.iso -L "C:\Program Files\qemu"
- Linux:
qemu-system-x86_64 -cdrom dist/x86_64/kernel.iso -L /usr/share/qemu/
- Alternatively, install a custom BIOS binary file and link it to Qemu using the
-L
option.
Alternatively, you should be able to load the operating system on a USB drive and boot into it when you turn on your computer. (I haven't actually tested this yet.)
Cleanup
Remove the build-evironment image:
docker rmi myos-buildenv -f