2016-12-09 10 views
0

擬似ドライバを使用しているカーネル空間では、仮想メモリノードのスタックノードとヒープノードを区別する方法のプロセスのマップファイルを実装しようとしています。カーネル空間でvm_area_structのスタックノードとヒープノードを区別するにはどうすればよいですか?

long myIoctl(struct file* fp1, unsigned int pid, unsigned long b) 
{ 
    struct module* mod = NULL; 
    struct task_struct *my_task = NULL; 
    struct vm_area_struct * vm_area = NULL; 
    my_task = current; 
    vm_area = my_task -> mm -> mmap; 
    mod = THIS_MODULE; 


    while (vm_area) { 
     printk ("%p-%p ", (int *)(vm_area -> vm_start), (int *) (vm_area -> vm_end)); 
     printk ("%d ", vm_area -> vm_flags); 
     if ((vm_area -> vm_flags) & VM_READ) { 
      printk("r"); 
     } 
     if ((vm_area -> vm_flags) & VM_WRITE) { 
      printk("w"); 
     } else { 
      printk ("_"); 
     } 
     if ((vm_area -> vm_flags) & VM_EXEC) { 
      printk("x"); 
     } else { 
      printk ("_"); 
     } 
     if ((vm_area -> vm_flags) & VM_SHARED) { 
      printk("s"); 
     } else { 
      printk ("p"); 
     } 

     printk (" %.8lx ", (vm_area -> vm_pgoff) << 12); 
     if (vm_area -> vm_file) { 
      printk ("%ld ", vm_area -> vm_file -> f_inode -> i_ino); 
      printk ("%u\n", MAJOR(vm_area -> vm_file -> f_inode -> i_rdev)); 
      printk (":%u\n", MINOR(vm_area -> vm_file -> f_inode -> i_rdev)); 
     } else { 
      printk ("0\n"); 
     } 
     vm_area = vm_area -> vm_next; 

    } 

    return 0; 
} 

in the image see stack and heap sections

答えて

1

OSはすでに、スタック、ヒープ、そしてもちろんのMMAP-EDものも含めて、そのプロセスのすべてのVMAsを示しているの/ proc/< PID> /マップ実装します。

あなたは、これらすべての情報が記入した場所から確認したい場合は、カーネルのソースコード、関連するコードを確認することができますが(与えられたPIDのVMAsをルックアップするために)ここにあるように思わ:fs/proc/task_mmu.c

そして、はい確かに、 "[ヒープ]" 上記のsrcファイルからこのコードスニペットでマークされている(3.10.24版カーネル):

FSは/ proc/task_mmu.c:show_map_vma()

... 
if (vma->vm_start <= mm->brk && vma->vm_end >= mm->start_brk) 
{ 
    name = "[heap]"; goto done; } 
... 

そしてもう一つは、あなたがmm_structについてで定義されている確認してください、特定のセグメントの開始・終了アドレスを確認したい場合。あなたは、次のものを取得します: -

struct mm_struct{ 
...... 
    unsigned long start_code, end_code, start_data, end_data; 
    unsigned long start_brk, brk, start_stack; 
...... 
} 
  1. 。START_CODE、コードセクションの開始と終了アドレスをEND_CODEを。
  2. start_data、end_dataデータセクションの開始アドレスと終了アドレス。
  3. start_brk、brkヒープの開始アドレスと終了アドレス。
  4. start_stack予想通りに、スタック領域の開始。
関連する問題