問題タブ [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 を作成しようとしています。これを行うために、カーネル空間にアクセスできるようにするシステム コールを作成しました。システム コールの作成方法に関する多くのガイドに従っていますが、コードは問題なくコンパイルされます。
qemu で top を実行しようとすると、問題が発生します。構造体配列がカーネル空間にあるかユーザー空間にあるかに関係なく、構造体配列にアクセスしようとすると、トラップ 14 エラーが発生します。
物事を少し分解するために、top.c
ファイルがあります:
sysproc.c:
そしてprocs.cで
繰り返しますが、ユーザーからカーネルにテーブルを渡すとテーブルが破損していると思いますが、それを正しく渡す方法がわかりません。
unix - xv6 での競合状態
私は OS の分野の初心者であり、xv6 にハッキングして学習しようとしています。システム コールを使用して親または子を実行するかどうかを fork を呼び出す前に決定できるか疑問です。引数をカーネル空間に渡して、最初に実行する親または子のどちらを実行するかを決定します。引数は、1-親 0-子のいずれかです。
c - xv6 でのスタック フレーム操作は、printf() でのみ正しく機能しますか?
オペレーティング システムのクラス用に xv6 カーネルの拡張機能を作成しようとしていますが、奇妙なバグに遭遇し、5 時間も費やしてしまいました。シグナル処理関数と引数を手動で命令ポインターに挿入するシグナル処理システムを実装しました。現在、揮発性レジスターの値をユーザースタックにプッシュして保存し、シグナルハンドラーの後に元のレジスターにポップして保存しようとしています。戻り値。
スタック フレームの設定方法は次のとおりです。
そのため、スタックの一番下を古い命令ポインターに設定し、揮発性レジスターをプッシュし、シグナル ハンドラー引数をプッシュし、レジスターをポップする関数をプッシュし、最後に eip (命令ポインター) をシグナルハンドラのアドレス。
レジスタをポップするために使用している関数は次のとおりです。本当に奇妙なのは、インライン アセンブリの直前に sleep(5) または printf() ステートメントがある場合、プログラムが正しいことを行う (レジスタの値を正しく保存する) ことですが、それを削除すると、私が想定している「範囲外コード」ステートメントは、セグメンテーション違反に相当する xv6 です。レジスタの値が正しく保存されたとしても、ハンドラーが後のシグナル処理呼び出しで失敗するため、スタックがめちゃくちゃになっていることがわかります。
アセンブリをうまくデバッグする方法がよくわからないので、これに対処するのに苦労しています-何が起こっているのか誰にもわかりませんか?
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の最新バージョンを使用しています。以下は、テストプログラムをコンパイルするために使用したフラグです。