コンピュータ プログラミングにおいて、ブロック開始シンボル( .bssまたはbssと略される) は、宣言されているがまだ値が割り当てられていない静的に割り当てられた変数を含むオブジェクト ファイル、実行可能ファイル、またはアセンブリ言語コードの部分です。これは、「bss セクション」または「bss セグメント」と呼ばれることがよくあります。
通常、オブジェクト ファイルには bss セクションの長さのみが保存され、データは保存されません。プログラム ローダーは、プログラムをロードするときに bss セクションにメモリを割り当てます。初期値データを必要とする.dataセクションまたは .rodata セクションの代わりに、値のない変数を .bss セクションに配置することで、オブジェクト ファイルのサイズが削減されます。
一部のプラットフォームでは、bss セクションの一部またはすべてがゼロに初期化されます。Unix系システムとWindows はbss セクションをゼロに初期化するため、すべてゼロ ビットに初期化されるCおよびC++ の静的に割り当てられた変数に使用できます。オペレーティング システムでは、bss セグメントを効率的に実装するために、オンデマンド ゼロ フィルと呼ばれる手法が使用される場合があります。[1]組み込みソフトウェアでは、bss セグメントは、Cランタイム システムによって入力前に ゼロに初期化されるメモリにマップされますmain()。一部の C ランタイム システムでは、bss セグメントの一部を初期化しないことが許可される場合があります。その場合、C 変数は bss セグメントのその部分に明示的に配置する必要があります。[2]
一部のコンピュータアーキテクチャでは、アプリケーションバイナリインターフェースは「小さなデータ」用のsbssセグメントもサポートしています。通常、これらのデータ項目には、特定の範囲のアドレスにしかアクセスできない短い命令を使用してアクセスできます。スレッドローカルストレージをサポートするアーキテクチャでは、スレッドローカルとしてマークされた初期化されていない静的データにtbssセクションを使用する場合があります。[3]
起源

歴史的に、BSS ( Block Started by Symbolから) は、1950 年代半ばに IBM 704 用に Roy Nutt、Walter Ramshaw らが United Aircraft Corporation で開発したアセンブラである UA-SAP (United Aircraft Symbolic Assembly Program) の疑似操作です。[4] [5] BSS キーワードは後に、IBM の 709および7090/94 コンピュータ用の標準アセンブラであるFORTRAN Assembly Program [6] (FAP) および Macro Assembly Program [7] (MAP) に組み込まれました。これはラベル(つまりシンボル) を定義し、指定された数のワード用に初期化されていない空間のブロックを予約しました。[ 8 ]この場合、BSS は、いくつかの別々の小さなデータ位置を個別に予約する代わりに、省略形として機能しました。一部のアセンブラは、指定されたシンボルが予約ブロックの末尾に対応する、補完的または代替的なディレクティブ BES ( Block Ended by Symbol の略) をサポートしています。[9]
C言語でのBSS
Cでは、明示的な初期化子のない静的に割り当てられたオブジェクトは、ゼロ (算術型の場合) またはヌル ポインター (ポインター型の場合) に初期化されます。 C の実装では通常、ゼロ値とヌル ポインター値は、ゼロ値のビットのみで構成されるビット パターンを使用して表されます (C 標準では bss をゼロで埋める必要はありませんが、C ISO 標準 9899:1999 のセクション 6.7.8 または新しい標準のセクション 6.7.9 に従って、 .bss 内のすべての変数を個別に何らかのゼロに初期化する必要があります)。 したがって、BSS セグメントには通常、ファイル スコープ (つまり、関数の外側) で宣言されたすべての初期化されていないオブジェクト(変数と定数の両方)と、初期化されていない静的ローカル変数(キーワードで宣言されたローカル変数)が含まれます。 ただし、静的ローカル定数は宣言時に初期化する必要があります。実装では、ゼロ値のビットのみで構成される値で初期化された静的に割り当てられた変数と定数を BSS セクションに割り当てることもできます。
static
C プログラマーで作家のPeter van der Linden氏は、「これを『Better Save Space』と覚えておく人もいます。BSS セグメントには、まだ値を持たない変数のみが格納されるため、実際にこれらの変数のイメージを格納する必要はありません。BSS が実行時に必要とするサイズはオブジェクト ファイルに記録されますが、BSS (データ セグメントとは異なり) はオブジェクト ファイル内で実際のスペースを占有しません」と述べています。[10]
Fortran での BSS
Fortranでは、共通ブロック変数はこのセグメントに割り当てられます。[11] 一部のコンパイラーは、64ビット命令セットに対して、このセグメントにアクセスする命令のオフセットを32ビットに制限し、サイズを2GBまたは4GBに制限する場合があります。[12] [13] [14] また、Fortranでは静的データをゼロに初期化する必要がないことに注意してください。bssセグメントがゼロに初期化されるシステムでは、共通ブロック変数やその他の静的データをそのセグメントに配置すると、ゼロになることが保証されますが、移植性のために、プログラマーはこれに依存すべきではありません。
参照
参考文献
- ^ McKusick, Marshall Kirk ; Karels, Michael J. (1986). 「Berkeley UNIX の新しい仮想メモリ実装」(PDF) . カリフォルニア大学バークレー校。p. 3. CiteSeerX 10.1.1.368.432 .
- ^ 「メモリセクション」。AVR Libc ホームページ。
- ^ 「ELF 特殊セクション」。Linux標準ベース PDA 仕様 3.0RC1。
- ^ ネットワーク辞書。Javvin Press、2007年、70ページ。
- ^ MIT-IBM 704 コンピュータのコーディング 1957 年 10 月、p. V-10
- ^ FORTRAN ASSEMBLY PROGRAM (FAP) for the IBM 709/7090 (PDF) . IBM. 1961. p. 30. J28-6098-1 . 2017年10月18日閲覧。
- ^ IBM 7090/7094 IBSYS オペレーティング システム バージョン 13 マクロ アセンブリ プログラム (MAP) 言語(PDF)。IBM。1963 年。C28-6392-4。
- ^ Timar, Ted; et al. (1996). 「Unix - よくある質問 (1/7)」. 質問 1.3.
- ^ Free Software Foundation, Inc. 「38.9. ディレクティブ」。as の使用: Gnu アセンブラ as の使用。 2014 年 3 月 19 日時点のオリジナルよりアーカイブ。 2014 年2 月 22 日閲覧。
- ^ Peter van der Linden、「Expert C Programming: Deep C Secrets」、Prentice Hall 1994、p. 141
- ^ Fortran 77 は共通ブロック変数をどのように割り当てるのでしょうか?
- ^ 「IBM RS/6000 および PowerPC オプション」。GNUコンパイラ コレクション (GCC) の使用 - GCC 7.2.0。
- ^ 「SPARC オプション」。GNUコンパイラ コレクション (GCC) の使用 - GCC 7.2.0。
- ^ 「x86 オプション」。GNUコンパイラ コレクション (GCC) の使用 - GCC 7.2.0。
- Stevens, W. Richard (1992)。『Unix 環境での高度なプログラミング』。Addison –Wesley。第 7.6 節。ISBN 0-201-56317-7。
