GNU/Linux >> Znalost Linux >  >> Linux

Pohybující se tabulky stránek procesu v Linuxu

pte_unmap(ptep); 

chybí těsně před štítkem ven. Zkuste změnit kód tímto způsobem:

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

    pte_unmap(ptep); 

out:

Podívejte se na /proc/<pid>/smaps souborový systém, můžete vidět paměť uživatelského prostoru:

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

a způsob tisku je přes fs/proc/task_mmu.c (ze zdrojového kódu jádra):

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"

A vaše funkce je trochu podobná funkci walk_page_range(). Když se podíváte na walk_page_range(), můžete vidět, že struktura smaps_walk by se neměla během chůze měnit:

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

Pokud by se obsah paměti změnil, všechny výše uvedené kontroly mohou být nekonzistentní.

To vše znamená, že musíte zamknout mmap_sem při procházení tabulky stránek:

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

a poté následuje odemknutí:

up_read(&mm->mmap_sem);

A samozřejmě, když zadáte printk() stránkovací tabulky uvnitř vašeho modulu jádra, modul jádra běží v kontextu procesu vašeho procesu insmod (stačí printk „comm“ a uvidíte „insmod“), což znamená, že mmap_sem je lock, také to znamená, že proces NENÍ spuštěn, a proto neexistuje žádný výstup z konzoly, dokud není proces dokončen (veškerý výstup printk() jde pouze do paměti).

Zní to logicky?


Linux
  1. Úvod do Linuxových vláken – část I

  2. Proces spouštění Linuxu

  3. Možnosti příkazu nohup v Linuxu

  1. Příklady příkazů renice v Linuxu

  2. Vytvoření démona v Linuxu

  3. Linux:proces do služby

  1. Jak zabít proces zombie na Linuxu

  2. Jak nainstalovat vtop na Linux

  3. Linux – Blokovat síťový přístup procesu?