これが私がしたことです:
- ユーザー空間プロセスは
malloc()
、ヒープにメモリを割り当て、特定の文字パターンで埋めてから、malloc()
. プロセス ID とメモリ チャンクのアドレスは、次のようなカーネル モジュールに渡されます。
int init_module(void) { int res = 0; struct page *data_page; struct task_struct *task = NULL; struct vm_area_struct *next_vma; struct mm_struct *mm; task = pid_task(find_vpid(pid), PIDTYPE_PID); if (pid != -1) target_process_id = pid; if (!task) { printk("Could not find the task struct for process id %d\n", pid); return 0; } else { printk("Found the task <%s>\n", task->comm); } mm = task->mm; if (!mm) { printk("Could not find the mmap struct for process id %d\n", pid); return 0; } next_vma = find_vma(mm, addr); down_read(&task->mm->mmap_sem); res = get_user_pages(task, task->mm, addr, 1, 1, 1, &data_page, NULL); if (res != 1) { printk(KERN_INFO "get_user_pages error\n"); up_read(&task->mm->mmap_sem); return 0; } else { printk("Found vma struct and it starts at: %lu\n", next_vma->vm_start); } flush_cache_range(next_vma,next_vma->vm_start,next_vma->vm_end); flush_tlb_range(next_vma,next_vma->vm_start,next_vma->vm_end); up_read(&task->mm->mmap_sem); return 0;
}
(上記の変数定義の後のコードの 3 行目)によって引き起こされるページ フォールトを追跡するために、Linux カーネル
printk()
の関数にステートメントを追加しました。このようなもの:handle_mm_fault()
target_process_id
if (unlikely(current->pid == target_process_id)) printk("Target process <%d> generated a page fault at address %lu\n", current->pid, address);
さて、私が気付いたのは、最後のprintk()
ステートメントが何もキャッチしていないことです。
関数init_module
は、カーネル モジュールの初期化関数です。insmodを使用して実行中のカーネルに挿入されます...コマンドを使用してinsmod module.ko pid=<processId> addr=<address>
何がうまくいかないのでしょうか?