1. Don't link the bootsector and the rest of your binary together. It's more trouble than it's worth, and if you ever progress to loading off a filesystem, then you won't be linking them together anyway.
2. You can use LBA addressing in real mode with int 13h (just specify a hard disk rather than a floppy when booting):
https://wiki.osdev.org/ATA_in_x86_RealMode_(BIOS)#LBA_in_Ext...
3. You need to switch to protected mode, set up paging, and then enter long mode.
4. I'd recommend compiling your rust code to an ELF binary, and then using objcopy to create a binary:
objcopy -O binary $input.elf $output.bin
Alternatively, ELF isn't that hard to parse, so you could load it yourself and then copy sections to the right locations with your bootsector.5. OSDev.org is your friend. Maybe get a C-based kernel running first, as the toolchain when dealing with freestanding code is a lot friendlier for beginners
- https://wiki.osdev.org/Protected_Mode
- https://wiki.osdev.org/Long_Mode#Long_Mode
You might be better off starting with 32-bit rust code instead, in order to avoid paging and long mode at first (you'll still need to switch to protected mode)
I just think that when starting out in kernel development, you're likely going to be dealing with linker scripts for likely the first time. It's been a while since I tried rust for this, but C generates pretty clean object files, so the linker scripts from the OSDev wiki can often be copied verbatim.
I don’t think that the linker script stuff ends up different but it’s been a minute since I started from scratch.
1. I have a Makefile that links it for me so I don't have to do anything special. I intend the Rust program to work like a second stage bootloader. I'm going to experiment with it and try to get a file system working to load an actual kernel from a file. 2. I'll look into that. 3. That's what the bootloader does. Sorry if I wasn't clear. 4. If I understand correctly if I compile my Rust project to a binary (which is a default output and I don't really understand why I would use objcopy for that) I won't be able to link with with the bootloader. I link them to allow the bootloader to jump to the _start function at the correct address. 5. My Rust program already works in 64-bit so I don't see a reason to change it. In this project I want to explore low level programming and understand things like paging.
I appreciate your feedback.
That or I'm very confused.