On Mon, 29 Mar 2010 00:06:49 -0400 Sergio Andr__s G__mez del Real <sergio.g.delr...@gmail.com> wrote:
> Hi. > I can't seem to understand this piece of i386 boot code: > What I understand is that BIOS loads MBR at 0x7c00, then jumps to the > code there, code that relocates itself to and jumps to 0x600, but what > does movw $main-EXEC+LOAD,%si mean? if it's the source address to copy > from, why is it $main (0x7c00) - EXEC (0x600) + LOAD (0x7c00) above > main? then, movw $main,%di is the address to copy to... wasn't 0x600 > the address to copy to? then jump to jmp main-LOAD+EXEC (0x600)? > > I guess I am really missing something here, but I can't get to > understand what's happening. > > start: cld # String ops inc > xorw %ax,%ax # Zero > movw %ax,%es # Address > movw %ax,%ds # data > movw %ax,%ss # Set up > movw $LOAD,%sp # stack > # > # Relocate ourself to a lower address so that we are out of the way when > # we load in the bootstrap from the partition to boot. > # > movw $main-EXEC+LOAD,%si # Source > movw $main,%di # Destination > movw $0x200-(main-start),%cx # Byte count > rep # Relocate > movsb # code > # > # Jump to the relocated code. > # > jmp main-LOAD+EXEC # To relocated code > The boot loader was linked to run at EXEC, so main is actually EXEC plus the offset to main from EXEC. So main-EXEC+LOAD results in calculating the offset to main at the place where the BIOS loaded it ==> LOAD+offset_to_main. This must be used as the source address for the movsb. -- Gary Jennejohn _______________________________________________ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"