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