到底是什么"。 = 0x7c00"在链接描述文件中吗?

时间:2017-04-11 14:31:42

标签: linker boot bootloader

究竟是什么"。 = 0x7c00"在链接器脚本中吗?

更具体地说,当我将. = 0x7c00放在链接描述文件的开头时,为什么结果输出文件不以0x7c00 = 31,744个零开头?

据我所知,当PC启动时,BIOS会将512字节MBR放在内存地址0x7c00处。但是,我很困惑链接器的位置计数器究竟如何影响输出文件的布局。

(对于上下文,我试图彻底了解" x86裸机"项目中的示例代码。https://github.com/cirosantilli/x86-bare-metal-examples。我已经在下面包含了整个链接描述文件对于上下文。)

SECTIONS
{
    /*
    We could also pass the -Ttext 0x7C00 to as instead of doing this.

    If your program does not have any memory accesses, you can omit this.
    */
    . = 0x7c00;
    .text :
    {
        __start = .;

        /*
        We are going to stuff everything
        into a text segment for now, including data.
        Who cares? Other segments only exist to appease C compilers.
         */
        *(.text)

        /*
        Magic bytes. 0x1FE == 510.

        We could add this on each Gas file separately with `.word`,
        but this is the perfect place to DRY that out.
        */
        . = 0x1FE;
        SHORT(0xAA55)

        *(.stage2)

        __stage2_nsectors = ABSOLUTE((. - __start) / 512);

        . = ALIGN(512);
        __end = .;
        __end_align_4k = ALIGN(4k);
    }
}

1 个答案:

答案 0 :(得分:1)

看起来". = 0x7c00"不是长度而是绝对地址。它读给我的是设置特殊变量的当前值"。"要成为十六进制值0x7c00,然后它计划在脚本中稍后使用该地址作为偏移量,就像使用. = ALIGN(512)一样,这也是为什么它将该地址保存为__start,以便它可以进行数学运算在得到的图像上。如果您在脚本中操作.,那么它指向添加到图像的最后一块内存,那么您可以使用它来确定总大小:

__stage2_nsectors = ABSOLUTE((. - __start) / 512);

英文将是

起始地点和我结束的地方之间的差异除以扇区大小。