During memory testing memtest86 relocates itself in memory so it can test the memory it was previously running from. memtest86 is compiled as position mostly independent code. Some relocations records must be processed to achieve the affect of position independent code. A 16 bit loader is prepended to memtest86 so it can be loaded from a floppy, or from lilo.
In restructuring the build process I had several goals. Maintainability and comprehsibility of the build process. Simplicity of the toolset. And the ability to build images bootable by both the legacy x86 bootloader, and images bootable by bootloaders that directly load static ELF images.
With the ability to proecess relocation records, memtest.bin has been reduced in size from 84480 bytes to 49308 bytes. And now only requires one copy of memtest86. A reduction in size of 35K. And the build process can now ignore the size of memtest86.
BIOS calls have been moved from setup.S to head.S making bootsect.S and setup.S exclusively for booting.
memtest86 is built in three stages. In the first stage the relocatable object files are built as with any program. In the second stage the relocatable object files are linked together into memtest_shared, a shared library version of memtest86. In the third stage a raw memory image of memtest_shared is formed and linked into memtest.bin, and memtest.
memtest.bin is the floppy/lilo bootable target.
memtest is the ELF bootable target.
Another major change is now data in the bss segment is also preserved when memtest86 is relocated, and memtest86 can be relocated to any address.
The one thing to watch out for is pointers to data inside of memtest86. Except for constant pointers to static data there is not enough information to generate relocation records for pointers so they will not change when memtest86 is relocated, which might lead to nasty surpises.
Eric Biederman <email@example.com>