GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Laufende Seitentabellen eines Prozesses in Linux

pte_unmap(ptep); 

fehlt kurz vor dem Label out. Versuchen Sie, den Code folgendermaßen zu ändern:

    ...
    page = pte_page(pte);
    if (page)
        printk(KERN_INFO "page frame struct is @ %p", page);

    pte_unmap(ptep); 

out:

Sehen Sie sich /proc/<pid>/smaps an Dateisystem können Sie den Userspace-Speicher sehen:

cat smaps 
bfa60000-bfa81000 rw-p 00000000 00:00 0          [stack]
Size:                136 kB
Rss:                  44 kB

und wie es gedruckt wird, ist über fs/proc/task_mmu.c (aus der Kernelquelle):

http://lxr.linux.no/linux+v3.0.4/fs/proc/task_mmu.c

   if (vma->vm_mm && !is_vm_hugetlb_page(vma))
               walk_page_range(vma->vm_start, vma->vm_end, &smaps_walk);
               show_map_vma(m, vma.....);
        seq_printf(m,
                   "Size:           %8lu kB\n"
                   "Rss:            %8lu kB\n"
                   "Pss:            %8lu kB\n"

Und Ihre Funktion ähnelt in etwa der von walk_page_range(). Wenn Sie sich walk_page_range() ansehen, können Sie sehen, dass sich die smaps_walk-Struktur nicht ändern soll, während sie läuft:

http://lxr.linux.no/linux+v3.0.4/mm/pagewalk.c#L153

For eg:

                }
 201                if (walk->pgd_entry)
 202                        err = walk->pgd_entry(pgd, addr, next, walk);
 203                if (!err &&
 204                    (walk->pud_entry || walk->pmd_entry || walk->pte_entry

Wenn sich der Speicherinhalt ändert, können alle oben genannten Prüfungen inkonsistent werden.

All dies bedeutet nur, dass Sie mmap_sem sperren müssen, wenn Sie die Seitentabelle durchlaufen:

   if (!down_read_trylock(&mm->mmap_sem)) {
            /*
             * Activate page so shrink_inactive_list is unlikely to unmap
             * its ptes while lock is dropped, so swapoff can make progress.
             */
            activate_page(page);
            unlock_page(page);
            down_read(&mm->mmap_sem);
            lock_page(page);
    }

und dann gefolgt von entsperren:

up_read(&mm->mmap_sem);

Und natürlich, wenn Sie printk() der Pagetable in Ihrem Kernelmodul ausgeben, läuft das Kernelmodul im Prozesskontext Ihres insmod-Prozesses (drucken Sie einfach das "comm" und Sie können "insmod" sehen), was bedeutet, dass mmap_sem ist lock, bedeutet dies auch, dass der Prozess NICHT läuft und daher keine Konsolenausgabe erfolgt, bis der Prozess abgeschlossen ist (alle printk()-Ausgaben gehen nur in den Speicher).

Klingt logisch?


Linux
  1. So installieren Sie vtop unter Linux

  2. Linux-Startvorgang

  3. nohup-Befehlsoptionen in Linux

  4. Linux-CreateProcess?

  5. Erstellen eines Daemons unter Linux

So beenden Sie einen Prozess in Linux

Ps-Befehl in Linux (Prozesse auflisten)

Pstree-Befehl unter Linux

Kill-Befehl unter Linux

Prozessüberwachung unter Linux

Wie man einen Prozess unter Linux beendet