
これは現在64ビットプロセッサと現在のLinuxカーネル(4.6.4を使用しています)のコンテキスト内にあります。
カーネルモジュールでなくても、起動時にデフォルトメモリ640k以下を確認できるプログラムを書くことはできますか?
InfiniBandプロトコルSRPを使用してInfiniBandネットワークを介してリモートでボリュームを起動しようとしています。これはiSCSIブートと非常によく似ていますが、実際にこれを行うことについて明らかになっていないようです。
iPXE(ネットワークブートファームウェア)を使用しています。 SRPプロトコルを使用してリモートボリュームに接続でき、カーネルとinitramfsを正常にロードしました。ただし、実行がカーネルに渡されると、カーネルはまだリモートボリュームに接続されていないため、これを知らないか見えません。
iPXEは、接続者との接続方法に関する情報を、sBFT(ACPIテーブル)と呼ばれる基本メモリ(< 640k)に保存します。
iSCSIは非常に似た機能を実行します。ブートローダはこの情報をiBFTというACPIテーブルに保持しますが、iBFT構造にsysfsインタフェースを提供するカーネルモジュールiscsi_ibftがあります。 ib_sbftカーネルモジュールなどのInfiniBand sBFTに対応することを見たことはありません。
だから、誰か(おそらく私)が存在しないib_sbftカーネルモジュールを書く必要がある場合は、それがうまくいくのかどうか疑問に思います。
または、プログラムがメモリの競合なしにプライマリ(< 640k)メモリにアクセスする方法はありますか?そして(おそらく)他のメモリによって上書きされる前に?
私はmkinitcpioを使用して初期のRAMディスクを作成し、初期起動中にプログラムを実行するArch Linuxを使用していますが、その頃は遅すぎて保護モードで実行されていると思います。 (これが変わらない限り、リアルモードは16ビットで実行され、16ビットにコンパイルする必要がある初期のRAMディスクプログラムに関する情報を見たことがないため、遅すぎると思います。)
答え1
initramfs
すべての意図と目的のために、ファイルシステムはロードされた別のファイルシステムに過ぎず、/
ここで実行されるプログラムは次からロードされます。ユーザースペース実行中のカーネルの下にあります。これは、他のプログラムと同じ制限があることを意味します。
次の方法で必要なデータを見つけることができますが、/dev/mem
特定の実装に依存してはいけませんiPXE
。他のベンダーと他のPXEbootプロセス間で状況が簡単に変更されることがあります。
通常、この情報はカーネル呼び出しコマンドの一部として渡される必要があるため、/proc/cmdline
ユーザー空間プログラムがそれを解析して必要な操作を実行できる場所に表示されます。
答え2
initramfsで実行されるプログラムは完全に正常なプログラムです。他のLinuxプロセスのように実行されます。
リアルモード(32ビットx86プロセッサの起動時のレガシーモード)から保護モード(286世代以降の32ビットx86プロセッサの通常動作モード)への移行は、Linuxカーネルの起動プロセスの初期に発生します。ドライバーもまだ起動していません。
周辺機器が特定の物理アドレスに何かを保存している場合は、そのデバイスからアクセスできます/dev/mem
。その範囲の物理アドレスを使用しないようにカーネルに指示する必要があります。どうすればいいかわかりません(IIRCにはカーネルコマンドラインオプションがありますが、今は見つかりません)。
ただし、必要なものは通常のACPI機能の一部としてすでに存在する可能性があります。つまり、生のACPIデータへのアクセスを提供しますが、解析されたデータ(例:iscsi_bft
。