私たちが日ごろ作っているプログラムは、ノイマン型コンピュータ上で動きます。computer)を指し、プロセッサとメモリを持ったものは大体ノイマン型です。私たちのプログラムもメモリにロードされて動いています。プログラムが動くとき、さまざまな用途でメモリが使用されます。その用途は、機械語をおくためや、変数として値を格納しておくため、またC言語などでは関数呼び出しを行うためのスタックとして使用するため、mallocなどで動的に使うためなど、多岐にわたります。それぞれ用途によってメモリにはいろいろと条件が課せられます。携帯電話やPCのBIOSなどの機械語をおくメモリは、リセットで消えてしまっては困るので、ROMにおかなければいけません。変数をROMにおくと書き換えることができません。変数でも設定などのデータは、普通のRAMでは電源を切ると消えてしまうので、バッテリバックアップ付のRAMやEEPROMやフラッシュROMなどにおく必要があります。720Tが持つMMU(メモリ管理ユニット)というユニットは機械語用のメモリとそれ以外を区別するので、やっぱり同じRAMでも区別しなければいけません。(0x00000000-0x03ffffffの空間のみ)。ノイマン型コンピュータでプログラムを実行するためには、プログラムローダと呼ばれるプログラムが必要になります。プログラムローダは、トランスレータ(=コンパイラ+リンカ)が出力する実行形式ファイルの中にあるプログラムを、正しくメモリに配置しなければなりません。ROMに置き、変数は書き換えられるようにSDRAMに置くといった具合です。プログラムをロードするこのとき、配置の単位となるのがセクションです。セクションは、どのような特性を持ったメモリ(セクション属性)に、どんなデータ(初期値)を、どこから(アドレス[VMA/LMA])置くかといった情報を持っています。セクション情報はプログラムの意味を知っていないと作ることができないため、通常コンパイラが生成します。開発者が自由に作ることもできます。プログラムローダはこれらセクションの情報を読み、正しい場所にプログラムを格納していきます。ちなみに、ROMから起動するようなプログラムの場合、自分がプログラムローダの代わりにプログラムをROMに正しく配置する必要があります。このときにも、セクションが持っている情報がとっても重要で、人間がこの情報を元に正しい位置に配置しなければプログラムは正しく動かないのです。セクションが持つ情報セクションはさまざまな情報を持っています。ここではその情報について、ELFオブジェクトファイルフォーマットのセクションを例に挙げて説明します。名前セクションの名前です。「.text」「.bss」「.data」「.stack」など、そのセクションを説明する名前がついています。種別セクションの種別です。主なものを下に挙げます。このセクションにはシンボル情報が詰まっています属性フラグセクションの属性を示すフラグです。主なものを以下に挙げます。[VMA/LMA]セクションを読み出すべきメモリアドレスです。Address)は、リンカがアドレスを解決する際に利用するアドレスです。変数のアドレス(&value)と一緒です。Address)は、プログラムやデータが実際に配置されるアドレスです。多くの場合はVMA=LMAですが、初期値つきデータ(.data)の場合は異なります。これは、変数のアドレス(VMA)はRAMにありますが、実際の初期値はROMに置かないと消えてしまうため、配置アドレス(LMA)は変数アドレス(VMA)と一致しません。WindowsやLinuxのプログラムのように、プログラムローダによって直接RAM上に配置されるようなプログラムでは、初期値つきデータもVMA=LMAです。データセクションがデータを持っている場合、そのデータが格納されます。サイズセクションを読み出すのに必要なメモリのサイズです。アライメントサイズこのセクションのアライメントサイズが格納されています。この情報は、ふたつのファイルの同一セクションをくっつけるときや、セクションの読み出しアドレスを変えたい場合などに利用されます。重要なセクションセクションのなかには、固有の名前を持った特に重要なセクションが存在します。これらは主にコンパイラやアセンブラが生成するセクションで、コンパイラの規約やオブジェクトファイルフォーマットの規約によって定められた「固有の名前」を持っています。ここではそのいくつかを紹介します。SHF_ALLOC+SHF_EXECINSTR]プログラムのうち、機械語の部分を格納するためのセクションです。プログラムコード)を書き込みます。SHF_ALLOC+SHF_WRITE]プログラムのうち、初期値を持つ変数を格納するためのセクションです。C言語では、「0以外の初期値を持つ大域変数」「0以外の初期値を持つ静的局所変数」がここに置かれます。データとして初期値を持ち、プログラムローダは書き込み可能なメモリを確保した後、初期値を書き込みます。SHF_ALLOC+SHF_WRITE]プログラムのうち、初期値を持たない変数を格納するためのセクションです。0の静的局所変数」が格納されます。C言語の規約では、「この領域はすべて0で初期化されなければならない」と規定されているため、プログラムローダは書き込み可能なメモリを確保した後、すべて0で初期化します。SHF_ALLOC]プログラムのうち、定数(const)を格納するためのセクションです。C言語では、「プログラム中の文字列定数」「const宣言された定数」などが格納されています。この領域は書き換えが起こらないので、プログラムローダは適当な場所に領域を確保し、保持している定数値を書き込みます。ファイル名というコマンドで見ることができます。CODEと表示されています。属性それでは簡単にセクションを使って遊んで見ましょう。次のような簡単なプログラムを作成します。"123,456,789"と表示されるはずです。ここでちょっとした細工を加えます。.data=allocこれは何をしているかというと、本来.dataセクションは初期値をデータとして持っているのですが、その初期値をメモリに置かなくてもよいと指示しています(ただし変数を置く場所は必要なので、allocを指定してメモリ領域は確保させます)。すると、実行結果はこうなります(値は処理系などによって変わります)。./a.out0,0,789%このように、大域変数と静的局所変数の初期値が吹っ飛んでしまいました。ちなみに自動局所変数の初期値が吹っ飛んでいないのは、自動局所変数はメモリ上に置かれた値で初期化されるではなく、命令によって初期化されるからです(逆アセンブルするとよくわかります)。#.rodataを入れ替えるとかもやろうと思ったけど、プログラムが吹っ飛ぶ可能性が高いので、このくらいでやめておきます。