問題タブ [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でシステムコール関数に値を渡す方法は?
XV6 で単純な優先度ベースのスケジューラを作成しようとしています。これを行うには、プロセスが優先度を設定できるようにするシステム コールも作成する必要があります。ここや他の場所で説明されているように、システム コールを作成するために必要なすべてのことを行いました。
xv6 でシステム コール / ユーティリティを追加するにはどうすればよいですか
問題は、関数を呼び出すときに変数を渡すことができないことです。むしろ、何も問題がないように実行されますが、正しい値が関数内に表示されません。
外部宣言 (syscall.c):
システムコール ベクトル (syscall.h):
実装 (sysproc.c):
(defs.h & user.h):
マクロ (usys.S):
関数呼び出し:
出力:
値は常にまったく同じ 16843009 です。値を pid と pty に割り当てて、cprintf が正しく機能しているかどうかを確認しました。考えられるすべての可能な組み合わせを試すのに約 6 時間を費やしましたが、XV6 にはシステム コールを介して値を渡す組み込みのメカニズムがないと考え始めています。何か不足していますか?前もって感謝します。
process - プロセスを強制終了するとき、その「eax」を使用して終了ステータスを保存できますか?
私は OS クラスを受講しており、XV6 を拡張exit()
して終了ステータスをサポートする必要があるため、 exit2(int)
.
killされたプロセスの終了ステータスを保存する目的で、2つの候補を考えました。
最初のオプションは
struct proc
、終了ステータスの変数を追加することでした。このソリューションに関する私の問題は、ほとんどの原因で OS の基本的な構造を変更する必要があることです。2 番目のアイデアは、強制終了されたプロセスのトラップ フレーム レジスタに終了ステータスを保存することでした
eax
。
より良いアイデアは何ですか?(またはそれ以下)
assembly - CS:EIP の比較
gdbを使用してxv6(教育用OS)での起動を理解しようとしています。
初期ブート中の命令の 1 つ (AT&T 構文) は次のとおりです。
その後、
今、私が理解していることから、cmpl は 2 つの値を比較してフラグを設定し、jne はフラグを見て、比較したばかりの値が等しくない場合はジャンプします。
しかし、オペランドとしての %cs:0x65a4 の意味がわかりません。これはアドレスの値 (cs*16 + 65a4) を参照していますか、それともそのメモリ位置の実際の内容を参照していますか?
システムが jne 命令の後にジャンプしないためです。つまり、2 番目のオペランド (%cs:0x65a4) がゼロに評価されます。しかし、アドレスもその内容もゼロではないため、そうすべきではありません。
unix - 構造パラメータを持つシステムコールを実装するには?
構造体変数への参照を渡すシステム コールを実装し、同じファイルに値を表示したいと考えています。
たとえば、次の構造があります。
実装したいシステムコールがint getProcessIds(struct procInfo*)
であり、 というファイル内で呼び出すとしましょうpcid.c
。
システムコールでファイル内のスケジューラからプロセス ID を取得してproc.c
、ファイル内に出力できるようにしpcid.c
ます。
入力パラメーターを持たない通常のシステム コールを作成する方法を知っています。ファイル内でこのシステム コールを使用してプロセス ID を出力する方法も知っていproc.c
ますが、ファイル内でそれらを出力する方法がわかりませんpcid.c
。構造体ポインターがどのように返されるのか理解できないので、pcid.c
.
同様のシステム コールint fstat(int fd, struct stat*)
を実行しましたが、構造体ポインタがどのように返されるかわかりません。
私の質問が明確であることを願っています。私は XV6 オペレーティング システムを使用しています。ありがとう!
更新しました
メモリを割り当てるために malloc を使用する必要はありませんでした。これは奇妙なことですが、構造体に別の変数を追加したので、次のようになりました。
proc.c
ファイル 内のシステムコールの後、値を出力する方法を次に示します。
しかし、奇妙なことに、 が得られますがtrap 14 err 4 on cpu 1 eip 0x510 addr 0x7417ba08--kill proc
、値を 1 つだけ出力してみましたが、うまくいきました。
または
そのうちの 1 つだけを印刷したときに機能したのはなぜですか? 正しく印刷されていますか?
c - xv6 カーネルの構文を理解するのに助けが必要
xv6 カーネルのファイルを読み込んでいますが、次の意味がわかりません。
誰かが私にこれを説明できますか?特に角括弧 (例: [SYS_fork]) の意味。ありがとうございました
c - 関数内の親と子の間でパイプを転送する
次の点で問題があります
。パイプを関数内の子ノードに送信しようとしていて、子ノードに書き込みをさせようとしています。
次のコード部分はそれをよりよく説明します:
runcmd には次のコードが含まれます。
悲しいことに、予想される結果は次のようになるはずです-親はIDを出力します(getpidは現在実行中のプロセスIDを返す関数です)が、呼び出されても何も出力されません。私は何を間違えましたか?
c - 1 つのパイプの複数のライターから読み取る
複数の子プロセスに与えられたパイプから char* データを読み取ろうとしています。
各子は、親プロセスが読み取る共有パイプに char* を書き込みます。
私たちがやろうとしているのは、xv6 で実行されている子プロセスに関する情報を解析することです。
単一のプロセスを解析する場合、問題はありませんが、「runcmd」への再帰呼び出しがあるパイプ プロセスを解析する場合、次の問題が発生します。
親の最後で次のコードを使用しました。
そして子供の最後で:
このコードを「ls|cat」で実行すると、次のように出力されます。
各子から読み取って印刷する代わりに
なぜ別々に送らないのですか?