これは現在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
ユーザー空間プログラムがそれを解析して必要な操作を実行できる場所に表示されます。