|
1、在bootsect.S中将setup从磁盘拷贝到内存0x90200处,拷贝的扇区数是4,也就是拷贝2048字节,如果setup大于2048字节怎么办呢?我的系统上就是7千多字节,我看了代码似懂非懂的似乎在setup.S里有处理。
2、在三个.S执行过程中,bootsect setup system的位置是怎样移动的,我是这样理解(地址均为绝对地址):加电自检后,如果从软盘引导系统(我看的2.6.16不再支持,必须要用boot loader),BIOS读入bootsect到0x7c00,bootsect将自己移动到0x90000(512字节),bootsect将setup从磁盘读入到0x90200,紧挨着bootsect。bootsect将system(head.S+misc.o+kernel)从磁盘读入到0x10000,然后setup把通过BIOS获得的系统信息拷贝到0x90000开始的区域给保护模式代码所用,bootsect被覆盖。然后下面就不怎么看得懂了。
问题:
(1)setup如何搬system的?
(2)setup怎么跳到head.S去执行的?
以上似乎根据-D__BIG_KERNEL__有不同的分支,请高人指点。
----------------------------------
再贴一些看不懂的代码片段,请高手帮忙注释
---------------1-----------------
......
start_of_setup:
# Bootlin depends on this being done early
movw $0x01500, %ax
movb $0x81, %dl
int $0x13
......
---------------2-----------------
......
movw $1, %ax # protected mode (PE) bit
lmsw %ax # This is it!
jmp flush_instr
flush_instr:
xorw %bx, %bx # Flag to indicate a boot
xorl %esi, %esi # Pointer to real-mode code
movw %cs, %si
subw $DELTA_INITSEG, %si
shll $4, %esi # Convert to 32-bit pointer
# jump to startup_32 in arch/i386/boot/compressed/head.S
#
# NOTE: For high loaded big kernels we need a
# jmpi 0x100000,__BOOT_CS
上面的一段似乎会跳去head.S,可是jmpi 0x100000,__BOOT_CS就不理解了,此时kernel还没有decompress,怎么会从setup直接跳到0x100000呢?
---------------------------------- |
|