問題タブ [os161]
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.
exec - execv で Os/161 のユーザー メモリ アドレス空間へのポインターを取得する方法
私はOs/161execv(char *program, char **args)
で call を書いています。
したがって、プログラムとカーネル空間の引数で提供されたデータ ユーザーのコピーを取得します。次に、引数を持つプログラムがロードされる新しいアドレス空間を作成します。
問題は、ユーザー空間に切り替える前にカーネル空間からユーザー空間にデータをコピーするために、ユーザー空間の仮想メモリへの適切なポインターを見つける方法です。
c - 子プロセスを sys_fork() でフォークして、そのカーネル スタックにトラップ フレームを含める方法は?
カーネル レベルでのシステム コール sys_fork() の実装に取り組んでいます。要件に従って、親プロセスを子プロセスにコピーしました。問題は、子のトラップ フレーム (親のトラップ フレームのコピー) を子のカーネル スタックにコピーして、mips_usermode() でアサーションを渡す方法です。
c - インクリメントの同期プリミティブ
私はスレッドを勉強している初心者です。共通のカウンターをインクリメントするいくつかのスレッドを開始して、0 から 10000 までカウントするために、os161 との相互排除の問題を解決する宿題があります。同期プリミティブを使用して改善する方法がわかりません。助けてください。
operating-system - os161 の親スレッドと子スレッド pid
os/161に精通していて、いくつかの質問に答えてくれる人はいますか?
子pid、親pidはどのように機能しますか。
現在のスレッドに別のスレッド ベースを作成している場合thread_fork()
、新しいスレッドには自分自身の一意の ID と別のファイル記述子テーブルが必要です。sys_fork
から子を作成する間curthread
、子は pid 以外は親と同じです。しかし、私は pid と親 pid がどのように機能するかについて混乱しています。
これがプロセステーブルの私の解釈です。システム全体で 1 つのプロセス テーブルしかありません。今のところparent_pid
、my_pid
すべてのスレッドについてあります。
-親スレッドは複数の子を持つことができます (呼び出し続けることによりsys_fork
)。
- 子は親を 1 人しか持つことができません。
- が呼び出されるたびsys_fork
に、子が作成され、parent_pid
この子の が、この子を作成したスレッドの pid に設定されます。
-pid 1 は、ブート/メニュー スレッド用です。
プロセステーブルがどのように機能するかを理解する上で、私は正しい軌道に乗っていますか?
最後の質問: For sys_waitpid()
: 親だけがwaitpid
?を使用できます。そして、彼らは子供たちを待つことしかできませんか?子waitpid
は親で使用できますか (または、これによりデッドロックが発生しますか)?
Google でいろいろ調べてみたのですが、矛盾が多すぎて、今でも疑問に対する明確な答えが見つかりません。
operating-system - プロセスごとに1つのページテーブルを使用する理由
最初は、システム全体で1つのページテーブルしかないのではないかと思いました。しかし、実際にはプロセスごとに1つのページテーブルがありますか?1つのページテーブルではなく複数のページテーブルを持つことのポイントは何ですか。
os161の一部を実装しています
c - C プログラミング - スレッド、および void (*func)(void*, unsigned long) とは
私はおもちゃの OS システムを変更しようとしていますが、コードの一部とそれが何をするのかを学ぼうとしています。メンバーとして「pcb」構造を持つ「スレッド」構造が与えられました。これは、スレッドを基盤となる物理ハードウェアにインターフェースするプロセス制御ブロックです。
とにかく、この「pcb」構造には、新しく作成されたスレッドの pcb を初期化する初期化関数があります。関数定義は次のとおりです。
コードに関して、最後の引数の意味は何ですか? それはコードまたは指示に関連していますか
概念的に、物事が全体像にどのように適合するかについて、私は混乱しています。私の知る限り、スレッドはコードの実行単位です。たとえば、ユーザープログラムに関連している可能性があるため、スレッドをすばやく切り替えると、プロセスが並行して実行されているように見えます。よし、このスレッドには独自のスタック、レジスタ (理解できない)、およびいくつかの制御 (pcb) が必要です。
これがいたるところにある場合は申し訳ありません。参考までに、私はOS161プロジェクトを開始しています。
ありがとう。
c - OS161は、エラーの前に'='、'、'、';'、'asm'または'__attribute__'を予期していました
私はos161プロジェクトに取り組んでいます。src / kern/includeにあるarray.h提供を含むファイルを作成します。コンパイルすると、次のようなエラーが発生しました:./../include/array.h:85:error:expected'='、'、'、';'、'asm' or'attribute' before'unsigned ' ../../include/array.h:91:エラー:「void」の前に「=」、「、」、「;」、「asm」または「属性」が必要です
コードは次のようなものです。
そして、すべての行で発生したこの種のエラーには、INLINEやARRAYINLINEのようなものがあります。このarray.hファイルは提供されており、変更はしていません。本当に理由を理解することはできません。
c - OS161 : ロード時の TLB ミス
フォーク テストを実行すると、TLB ミス オン ロード エラーが発生します。これは、誤った stackptr を mips_usermode に渡すことが原因であることを理解しています。私の実装は、ここでいくつかの提案を中心に展開しているようです。以下のコードは、thread_fork のエントリ ポイント関数として提供されます。私は何かを見逃していますか?
inline - sfs_inode(OS161)のインラインデータ拡張
こんにちは私はOS161を使用していて、iノード構造を拡張してディスクに書き込むときにファイルデータの最初のチャンクを実際のiノード構造に書き込むようにしています。構造が無駄になります。
上記のsfi_wasteをcharsfi_inlinedata[INLINE_SIZE]に置き換えたいと思います。これにより、ディスクioは常にデータの最初のINLINE_SIZEをsfs_inode構造体に書き込み/読み取ります。以下は、関連するio関数のソースです。ここで、オフセットがio関数の実際のアドレスにマップされる方法を変更する必要があることはわかっていますが、具体的な解決策を思い付くのに苦労しています。 https://github.com/rbui/projectJailBait/blob/master/os161-1.11/kern/fs/sfs/sfs_vnode.c
どんな助けでも大歓迎です!
synchronization - スレッドは割り込みを無効にしてどのようにスリープしますか?
以下のコードがどのように機能するかを理解しようとしています。これは、私の教授の講義スライドからそのまま引用したものです。この P() および V() 関数は、クラス (OS161) で使用する OS のセマフォ実装の一部です。OS161 は広く使用されているため、私の質問に答えるには OS161 を理解する必要があると思います。
講義ノートによるこのコードの理解:
X: P() 関数のフロー
1. スレッドが P() を呼び出すとき、割り込みを無効にします
2. sem->count で利用可能なリソースがあるかどうかを確認します
3.a) if count が 0 の場合、スリープに移行し
ます 3.b) count != 0 の場合、count をデクリメントし、呼び出しスレッドがクリティカル セクションに進むことを許可します
4. V() 関数の割り込み
Y:フローを有効にします
1. スレッドが V() を呼び出すとき、割り込みを無効にします
2. カウンターをインクリメントします。これは、取得できるリソースがもう 1 つあることを意味します
3. 次に、P( でスリープに送信したすべてのスレッドをウェイクアップします)、スレッドがクリティカル セクションへのロックを取得しようとした時点で十分なリソースが利用できなかったためです
。 4. 割り込みを有効にする
私の問題:
1. 「割り込みを無効にする」セクションは、特定のスレッドの割り込みを無効にしますか、それともすべての割り込みを無効にしますか?
2. V() 関数ですべてのスレッドをウェイクアップすると、スレッドは P() 関数の while ループ内でスリープし、while ループの実行を開始します。講義では、1 つのスレッドがロックを取得し、残りはスリープ状態に戻ると書かれています。私の質問は、「sem->count == 0」条件が他のスレッドに対して false と評価されず、1 つだけと評価される理由です。
割り込み無効部分がどのように機能するかを本当に知りたいです。これが私の最初の質問です。スレッドスケジューラを停止しますか?、システムのコンテキストスイッチを停止しますか?
スレッドが割り込みを無効にしてスリープ状態になるのはなぜですか? I/O 完了信号などを見逃す可能性があるので、危険ではないでしょうか。
ありがとうございました。