0

ldLinuxでカーネルのアセンブリファイルに対してコマンドを使用しようとしています。grubで起動するには、1Mbアドレスの後にある必要があります。したがって、私のリンクスクリプトには、アドレス0x00100000に向かうテキストが含まれています。

これが私が使用しているリンカースクリプトです:

    SECTIONS {
       .text 0x00100000 :{
            *(.text)
       }
       textEnd = .;
       .data :{
            *(.data)
            *(.rodata)
       }
       dataEnd = .;
       .bss :{
            *(.common)
            *(.bss)
       }
       bssEnd = .;
    }

私の質問は出力ファイルについてです。ファイルのバイナリを見ると、テキストセクションは0x1000から始まります。スクリプト内のテキストの場所を変更し、0x500などの0x1000未満のアドレスを使用すると、テキストはそこから始まります。しかし、0x1000を超えると、丸められます(0x2500はテキストを0x500に配置します)。

テキストを0x100000にするように指定すると、出力ファイルに含まれるべきではありませんか?または、やるべきことがもっとあることを指定するバイナリの別の部分がありますか。カーネルの起動に問題があるので質問していますが、今のところ、リンカーの出力を理解しようとしているだけです。

4

1 に答える 1

0

2つの異なるアドレス空間を参照しています。リンクされたファイル内で参照するアドレス(0x1000や0x500など)は、単なるファイルオフセットです。0x00100000などのリンカスクリプトで指定されたアドレスは、コンピュータメモリ(つまりRAM)に関するものです。

リンカスクリプトの場合、リンカは、バイナリ/実行可能ファイルの.textセクションをRAMの1MiBポイント(つまり0x00100000)にロードする必要があると通知されています。これは、リンカによって出力されるファイルのレイアウトとは関係がなく、実行時にファイルがどのようにロードされるかと関係があります。

実際のファイル内のセクションの位置は、位置合わせと関係があります。つまり、リンカは最初のセクションを4096バイトの境界に揃えているように見えます。たとえば、各セクションのサイズが4096バイト未満で、それぞれが4096バイトの境界に配置されている場合、ファイル内のそれぞれのオフセットは0x1000、0x2000、0x3000などになります。デフォルトでは、この配置はファイルが1回だけ保持されます。前の例で0x00100000、0x00101000、0x00102000などにあるセクションが生成されるようにRAMにロードされます。

また、ロード場所を十分に小さい数に変更すると、リンカーが自動的に配置を変更するように見えます。ただし、手動で配置を指定する場合は、「ALIGN」関数を使用できます。

リンカーの簡潔でわかりやすい説明(上記のすべてをより詳細に説明)については、次のことをお勧めします。

http://www.math.utah.edu/docs/info/ld_3.html

また

http://sourceware.org/binutils/docs-2.15/ld/Scripts.html

于 2012-12-19T15:36:39.773 に答える