Coreboot

coreboot（以前は LinuxBIOSとして知られていた）は、フリーソフトウェア財団（Free Software Foundation; FSF）による支持を受けている自由ソフトウェアプロジェクトのひとつである。

 歴史 
corebootプロジェクトは、1999年冬、ロスアラモス国立研究所（Los Alamos National Laboratory; LANL）のAdvanced Computing Laboratory（高度計算機研究所）にて開始された。目標は、高速な起動と高性能なエラー処理を行うBIOSを作成することである。このソフトウェアはGNU General Public License（GPL）の条項の下ライセンスされている。主な貢献者は、LANL、AMD、coresystems GmbHそしてLinux Networx, Incである。Googleはcorebootプロジェクトの一部をスポンサードしている。金融先物取引の企業集団であるは2009年よりcorebootプロジェクトへの援助を開始している。

また、ARMアーキテクチャのサポートを可能とするためDas U-Boot由来のコードが投入、統合されている。

 設計 
corebootは通常、ブートローダを使用せず、直接Linuxカーネルをロードする。しかし、ブートサーバ（boot server）からのコールによりLinuxを起動させるiPXE（元Etherboot）や、Linux、Microsoft Windows 2000/XP/Vista/7やBSDをロードするのに使用されるのような、他の任意のスタンドアローンなELF実行ファイルをロードすることも可能である（以前は、coreboot自身が提供していたAdd-on Layer（ADLO）によりWindows 2000/XP, OpenBSDのサポートを行っていた）。corebootはまたMyrinet, , クラスター接続をはじめとする任意の機器から、ほとんど全てのオペレーティングシステムをロードできる。前述のとおり、Windows 2000/XP/Vista/7、BSDを含むいくつかのOSはSeaBIOSにより提供されるレガシーBIOS機能を必要とする。

coreboot固有の特徴として、x86アーキテクチャ版においては、たった10の命令数のみで32ビットモードに移行し動作するという点が挙げられる（他ほとんど全てのx86用BIOSが16ビットモードでしか動作できないにもかかわらずである）。これはインテルベースのMacintoshコンピュータやその他新規格のPCハードウェアで利用されている、最新のUEFIファームウェアに類似する。

corebootは他のカーネルをロードする、または、カーネルもしくはイメージをブートする代わりにブートローダに制御を渡すこともできる。この方法を利用すれば、Plan 9 from Bell Labsオペレーティングシステム・カーネルを直接ブートすることも可能である。corebootはGNU GRUB2にも対応している。

デフォルトでは、corebootは、他のBIOSがハードウェアアクセスに利用するBIOS割り込みルーチンサービスを提供しない。ペイロードとなるSeaBIOSはBIOS呼び出しを提供しているが故に、そのようなBIOSサービスを要求するOSがあったとしてもcorebootはロードできる。

 corebootの開発とデバッグ 
corebootは何もない状態からハードウェアを初期化しなければならないため、サポートするチップセットやマザーボードへの移植が必要となる。RAMの初期化前の段階で、corebootは、シリアルポートを（キャッシュとレジスタのアドレッシングのみ）初期化する。こうすることで、接続する端末にデバッグテキストを送出することができる。また同様に、（POSTで報告されるエラーコードを診断できるICチップ）を接続し、2桁の16進数診断用コードを出力させるためのポート0x80にバイトコードを送信可能である。別の移植への助力は、IOSS社が販売する商用製品"RD1 BIOS Savior"（日本語名: "RD1 ROM焼き だいじょうぶ!"）へ向けられている。この製品は、二つのブートメモリデバイスを組み合わせたもので、ブートメモリソケットに接続し手動で2つのデバイスを切り替えられる。コンピュータは一方のデバイスから起動し、2番目のメモリデバイスに切り替えることでイメージをリプログラム、即ち焼き込むことが可能となっている。より高価な代替品は外部に取り付けるEPROMやフラッシュメモリプログラマブルデバイスである。また、CPUの代わりとして、もしくはJTAGポート経由で接続するCPUエミュレータの利用も考慮されている。JTAGポートを利用したcorebootを組み込んだ製品の例として、Sage SmartProbeというものがある。BIOSデバイスに焼き込む代わりに、BIOSエミュレータ上でコードをビルド、またはダウンロードできる。

 ペイロード 

