0

私の理解では、ユーザータスクは3Gのユーザースペースと1Gのカーネルスペースの両方にアクセスできます。ただし、カーネルタスクはその1Gカーネルスペースにしかアクセスできません。しかし、task_structでは、ユーザースペースを指すvm_area_structにリンクしています。正しい場合、これはカーネルタスクがユーザースペースに直接アクセスできることを意味しますか?

4

2 に答える 2

0

ユーザータスクは、ユーザースペース(マップされているエリア)の低い3Gのみにアクセスできます。カーネルは、すべての3G+1Gスペースにアクセスできます。カーネルはユーザースペースアドレスに直接アクセスせず、copy_from(to)_user()APIを使用します。

于 2012-07-27T07:51:36.417 に答える
0

以下はRobertLoveのLKD3からのものです:mm_structとカーネルスレッド(P309)

カーネルスレッドにはプロセスアドレス空間がないため、関連付けられたメモリ記述子がありません。したがって、カーネルスレッドのプロセス記述子のmmフィールドはNULLです。これは、カーネルスレッド(ユーザーコンテキストを持たないプロセス)の定義です。

カーネルスレッドはユーザースペースメモリにアクセスしないため、このアドレススペースの不足は問題ありません。(誰にアクセスしますか?)カーネルスレッドはユーザースペースにページを持たないため、独自のメモリ記述子とページテーブルに値しません。(ページテーブルについては、この章の後半で説明します。)それにもかかわらず、カーネルスレッドは、カーネルメモリにアクセスするためにも、ページテーブルなどの一部のデータを必要とします。カーネルスレッドに必要なデータを提供するには、メモリ記述子のメモリを無駄にすることなく、ページテーブル、またはカーネルスレッドが実行を開始するたびに新しいアドレス空間に切り替えるためにプロセッササイクルを浪費する場合、カーネルスレッドは以前に実行されたタスクのメモリ記述子を使用します。

プロセスがスケジュールされるたびに、プロセスのmmフィールドによって参照されるプロセスアドレススペースがロードされます。次に、プロセス記述子のactive_mmフィールドが更新され、新しいアドレススペースが参照されます。カーネルスレッドにはアドレス空間がなく、mmはNULLです。したがって、カーネルスレッドがスケジュールされると、カーネルはmmがNULLであることを認識し、前のプロセスのアドレス空間をロードしたままにします。カーネルは、カーネルスレッドのプロセス記述子のactive_mmフィールドを更新して、前のプロセスのメモリ記述子を参照します。カーネルスレッドその後、必要に応じて前のプロセスのページテーブルを使用できます。カーネルスレッドはユーザースペースメモリにアクセスしないため、カーネルメモリに関連するアドレススペースの情報のみを使用します。これはすべてのプロセスで同じです。

于 2012-08-10T16:26:57.143 に答える