GNU/Linux >> Linux Esercitazione >  >> Linux

Tabelle delle pagine di un processo in Linux

pte_unmap(ptep); 

manca poco prima dell'uscita dell'etichetta. Prova a modificare il codice in questo modo:

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

    pte_unmap(ptep); 

out:

Guarda /proc/<pid>/smaps filesystem, puoi vedere la memoria dello spazio utente:

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

e come viene stampato è tramite fs/proc/task_mmu.c (dai sorgenti del kernel):

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"

E la tua funzione è un po' come quella di walk_page_range(). Esaminando walk_page_range() puoi vedere che la struttura smaps_walk non dovrebbe cambiare mentre sta camminando:

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

Se i contenuti della memoria dovessero cambiare, tutti i controlli precedenti potrebbero diventare incoerenti.

Tutto ciò significa solo che devi bloccare mmap_sem quando cammini nella tabella delle pagine:

   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);
    }

e poi seguito dallo sblocco:

up_read(&mm->mmap_sem);

E, naturalmente, quando si emette printk() della pagetable all'interno del modulo del kernel, il modulo del kernel è in esecuzione nel contesto del processo del processo insmod (basta stampare "comm" e si può vedere "insmod"), il che significa che mmap_sem è lock, significa anche che il processo NON è in esecuzione, e quindi non c'è output della console finché il processo non è completato (tutto l'output di printk() va solo in memoria).

Sembra logico?


Linux
  1. Linux:bloccare l'accesso alla rete di un processo?

  2. Linux:un processo "subreaper"?

  3. Introduzione ai thread di Linux – Parte I

  4. kill Esempi di comandi in Linux

  5. Processo di creazione di Linux?

Come uccidere un processo in Linux

Comando Ps in Linux (Elenca processi)

Comando Pstree in Linux

Kill Command in Linux

Monitoraggio dei processi su Linux

Come KILL un processo su Linux