This is in the context of current 64-bit processors and current linux kernels (I'm using 4.6.4.)
Is it possible for me to write a program that during boot can examine base memory, 640k and under, without it being a kernel module?
I'm trying to remote boot a volume over an InfiniBand network using the InfiniBand protocol SRP. It's a lot like iSCSI booting, but it seems like there's nothing public to actually do this.
I'm using iPXE (network boot firmware.) It's able to connect using the SRP protocol to the remote volume, and successfully load the kernel and initramfs. But, when execution is passed over to the kernel, the kernel hasn't connected to the remote volume, so it doesn't know anything about it or see it.
iPXE leaves the information about who to connect to and how in base (< 640k) memory in a structure called a sBFT, which is a type of ACPI table.
iSCSI does something very similar, with the boot loader leaving that information in an ACPI table, called an iBFT, but there's a kernel module iscsi_ibft which gives a sysfs interface to the iBFT structure. I don't see an equivalent yet for an InfiniBand sBFT, such as an ib_sbft kernel module.
So, I'm wondering if I want this to work, if someone (maybe me) needs to write the non-existant ib_sbft kernel module.
Or, is there a way for me to have a program be able to access base (< 640k) memory without a memory violation, and before it's (presumably) overwritten by something else?
I'm using Arch Linux, which uses mkinitcpio to make the initial ramdisk and run programs during the early boot process, but I'm thinking by that point it's already too late and running in protected mode. (Unless it's changed, real mode runs in 16-bit, and I'm not seeing anything about initial ramdisk programs needing to be compiled in 16-bit, leading me to believe it's too late.)