[解決済み] 構造体をxv6システムコールに渡す
質問
xv6システムコールに直接パラメータを渡すことができず、ビルトインされたメソッドを使用することを余儀なくされていることは承知しています。
しかし、このサイトのすべての例と質問は、システムコールに整数を送信する方法についてです。その答えは、argint()メソッドを使用することです。
しかし、私の質問は、xv6システムコールに"struct"を渡す方法はあるのでしょうか?また、この目的のための統合されたメソッドはあるのでしょうか?
もしあるのなら、簡単な例を言っていただけませんか?
どのように解決するのですか?
システムコールで構造体を渡すことは可能です。
構造体そのものをシステムコール パラメータとして渡すことはできませんが、構造体へのポインタを渡すことは可能で、入力パラメータまたは出力パラメータとして使用することができます。
データへのポインタではなく、データそのものを引数として使用できるようにすると、システムコールの仕組みの要件が損なわれてしまいます。
既存のシステムコールfstatの実装を見てみましょう。
int fstat(int fd, struct stat *st);
fstatは、ファイル記述子番号を入力として要求し、それに対応するstats情報をstat構造体として出力します。
struct stat {
short type; // Type of file
int dev; // File system's disk device
uint ino; // Inode number
short nlink; // Number of links to file
uint size; // Size of file in bytes
};
fstatは構造体ポインタを出力パラメータとして使用しますが、入力として使用する場合も同様です。
カーネルコード内の関数sys_fstatがfstatシステムコールの実装を開始します(XV6ではユーザ空間からのパラメータ取得をsys_*関数で処理するのが慣例となっています)。
int sys_fstat(void)
{
struct file *f;
struct stat *st;
if(argfd(0, 0, &f) < 0 || argptr(1, (void*)&st, sizeof(*st)) < 0)
return -1;
return filestat(f, st);
}
この関数は、まず、fstat関数の第1引数で受け取ったファイル記述子番号に対応する構造体ファイルを取得します(argfdを使用)。次に、argptr を使用して、fstat 関数の 2 番目の引数で受け取った構造体 stat ポインタを取得し、与えられたポインタをローカル (関数スコープ) ポインタ変数に保存します。
この時点で、すべての引数がフェッチされ、カーネル実装で使用できるようになりました。
注意 struct stat ポインターはユーザー空間ポインター(仮想空間の下半分に位置する)ですが、カーネルがプロセスのシステムコールに対応するとき、プロセス自身のページングテーブルを使用するので、カーネルがここでそれを使用することは安全です。
関連
-
[解決済み] c - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み】strcmpが機能しない
-
[解決済み】cudamalloc()の使用。) なぜダブルポインタなのか?
-
[解決済み] [Solved] .Cファイルをコンパイルしています。アーキテクチャ x86_64 の未定義シンボル
-
[解決済み】シンプルなC言語のscanfが機能しない?重複
-
[解決済み】whileループの時間複雑性(Big O)はどうやったらわかるの?
-
[解決済み] XV6でシステムコール関数に値を渡すにはどうしたらいいですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 構造体のsizeofは、なぜ各メンバーのsizeofの合計と等しくないのですか?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】"Expected expression before ' { ' token"(トークンの前に期待される式)。
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み】C 未知の型名「my_structure」。
-
[解決済み】LinuxのI_PUSHに相当するもの
-
[解決済み】「複数の定義」「最初に定義されたのはここです」エラーについて
-
[解決済み】C言語で入力が整数型かどうかチェックする
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み】.axfファイルとは何ですか?
-
[解決済み】Linuxソケットのwrite()でBad File Descriptorが発生するC