3

x86アーキテクチャブートローダーにスレッドを実装する方法に関するリソース/チュートリアルはどこにありますか...プログレスバーを表示しながらバックグラウンドでリソースをロードしたいとします。

4

2 に答える 2

9

それは非常に珍しい質問です...それについて私の意見を述べさせてください...

  • ブートローダーは、実際にはアセンブリ コードの限られた束であり、正確には 464 バイト、パーティション情報用の 64 バイト、およびブート ローダーの終了を示すマジック マーカー用の最後の 2 バイト、つまり合計 512 バイトです。
  • Grub などのブートローダは、2 フェーズのブートローダを実装することでこの制限を回避できます。最初のフェーズは前述の 512 バイトで、次に 2 番目のフェーズがロードされ、追加のオプションなどが実行されます。
  • 通常、ブートローダ コードは 16 ビット アセンブリです。これは、元の BIOS コードが 16 ビット コードであるためです。これは、プロセッサ 386 から最新のプロセッサまでがリアル モードで起動するためです。
  • 2 フェーズのブートローダを使用すると、最初の 512 バイトは 16 ビットであり、次に 2 番目のフェーズでプロセッサを 32 ビット モードに切り替え、準備としてレジスタとゲート セレクタをセットアップします。次に、実際のプログラムのエントリ コードにジャンプしてブートを行います。 up - これは、ディスク上の特定の場所から読み取る必要があること、またはブート コードが保存されている場所に関するデータを含む構成ファイルを読み取ることを考慮に入れています。
  • 32ビットモードでスレッドを実装することは、アセンブリである種のスケジューラを作成する必要があるため、生成するのが難しいものです(x86アーキテクチャブートローダーでスレッドを実装することについて言及したため)。

C を使用してブートローダの第 2 フェーズ部分を実装することで、これを回避できます (ただし、ランタイム環境がまだセットアップされていないため、標準ライブラリを使用しないという点が厄介です!)

Grub を使用するか、こちらのオープン ソース BIOS ブートローダーをチェックしててください。最近では BIOS がフラッシュ可能になっているため、純粋な 32 ビット BIOS である EFI (Extensible Firmware Interface here )を取得できる場合があります。プロセッサ。ここには、詳細情報を提供する別の Web サイトもあります

起動時のプログレス バーは、残念ながら C/C++ で記述されています (既に 32 ビットでは、環境のセットアップ、タスク スケジューラのセットアップ、スレッドの組み込み、仮想メモリ マネージャーのロードなど - これは、起動手順が完了した後のカーネル レベルです) )、これはスレッドが作成されたプロセスであり、バックグラウンドで実行され、ハードウェアの検出/さらなる環境の設定などを示し、プログレスバーを使用してユーザーに「待ってください、システムがロードされています」と伝えます

于 2009-12-25T03:09:49.543 に答える
-1

この本は、初期化を含む、Linuxカーネルのさまざまな側面について説明しているので、多少役立つかもしれません。UNIXフレーバー全体でかなり標準的なGRUBを確認することをお勧めします。

私が言及した本はあなたの選択のリソースであるはずです、カーネルは初期化サイクルのかなり遅い段階までその金属スレッド対応を考慮しません、そしてこれによって私はスレッド化のためのデータ構造のセットアップが十分に文書化されていることを意味します。

ブートローダーでスレッド構造を許可することの本当の利点は考えられないようですが、まず、シングルスレッドの手続き型コードを使用して基本的なハードウェアをセットアップする方が簡単です。次に、コードが防弾であると期待しているので、スレッドとして防御機構は必要ありません。

So I'd expect you're looking at emulating a progress bar :D

于 2009-12-25T02:02:07.880 に答える