2017-04-11 6 views
0

リンカスクリプトで "。= 0x7c00"と正確に何ができますか?リンカスクリプトで "。= 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

それ". = 0x7c00"は長さではなく絶対アドレスです。それは私に「特殊変数の現在の値を設定する」と読みます。 16進数の値0x7c00であることを確認してから、そのアドレスを. = ALIGN(512)のように後でスクリプトのオフセットとして使用する予定がある場合は、そのアドレスを__startとして保存する理由もあります。英語で

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

の違いのようになります。それは画像に追加メモリの最後のチャンクを指すようにスクリプト中に.を操作するなら、あなたは合計サイズが決定するためにそれを使用することができます開始地点と終了地点の間をセクターサイズで割ったものです。

関連する問題