task構造体メンバー参照で悩んでいます


task構造体メンバー参照で悩んでいます。下記サンプルでメンバーcommに直接参照する事ができません。ソース上で上記メンバーを参照しているところでは、get_task_commをコールする事で実現しています。この関数はEXPORTされていません。で、シンボルテーブルからそのアドレスを見て、直接get_task_commをコールしてみました。そうすると確かに取得できます。
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>
#include <linux/nsproxy.h>
#include <linux/string.h>

MODULE_LICENSE("GPL");

unsigned char *p;
    char* (*my_get_task_comm)(char *buf, struct task_struct *tsk) = 0xc04df780;

static int task_comm_init(void)
{
   char    buff[sizeof(current->comm)];
   int	    i;

   my_get_task_comm(buff, current);
   printk("[%s][%s][%x]\n", buff, current->comm, current->comm);
   return -1;
}

module_init(task_comm_init);
[root@localhost kitamura]# dmesg 
   :
[ 7925.723892] 14:ac
[ 7925.723903] 15:cf
[25092.628396] [insmod][][cca8355c]
get_task_comm関数は、スピンロックを取得して引数のtask_structのcommを、buffに複写しているだけなのですが・・・。これで何故、直接commを参照できないのが、この数日ずっと悩んでいます。

以前の環境では参照できたや記憶しています。LKMで悪さをされないための変更かなと思うのですが・・・。察するに、このメンバー等は、DSセグメントでなく、他のセグメント(GSとか)からの参照ではと思うのですが(gccにデータ参照を、DSでなくGSとするようなオプションがあるかどうかも知りません。)、コードからみてどのような実装か皆目見当がつきません。もしご存知の方おられましたら、教えて頂ければ幸いです。
char *get_task_comm(char *buf, struct task_struct *tsk)
{
       /* buf must be at least sizeof(tsk->comm) in size */
       task_lock(tsk);
       strncpy(buf, tsk->comm, sizeof(tsk->comm));
       task_unlock(tsk);
       return buf;
}


最終更新 2012/02/07 01:36:57 - north
(2012/02/07 01:35:32 作成)


検索

アクセス数
3575112
最近のコメント
コアダンプファイル - sakaia
list_head構造体 - yocto_no_yomikata
勧告ロックと強制ロック - wataash
LKMからのファイル出力 - 重松 宏昌
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
Adsense
広告情報が設定されていません。