1

これは、プロセス チェックポイントの部分的な実装を要求する割り当ての問題です。

テスト プログラムは配列を割り当て、システム コールを実行し、配列の開始アドレスと終了アドレスを呼び出しに渡します。システムコール関数では、与えられた範囲の内容をファイルに保存する必要があります。

私の理解では、単にcopy_from_usr関数を使用して、指定された範囲から内容を保存できます。ただし、割り当てはトピック「プロセス アドレス空間」に基づいているため、おそらくページ テーブルについて説明する必要があります。特定の範囲に対応する構造体ページを取得できたとします。ページに対応するデータを取得するにはどうすればよいですか?

page_to_virt関数を使用してデータに直接アクセスできますか? 配列は仮想空間で連続しているため、開始アドレスをページに変換してから仮想アドレスに戻し、データの範囲サイズをファイルにコピーするだけでよいと思います。そうですか?

4

1 に答える 1

2

copy_from_user() は大丈夫だと思います。他には何も必要ありません。システム コールを実行すると、カーネル空間にトラップされますが、コンテキストはシステム コールを実行するプロセス コンテキストのままです。カーネルは引き続きプロセスのページ テーブルを使用します。したがって、copy_from_user() を使用するだけで、他には何も必要ありません。

わかりました、この実験を行いたい場合は、void __user *vaddr を使用して mm->pgd(ページ テーブル) をトラバースし、pgd_offset/pud_offset/pmd_offset/pte_offset を使用してページの物理アドレス (ページ サイズの配置) を取得できると思います)。次に、カーネル空間で ioremap() を使用してカーネル空間マッピングを作成し、カーネル仮想アドレス (ページ サイズ) + オフセット (ページ内) を使用して、配列の開始仮想アドレスを取得します。カーネルでは、仮想アドレスを使用してアレイにアクセスできます。

于 2013-03-15T01:49:32.870 に答える