task構造体メンバー参照で悩んでいます
Rev.1を表示中。最新版はこちら。
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; }