corebootは以下の各種ペイロードも読み込み可能である。ペイロードはlibpayloadヘルパーライブラリを利用して作成することが出来るがそれは必須ではない。
 はx86 BIOSの一実装である。データサイズは小さく、GCCを利用し、ほとんどが16ビットC言語で書かれている。
 FILOはGRUBに似たブートローダであり、USBブートをサポートしている。
 Etherbootはネットワーク越しにオペレーティングシステムを起動可能なペイロードである。
 gPXE（現在の名前iPXE）はSeaBIOSのもとで稼働するEtherbootの後継ソフトウェアである。
 TianoCoreはUEFIのオープンソース実装である。TianoCoreはハードウェア初期化機構を持たず、実際の初期化はcorebootの仕事となる。両者を組み合わせることでUEFIの完全なサポートが可能となる。
 Chromium OSにおいてGoogleが採用したブートローダDas U-Bootはその派生物がcorebootのペイロードとして利用可能である。

 DRAMの初期化 

corebootが初期化する最も複雑なハードウェアはDRAMコントローラ（DRAM controller）とDRAM自身である。いくつかのケースでは、課題となるテクノロジーに関する文書が秘密保持契約（Non-disclosure agreement; NDA）に縛られている、またはそもそも利用できない。RAMが初期化されるまではCPUがそれを使用できないため、RAMの初期化プロセスはとりわけ複雑である。それゆえDRAMコントローラとDRAMの初期化のために、初期化コードはCPUの汎用（目的）レジスタ（general purpose register）またはCache-as-RAMのような一時記憶領域の形態をとるしかない。

はRAMの代わりにレジスタを記憶装置として使用するCコンパイラである。これを利用するとタスクはより簡単に実行できる。romccを利用することで、（SMBus）から、DRAMのDIMM上にある（SPD）ROMへのアクセスも比較的容易になり、RAMを使用できるようになる。

比較的最近のx86プロセッサでは、DRAMが初期化されるまでプロセッサキャッシュがRAMとして利用可能である。ただプロセッサキャッシュはCache-as-RAMモードで初期化されなければならない。しかし、これはDRAMの初期化と比べ命令数が少なくて済む。またCache-as-RAMモードはCPUアーキテクチャ依存ではあるが、チップセットやマザーボード単位で変化するDRAMの初期化に比べれば幾分汎用的ではある。

 サポートされているプラットフォーム 
coreboot がサポートする CPU アーキテクチャには、IA-32、x86-64、ARM、ARM64、MIPS、RISC-Vなどがある。サポートされるシステム オン チップ(SOC) プラットフォームには、 OLPC用に開発された Geode GX プロセッサをはじめとするAMD Geodeがある。Artec Group は、 ThinCanモデル DBE61に Geode LX のサポートを追加した。このコードは AMD に採用され、Geode LX プラットフォームにアップグレードされた後、OLPC 用にさらに改良され、coreboot コミュニティによってさらに開発されて他の Geode のバリエーションにもサポートされるようになった。

AMD Geode ベースのプラットフォームでの初期開発以来、coreboot のサポートは多くの AMD プロセッサとチップセットに拡張された。プロセッサ リストには、ファミリ 0Fh および 10h ( K8コア)、最近ではファミリ 14h ( Bobcatコア、Fusion APU ) が含まれている。coreboot のサポートは、AMD チップセットRS690、RS7xx、SB600、および SB8xx にも拡張されている。

AMDは、AMD64マザーボード上のシステムデバイスを初期化するブートストラッププロトコルであるGeneric Encapsulated Software Architecture（AGESA）が2011年初頭にオープンソース化され、AMD64ハードウェア上のコアブートシステム初期化に必要な機能を提供することを目指していた。しかし、2014年時点では、そのようなリリースはAMDによる将来の開発の基礎となることはなく、その後中止された。