.bssまたはbssとは、静的にアロケートされた変数のうちプログラムの開始時に0で初期化されているものを含むデータセグメント内の1つのメモリ領域に付けられた名前である。Unix系や Windows を含め、多くのコンパイラやリンカがこの名前を使う。bssセクションあるいはbssセグメントと呼ばれることも多い。
C言語では、初期化式なしで静的にアロケートされた変数は0(数値型の場合)かNULLポインタ(ポインタ型の場合)に初期化される。数値の0とNULLポインタは一般的なコンパイラではすべてのビットが0のビットパターンで表現される[注 1]。bssセクションは初期化式を持たないグローバル変数とstaticキーワードのついた初期化されていないローカル変数を含む。0からなるビットパターンで初期化される変数をbssセクションに割り当ててもよい。
通常、bssセクションに割り当てられたメモリはプログラムローダーがプログラムをロードするときに初期化する。main()
が実行されるより前にCランタイムシステムがbssセクションにマップされたメモリ領域をゼロで初期化する。ただし、必要時まで0で初期化するのを遅延するというテクニックを使ってOSがbssセクションを効率的に実装してもよい。
一部のABIはsbssセグメント(small bssの意)をサポートしている。このセグメントは、特定のアドレスしかアクセスできない命令を使ったコンパクトなコードからもアクセスできるデータ要素を含む。
BSSはBlock Started by Symbolというアセンブラの疑似命令に由来する。このアセンブラUA-SAPは1950年代にRoy Nutt、Walter Ramshawとその他のUnited Aircraft Corporationの人々によって開発された[要出典]。BSSというキーワードは、IBMの709および7090/94コンピュータのアセンブラFAT(FORTRAN Assembly Program)に導入された。
出典・脚注
- ^ ただし、それが C89, C99 の仕様で要求されているわけではない。概念上の 0 やヌルポインタがハードウェア上・メモリ上どのように表現されるかは実装依存とされている。ただし、概念上のヌルポインタや概念上の false は整数に型キャストしたら概念上の 0 にならないといけないとは規定されており、型キャストして概念上の 0 となる値の集合は規定されている。そして、そもそも bss セクションはC言語の仕様の物ではなく、コンパイラの慣習であり、bss セクションを扱うようなコンパイラは、二進法のハードウェアを扱い、概念上の 0 はハードウェア上も全てのビットを 0 で表現している。
関連項目
参考文献