問題タブ [xv6]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - XV6: ptable の初期化
私は話している:
これは proc.c ファイルにあります。
誰かが初期化されている場所を説明できますか? なぜなら、proc.c に何か (プロセス) が追加されているのを見たことがないからです。
より正確に言うと、スケジューラ コードを見ているとしましょう。
の:
ptable の各プロセスをループ処理していることがわかります。私の質問は、どうやってそこにたどり着いたのですか? ありがとう!
c - XV6 makefile のコード ブロックを理解する
XV6 makefile から次のコード ブロックを理解しようとしています。
上記のすべてのオプションを説明しているリファレンスはどこにありますか? たとえば、GNU Web サイトでオプション「-N」を探してみましたが、見つかりませんでした。
前もって感謝します
operating-system - ディスクイメージの qemu リクエスト
xv6 で qemu を起動して実行しようとしていますが、xv6 のコンパイルに問題があります。qemu が受け入れるディスク イメージの種類は何ですか。たとえば、Qemu は .ISO ファイルを受け入れますか? FreeBSD をロードしようとしましたが、QEMU から起動可能なデバイスがないというエラーが表示されます。
operating-system - xv6 スケジューラがすべてのループの最初に sti() を呼び出すのはなぜですか?
同人誌は言う
アイドル状態の CPU で定期的に割り込みを有効にする理由は、プロセス (シェルなど) が I/O を待機しているため、RUNNABLE プロセスがない可能性があるためです。スケジューラが常に割り込みを無効のままにすると、I/O が到着しなくなります。
しかし、ptable.lock を解放するたびに割り込みが再び有効になるため、外側の for ループの前に sti() を 1 回呼び出すだけでよいと思います。
c - xv6 オペレーティング システムでトリプル インダイレクションを実装しようとすると XV6 がクラッシュする
元の xv6-rev7 オペレーティング システムには以下が含まれます。
12 個の有向ブロック
1 個の間接ブロック (128 ブロックを指す)
これは、140 個のブロックがあることを意味します。
各ブロックのサイズは 512KB ==> 512 * 140 = 71,680 ~= 70KB が xv6 のファイル サイズの制限です。
サイズが 40MB のファイルをサポートするために、xv6 でトリプル間接アクセスを実装したいと考えています。
それを行うには、トリプル間接の前にダブル間接を実装する必要があります。
だから私は持っていた12から2つの指示されたブロックを取った。
1 つは二重間接用、もう 1 つは三重間接用です。
これは私が今持っているものです:
直接: 10 ブロック
シングル間接: 128
ダブル間接: 128*128
トリプル間接: 4*128*128 (40MB には十分なので、128 ではなく 4 を使用しています)
これが理由#define NDIRECT 10
であり、uint addrs[NDIRECT+3];
ファイルのサイズ制限 = (10 + 128 + 128*128 + 4*128*128)*512kb = 42,013,696 ~= 42MB
だからコンセプトはわかる。トリプルインダイレクションの実装はbmap
file の関数にありますfs.c
。
これはどのように見えるかです:
サイズが 8.5MB のファイルを作成しようとすると、何らかの理由で失敗します。bochs
エミュレーターを使用しています
また、mkfs.c でどの値を変更する必要があるかもわかりません。
fs.h:
fs.c:
mkfs.c:
bigfile.c:
xv6 - 空きページ リストを初期化するためにすべての物理メモリをマップする必要があるのはなぜですか?
付属書の32 ページに次のように書かれています。
ブートストラップの問題があります。アロケータが空きリストを初期化するには、すべての物理メモリをマップする必要がありますが、これらのマッピングを使用してページ テーブルを作成するには、ページ テーブル ページを割り当てる必要があります。
理由がわかりません。rangeの場合[end,PHYSTOP)
のように、カーネルが からすべての 4K ページを埋めないのはなぜですか?struct run
[end,4M)
すべての物理メモリが既にマップされている必要があるのはなぜですか?