2008年12月27日

[Linux] Process ID (PID) から CR3 値を得る自作システムコール

カーネル空間内で,プロセスIDからそのプロセスのページディレクトリの物理アドレスを得るシステムコールを作った.

arch/x86/kernel/pid2cr3.c (システムコール本体)

#include <linux/pid2cr3.h>
#include <linux/sched.h>
#include <linux/pid.h>

asmlinkage unsigned long sys_pid2cr3(int pid) {
  struct task_struct *p;
  p = pid_task(find_vpid(pid), PIDTYPE_PID);
  if (p && (p->active_mm != NULL))
    return __pa((unsigned long) (p->active_mm->pgd));
  else
    return 1;
}

/usr/include/linux/pid2cr3.h

#ifndef NR_PID2CR3_H
#define NR_PID2CR3_H

#include <linux/unistd.h>
#include <sys/syscall.h>

#define pid2cr3(pid) syscall(__NR_pid2cr3, pid)

#endif

include/linux/pid2cr3.h

#ifndef NR_PID2CR3_H
#define NR_PID2CR3_H

#include <linux/unistd.h>
#include <linux/linkage.h>

#define pid2cr3(pid) syscall(__NR_pid2cr3, pid)

#endif

あとは適当に.

おまけ Pythonから上記システムコールを使うためのモジュール

#include <Python.h>
#include <linux/pid2cr3.h>

static PyObject * get_cr3(PyObject *self, PyObject *args) {
	int ok, pid;
	ok = PyArg_ParseTuple(args, "i", &pid);
	return PyLong_FromUnsignedLong(pid2cr3(pid));
}

// module method tbl init
static PyMethodDef SpamMethods[] = {
  { "pid2cr3", get_cr3, METH_VARARGS, "get CR3 value from PID" },
  {NULL, NULL, 0, NULL},
};

PyMODINIT_FUNC initpid2cr3(void) {
  PyObject *m;
  m = Py_InitModule("pid2cr3", SpamMethods);
}
posted by dev-man at 19:51| Comment(0) | TrackBack(0) | Linux | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック