2011-10-31 11 views
0

カーネルメモリポインタに格納されたユーザーコンテキストデータを持っているとします。私もuser-space char *へのポインタを持っているとします。それから私はカーネルスレッドを作成し、カーネルスレッドはこれらの2つのポインタを持つことができます。スレッドから、ポインタを使用してユーザー空間データにアクセスできますか?私はシステムコールでそれらにアクセスできますが、問題はカーネルスレッドからアクセスできますか? Workqueueからそれらにアクセスするのはどうですか?ユーザーの仮想メモリにアクセスするためのLinuxユーザープロセスコンテキスト

は私userprocessは、私はすべての1 seceondに "これはデータである" 印刷するkt_funcたい

void sys_340(void* p) { 
    th = kthread_run("kth", kt_func, p); 
    //might also store process context as I am in system call!! How? 
} 

void kt_func(void *p) { 
    while(1){ printk("Line: %s\n",p); sleep(1000); } 
} 

システムコールハンドラでシステムコール

//User Application 
char* abc = "This is data."; 
syscall(340, p); 

を呼び出すと言います。

答えて

0

カーネルスレッドは、(それらが適切なポインタを持っていることを前提として)ユーザ空間メモリの任意の部分にアクセスできます。コードでは、システムコールの一環として、新しいカーネルスレッドを開始し、1秒ごとに何かを印刷させたいと提案しています。私は、カーネルスレッドを作成した後、システムコールから戻ると想定しています。ここでの問題は次のとおりです。システムコールから復帰すると、ユーザプロセスはpで示されるメモリにもアクセスでき、カーネルスレッドもそれにアクセスできます。どのようにポインタの同期アクセスを保証しますかp? (多分別のシステムコールを通して)。

あなたの行っている事例はありませんが、お使いのシステムコールハンドラで

+0

同期の問題を忘れてしまいます。問題は、syscallがカーネルに戻った後、もはやpが指す正しい値を取得していないことです。 pはユーザ空間仮想アドレスであり、プロセッサコンテキストを使用して物理アドレスに変換できます。カーネルスレッドは、異なるプロセッサコンテキストで実行されます。だから、* pを使うだけで、値にアクセスすることはできません。私の質問は、私はどのように私は、ポインタpと一緒にプロセスの現在のポインタtask_structを保存することができます提供された値にアクセスすることです。 – max

0

、あなたはシステムコールを作るプロセスのメモリマッピングを離れて隠しておくために

struct mm_struct *mm = get_task_mm(current); 

ような何かを行うことができます。その後カーネルスレッドで、あなたは元のタスクのメモリにcopy_from_user()と同等のものを行うために

access_remote_vm(mm, p, my_kernel_buf, length, 0); 

ような何かを行うことができます。

+0

それはまさに私の質問です。 access_remote_vmのやり方。カーネル2.6には特別な実装がありますか? – max

+0

あなたは何を意味するのかわかりません:はい、あなたが呼び出すことができるカーネル2.6の 'access_remote_vm()'関数があります。 – Roland

+0

申し訳ありませんが、私はLXRの関数access_remote_vmを2.6.38で検索しましたが見つかりませんでした。しかし、私は2.6.39のLXRでaccess_remote_vm関数を見つけました。これを試みます。 – max

関連する問題