3.2 实模式汇编代码header.S
如上所述,第一和第二部分是实模式代码,这些代码来自于汇编程序arch/x86/boot/header.S和c程序arch/x86/boot/main.c。
再从加载开始说,如上所述,vmlinuz保护模式的代码加载到0x100000开始的位置。而实模式的代码,因为被加载的位置不要求是固定的,也就是上面文档中看到的:
Kernel setup | The kernel real-mode code.
Kernel boot sector
它们的位置是X,其不确定性是受Boot loader,也就是grub大小的影响。
3.2.1 无用的bootsect代码
所以,我们先来看header.S的代码,第46行:
46 .global bootsect_start
47 bootsect_start:
48
49 # Normalize the start address
50 ljmp $BOOTSEG, $start2
这是bootsect开始代码,也就是vmlinuz第一个512字节的源代码。
我们看到$BOOTSEG是在源代码的第28行定义的BOOTSEG=0x07C0。没错,这个ljmp