0

これが私がしたことです:

  1. ユーザー空間プロセスはmalloc()、ヒープにメモリを割り当て、特定の文字パターンで埋めてから、malloc().
  2. プロセス 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. (上記の変数定義の後のコードの 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>

何がうまくいかないのでしょうか?

4

0 に答える 0