How vmlinux is recognized?

luca ellero lroluk at gmail.com
Thu May 12 03:26:38 EDT 2011


On 12/05/2011 8.21, Sudheer Divakaran wrote:
> On Thu, May 12, 2011 at 10:02 AM, Sudheer Divakaran
> <inbox1.sudheer at gmail.com>  wrote:
>> Hi Vikram,
>>
>> On Thu, May 12, 2011 at 9:02 AM, Vikram Narayanan<vikram186 at gmail.com>  wrote:
>>> On Thu, May 12, 2011 at 1:51 AM, Mulyadi Santosa
>>> <mulyadi.santosa at gmail.com>  wrote:
>>>> On Thu, May 12, 2011 at 03:11, Vikram Narayanan<vikram186 at gmail.com>  wrote:
>>>>> Yes. I agree. But how who converts the ELF binary to raw binary so
>>>>> that the processor understands. Or how is it actually done?
>>>>
>>>> OK I try my best to understand your question :)
>>>>
>>>> i think I got it...you probably guessed that vmlinux created first,
>>>> then vmlinuz... AFAIK, it's the other way around...or more precisely,
>>>> not both.
>>>
>>> I think you got it wrong. I will try to put my question more elaborately.
>>> 1) The system is on and BIOS code runs. It gives the control to the
>>> boot loader, say GRUB.
>>> 2) Grub picks up the kernel from the specific partition. (i.e a
>>> vmlinuz image), which denotes that it is compressed.
>>> 3) There are uncompression routines in the kernel itself, If I am not
>>> wrong. So the kernel uncompresses itself.
>>> 4) Now the uncompressed thing is the vmlinux image, right?
>>> 5) The vmlinux is in ELF format. Correct?
>>> 6) If the OS boots and if u try to run an ELF file, the loader knows
>>> how to load that in the RAM. (I mean it knows how to interpret the ELF
>>> format)
>>> 7) Coming back to the vmlinux image, Who takes care of the loading activity.?
>>> 8) Who recognizes that the image is ELF format and do the necessary
>>> things accordingly.?
>>>
>>> Hope I have my question clear now.
>>>
>>
>>
>>
>> If understand your question correctly, you believe that the
>> uncompressed kernel is in elf format. correct?. it is in binary
>> format, so elf interpretation is not required, #5 is wrong.
>>
>> You can see this by building the kernel using 'make V=1'  and note the
>> following line in the output,
>>
>> "arch/x86/boot/tools/build arch/x86/boot/setup.bin
>> arch/x86/boot/vmlinux.bin CURRENT>  arch/x86/boot/bzImage"
>>
>> means bzImage is made out of two binary files extracted from the elf images.
>
> One more info I want to clarify is,  vmlinux.bin mentioned in the
> above snippet contains the compressed binary image and some other
> routines. Just go through the 'make V=1' output, you can see that the
> build process is actually compressing binary file extracted from the
> vmlinux elf image, which is again combined with some object files,
> creates another elf and again extracts the binary and finally combined
> with the setup.bin to create the final bzImage. So, elf interpretation
>   doesn't happen on the uncompressed code.
>


Let's put some order here. The image that almost all bootloaders use is 
arch/x86/boot/bzImage which is made of a setup binary file (executable) 
joined with some compressed code (the real kernel) which is uncompressed 
in memory by the setup binary.

The big suggestion I can give is to check the hidden files which end 
with .cmd. There is one of these for every object created by the 
compilation process. For example there is a file called .bzImage.cmd 
which tell you how bzImage was made:

arch/x86/boot/tools/build -b arch/x86/boot/setup.bin 
arch/x86/boot/vmlinux.bin CURRENT > arch/x86/boot/bzImage

NOTE: I refer to a quite old kernel here, it's likely that the 
compilation process has changed somehow.

You can proceed now in reverse order to find how bzImage was made (if I 
understand correctly that is the one you are interested in).

Here is how is made on my kernel tree:

bzImage:
arch/x86/boot/tools/build -b arch/x86/boot/setup.bin 
arch/x86/boot/vmlinux.bin CURRENT > arch/x86/boot/bzImage

arch/x86/boot/vmlinux.bin:
objcopy  -O binary -R .note -R .comment -S 
arch/x86/boot/compressed/vmlinux arch/x86/boot/vmlinux.bin

arch/x86/boot/compressed/vmlinux:
ld -m elf_i386   -T arch/x86/boot/compressed/vmlinux_32.lds 
arch/x86/boot/compressed/head_32.o arch/x86/boot/compressed/misc.o 
arch/x86/boot/compressed/piggy.o -o arch/x86/boot/compressed/vmlinux

arch/x86/boot/compressed/piggy.o:
ld -m elf_i386   -r --format binary --oformat elf32-i386 -T 
arch/x86/boot/compressed/vmlinux.scr 
arch/x86/boot/compressed/vmlinux.bin.gz -o arch/x86/boot/compressed/piggy.o

arch/x86/boot/compressed/vmlinux.bin.gz:
gzip -f -9 < arch/x86/boot/compressed/vmlinux.bin > 
arch/x86/boot/compressed/vmlinux.bin.gz

arch/x86/boot/compressed/vmlinux.bin:
objcopy  -O binary -R .note -R .comment -S vmlinux 
arch/x86/boot/compressed/vmlinux.bin

vmlinux:
ld -m elf_i386 --build-id -o vmlinux -T arch/x86/kernel/vmlinux.lds 
arch/x86/kernel/head_32.o arch/x86/kernel/init_task.o  init/built-in.o 
--start-group  usr/built-in.o  arch/x86/kernel/built-in.o 
arch/x86/mm/built-in.o  arch/x86/mach-default/built-in.o 
arch/x86/crypto/built-in.o  arch/x86/vdso/built-in.o  kernel/built-in.o 
  mm/built-in.o  fs/built-in.o  ipc/built-in.o  security/built-in.o 
crypto/built-in.o  block/built-in.o  lib/lib.a  arch/x86/lib/lib.a 
lib/built-in.o  arch/x86/lib/built-in.o  drivers/built-in.o 
sound/built-in.o  arch/x86/math-emu/built-in.o  arch/x86/pci/built-in.o 
  arch/x86/power/built-in.o  net/built-in.o --end-group .tmp_kallsyms2.o

NOTE: there are 2 vmlinux (vmlinux and arch\x86\boot\compressed\vmlinux) 
and 2 vmlinux.bin (arch\x86\boot\compressed\vmlinux.bin and 
arch\x86\boot\vmlinux.bin) which are not the same


Hope this helps
Regards
Luca Ellero







More information about the Kernelnewbies mailing list