問題タブ [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.

0 投票する
1 に答える
904 参照

c - 構造体の配列をユーザー空間からカーネル空間に渡してから戻すのに問題があります

シンプルなトップ ユーティリティ xv6 を作成しようとしています。これを行うために、カーネル空間にアクセスできるようにするシステム コールを作成しました。システム コールの作成方法に関する多くのガイドに従っていますが、コードは問題なくコンパイルされます。

qemu で top を実行しようとすると、問題が発生します。構造体配列がカーネル空間にあるかユーザー空間にあるかに関係なく、構造体配列にアクセスしようとすると、トラップ 14 エラーが発生します。

物事を少し分解するために、top.cファイルがあります:

sysproc.c:

そしてprocs.cで

繰り返しますが、ユーザーからカーネルにテーブルを渡すとテーブルが破損していると思いますが、それを正しく渡す方法がわかりません。

0 投票する
1 に答える
501 参照

unix - xv6 での競合状態

私は OS の分野の初心者であり、xv6 にハッキングして学習しようとしています。システム コールを使用して親または子を実行するかどうかを fork を呼び出す前に決定できるか疑問です。引数をカーネル空間に渡して、最初に実行する親または子のどちらを実行するかを決定します。引数は、1-親 0-子のいずれかです。

0 投票する
1 に答える
1083 参照

c - xv6 でのスタック フレーム操作は、printf() でのみ正しく機能しますか?

オペレーティング システムのクラス用に xv6 カーネルの拡張機能を作成しようとしていますが、奇妙なバグに遭遇し、5 時間も費やしてしまいました。シグナル処理関数と引数を手動で命令ポインターに挿入するシグナル処理システムを実装しました。現在、揮発性レジスターの値をユーザースタックにプッシュして保存し、シグナルハンドラーの後に元のレジスターにポップして保存しようとしています。戻り値。

スタック フレームの設定方法は次のとおりです。

そのため、スタックの一番下を古い命令ポインターに設定し、揮発性レジスターをプッシュし、シグナル ハンドラー引数をプッシュし、レジスターをポップする関数をプッシュし、最後に eip (命令ポインター) をシグナルハンドラのアドレス。

レジスタをポップするために使用している関数は次のとおりです。本当に奇妙なのは、インライン アセンブリの直前に sleep(5) または printf() ステートメントがある場合、プログラムが正しいことを行う (レジスタの値を正しく保存する) ことですが、それを削除すると、私が想定している「範囲外コード」ステートメントは、セグメンテーション違反に相当する xv6 です。レジスタの値が正しく保存されたとしても、ハンドラーが後のシグナル処理呼び出しで失敗するため、スタックがめちゃくちゃになっていることがわかります。

アセンブリをうまくデバッグする方法がよくわからないので、これに対処するのに苦労しています-何が起こっているのか誰にもわかりませんか?

0 投票する
1 に答える
155 参照

c - newlib に静的にリンクされたプログラムを xv6 で実行できませんでした

xv6 で newlib にリンクされたプログラムを実行しているときに、いくつかの問題が発生しました。(これは私が使用した newlib ポートです)

このツールチェーンを使用して newlib をコンパイルしました。コンパイルに問題はなく、libc.a、libm.a、およびその他のライブラリ ファイルを取得できます。

次に、Hello World プログラムを作成し、newlib に対して静的にリンクしました。プログラムは単純に次のようになります。

しかし、生成された実行可能ファイルは xv6 ファイルシステムには大きすぎるため (これは設計上の制限です)、削除しました。ストリップ後のファイル サイズは 53k であるため、fs に入れても問題ありません。

「make qemu」を実行すると、システムに入ることができ、他のプログラムは正常に動作しました。しかし、テスト プログラムを実行すると、数秒間スタックし、「panic: loaduvm: addr must be pagealigned」と表示されます。プログラムを削除したためか、xv6 ソース コードに適用しなければならないパッチや変更があるためか、またはその他の理由によるものですか?

PS私は公式のGithubリポジトリからxv6の最新バージョンを使用しています。以下は、テストプログラムをコンパイルするために使用したフラグです。