NOTE Before Reading: I have not actually tried this, it is all theory to me.
GRUB does allow you to boot a 16-bit kernel, in fact that is how memtest86+ is loaded:
Code:
menuentry 'Memory test (memtest86+)' {
insmod part_msdos
insmod ext2
set root='hd3,msdos1'
*CUT - ADVANCED SEARCH FOR UUID - CUT*
linux16 /memtest86+.bin
}
Now, I have disassembled memtest86+.bin - it has no multiboot header and the first few lines are just segment fixes:
Code:
00000000 B8C007 mov ax,0x7c0
00000003 8ED8 mov ds,ax
00000005 B80090 mov ax,0x9000
00000008 8EC0 mov es,ax
0000000A B90001 mov cx,0x100
0000000D 29F6 sub si,si
0000000F 29FF sub di,di
00000011 FC cld
00000012 F3A5 rep movsw
00000014 EA19000090 jmp word 0x9000:0x19
So, you can boot 16-bit, but without multiboot. And it seems Grub will load your binary to 0x7C00? which memtest86+ relocates to 0x90000.
But my recommendation would be to either use 32-bit multiboot complaint kernel OR roll your own boot sectors / loaders.
One more choice you do have - if you require multiboot - is to make a 32-bit multiboot complaint kernel and drop back down to 16-bit after grub loads you in.
Best Regards,
B!