Code: Select all
$(BUILD_DIR)/$(OS_NAME)-$(OS_VERSION)-image.iso: $(BUILD_DIR)/kernel.bin #$(DEBUG_DIR)/objdump.txt
# Creating build directory which will be used to create ISO image, kernel.bin and object files
mkdir -p build
# Creating ISO directory which will be used to create ISO image
mkdir -p $(ISO_DIR)/boot
# Copying files to ISO directory and creating directories
cp image/boot_loader_wallpaper.bmp $(ISO_DIR)/boot/boot_loader_wallpaper.bmp
cp -v $(BUILD_DIR)/kernel.bin $(ISO_DIR)/boot/
cp -v $(LIMINE_SRC_DIR)/limine.conf $(ISO_DIR)/boot/
mkdir -p $(ISO_DIR)/boot/limine
cp -v $(LIMINE_SRC_DIR)/limine-bios.sys $(LIMINE_SRC_DIR)/limine-bios-cd.bin $(LIMINE_SRC_DIR)/limine-uefi-cd.bin $(ISO_DIR)/boot/limine/
mkdir -p $(ISO_DIR)/EFI/BOOT
cp -v $(LIMINE_SRC_DIR)/BOOTX64.EFI $(ISO_DIR)/EFI/BOOT/
cp -v $(LIMINE_SRC_DIR)/BOOTIA32.EFI $(ISO_DIR)/EFI/BOOT/
# Copy user_programe.elf file into boot
cp -v $(USER_MODULE_DIR)/build/$(USER_PROGRAM_FILE).elf $(ISO_DIR)/boot/$(USER_PROGRAM_FILE).elf
# Creating KeblaOS-0.11-image.iso file by using xorriso.
xorriso \
-as mkisofs \
-b boot/limine/limine-bios-cd.bin \
-no-emul-boot -boot-load-size 4 -boot-info-table \
--efi-boot boot/limine/limine-uefi-cd.bin \
-efi-boot-part --efi-boot-image \
--protective-msdos-label $(ISO_DIR) \
-o $(BUILD_DIR)/$(OS_NAME)-$(OS_VERSION)-image.iso
# install the Limine bootloader into an ISO file, specifically for BIOS-based booting.
$(LIMINE_SRC_DIR)/limine bios-install $(BUILD_DIR)/$(OS_NAME)-$(OS_VERSION)-image.iso
I write a MBR at sector zero which have following boot code:
Code: Select all
static uint8_t limine_bootstrap_code[512] = {
// Bootstrap code
0xFA, // cli
0x31, 0xC0, // xor ax, ax
0x8E, 0xD8, // mov ds, ax
0x8E, 0xC0, // mov es, ax
0x8E, 0xD0, // mov ss, ax
0xBC, 0x00, 0x7C, // mov sp, 0x7C00
0xFB, // sti
// Print "Limine..."
0xB4, 0x0E, // mov ah, 0x0E
0xB0, 'L', 0xCD, 0x10, // mov al, 'L'; int 0x10
0xB0, 'i', 0xCD, 0x10, // mov al, 'i'; int 0x10
0xB0, 'm', 0xCD, 0x10, // mov al, 'm'; int 0x10
0xB0, 'i', 0xCD, 0x10, // mov al, 'i'; int 0x10
0xB0, 'n', 0xCD, 0x10, // mov al, 'n'; int 0x10
0xB0, 'e', 0xCD, 0x10, // mov al, 'e'; int 0x10
0xB0, '.', 0xCD, 0x10, // mov al, '.'; int 0x10
0xB0, '.', 0xCD, 0x10, // mov al, '.'; int 0x10
0xB0, '.', 0xCD, 0x10, // mov al, '.'; int 0x10
// Prepare DAP (Disk Address Packet)
0xBE, 0x50, 0x7C, // mov si, 0x7C50
0x31, 0xC0, // xor ax, ax
0x8E, 0xC0, // mov es, ax
0x8A, 0x16, 0x80, 0x7C, // mov dl, [0x7C80] (boot drive)
0xB4, 0x42, // mov ah, 0x42
0xCD, 0x13, // int 0x13
0x73, 0x02, // jnc load_ok
0xF4, // hlt (on error)
// load_ok:
0xEA, 0x00, 0x7E, 0x00, 0x00, // jmp 0x0000:0x7E00
// Disk Address Packet (DAP) at 0x7C50
0x10, 0x00, // size=16, reserved=0
0x01, 0x00, // read 1 sector
0x00, 0x7E, // offset=0x7E00
0x00, 0x00, // segment=0x0000
0x00, 0x08, 0x00, 0x00, // LBA low: 2048
0x00, 0x00, 0x00, 0x00, // LBA high: 0
// Padding to make total 510 bytes of code + data
// Fill remaining space with zeros
};

