Re: [PATCH 12/12] i386 boot: Add an ELF header to bzImage

Eric W. Biederman
2006-10-04T08:06:45Z

"H. Peter Anvin" <hpa@zytor.com> writes:

> Vivek Goyal wrote:
>> Hi Andrew,
>> Right now I don't have access to my test machine. Tomorrow morning,
>> very first thing I am going to try it out with your config file.
>> This patch just adds and ELF header to bzImage which is not even used
>> by grub.
>>
>
> Oh yes, it will be. See below.
>
>> So without this patch you are able to boot the kernel on your laptop?
>
> Danger, Will Robinson. GRUB, Etherboot, and a whole bunch of other boot loaders
> will recognize an ELF binary and load it as such. They will typically load it
> as an executable (not a relocatable object) -- I doubt many of them check that
> appropriate part of the ELF header -- so unless your kernel can be safely loaded
> *AND RUN* in that mode this is not going to work.

The bzImage be safely loaded run in that mode. The only question is one
of arguments. Because there are no standards. For Etherboot we are good.
For the insanity that is GRUB I haven't the faintest clue but we should
be ok as we don't have a multiboot header.

> The entrypoint is going to be a major headache, since the standard kernel is
> entered in real mode, whereas an ELF file will typically be entered in protected
> mode, quite possibly using the C calling convention to pass the command line as
> (argc, argv). God only knows how they're going to deal with an initrd.
>
> It may very well be that the ELF magic number has to be obfuscated.

The entry point that is exported is the kernels protected mode entry point
that is used after the real mode code has been run. This is to allow
bootloaders like kexec where running the real-mode code is insane or
impossible to be used.

The calling conventions though are not changed, this is just formalizing
something that various groups have been doing for years. Since it is
all in the bzImage we still only have a single file format to support,
so any bootloader that can load a standard bzImage and run the kernels
real mode code should still do it that way but. If you can't the
rest of the information is available.

Eric