GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara mendekode entri /proc/pid/pagemap di Linux?

Dokumentasi kernel Linux

Dokumen kernel Linux yang menjelaskan formatnya:https://github.com/torvalds/linux/blob/v4.9/Documentation/vm/pagemap.txt

* Bits 0-54  page frame number (PFN) if present
* Bits 0-4   swap type if swapped
* Bits 5-54  swap offset if swapped
* Bit  55    pte is soft-dirty (see Documentation/vm/soft-dirty.txt)
* Bit  56    page exclusively mapped (since 4.2)
* Bits 57-60 zero
* Bit  61    page is file-page or shared-anon (since 3.5)
* Bit  62    page swapped
* Bit  63    page present

Fungsi parser C

GitHub upstream.

#define _XOPEN_SOURCE 700
#include <fcntl.h> /* open */
#include <stdint.h> /* uint64_t  */
#include <stdlib.h> /* size_t */
#include <unistd.h> /* pread, sysconf */

typedef struct {
    uint64_t pfn : 54;
    unsigned int soft_dirty : 1;
    unsigned int file_page : 1;
    unsigned int swapped : 1;
    unsigned int present : 1;
} PagemapEntry;

/* Parse the pagemap entry for the given virtual address.
 *
 * @param[out] entry      the parsed entry
 * @param[in]  pagemap_fd file descriptor to an open /proc/pid/pagemap file
 * @param[in]  vaddr      virtual address to get entry for
 * @return 0 for success, 1 for failure
 */
int pagemap_get_entry(PagemapEntry *entry, int pagemap_fd, uintptr_t vaddr)
{
    size_t nread;
    ssize_t ret;
    uint64_t data;

    nread = 0;
    while (nread < sizeof(data)) {
        ret = pread(pagemap_fd, ((uint8_t*)&data) + nread, sizeof(data) - nread,
                (vaddr / sysconf(_SC_PAGE_SIZE)) * sizeof(data) + nread);
        nread += ret;
        if (ret <= 0) {
            return 1;
        }
    }
    entry->pfn = data & (((uint64_t)1 << 54) - 1);
    entry->soft_dirty = (data >> 54) & 1;
    entry->file_page = (data >> 61) & 1;
    entry->swapped = (data >> 62) & 1;
    entry->present = (data >> 63) & 1;
    return 0;
}

Contoh program yang dapat dijalankan yang menggunakannya:

  • mengonversi satu alamat virtual menjadi fisik:Apakah ada API untuk menentukan alamat fisik dari alamat virtual di Linux?
  • membuang informasi tentang semua halaman proses:/proc/[pid]/pagemaps dan /proc/[pid]/maps | linux

Saya harap tautan ini akan membantu. Ini adalah alat yang sangat sederhana, dan menentukan alamat yang perlu Anda akses sangat sederhana:http://fivelinesofcode.blogspot.com/2014/03/how-to-translate-virtual-to-physical.html


Linux
  1. Bagaimana Linux Menangani Beberapa Pemisah Jalur Berturut-turut (/home////username///file)?

  2. Linux – Bagaimana Symlink /proc//exe Berbeda Dari Symlink Biasa?

  3. Seberapa Portabel /dev/stdin, /dev/stdout Dan /dev/stderr?

  1. Linux – Ubah /proc/pid/environ Setelah Proses Dimulai?

  2. Linux – Seberapa Sering Sistem File Proc Diperbarui di Linux?

  3. Linux – Bagaimana Menguji Apakah Perangkat Blok Apakah Hanya-Baca Dari /sys Atau /proc?

  1. Linux – Bagaimana Cara Membaca Dari /proc/$pid/mem Di Linux?

  2. Linux – Menautkan /proc/mnt Ke /proc/mounts?

  3. Linux – Menggabungkan /usr/bin Dan /usr/sbin Ke /bin (gnu/linux)?