Найти соответствие между виртуальными страницами и физическими страницами в Solaris - PullRequest
2 голосов
/ 24 июля 2011

Я хочу получить доступ к отображению виртуальных страниц на физический процесс. ОС Solaris, точную версию можно спросить у https://stackoverflow.com/users/760807/metallicpriest

Я хочу получить список вроде:

virt_addrs            phys_addrs
0x000000-0x001000     0x537000-0x538000
0x001000-0x002000     0x832000-0x833000
...

Процессор x86 или x86_64. Размер страницы 4K; своп выключен. Меня не интересуют страницы, которые поддерживаются FS (исполняемый образ) и не используются процессом.

Ответы [ 2 ]

2 голосов
/ 25 июля 2011

Для этого можно использовать pmap и отладчик ядра (mdb -k).

Pmap сначала отобразит, какие (виртуальные) области памяти используются процессом, затем в разделе mdb вы получите структуру процесса (pid2proc) и отобразите его поле p_as (адресное пространство процесса). Когда это значение передается в качестве параметра, команда vtop может отображать процесс сопоставления виртуального адреса с физическим.

например:

$ pmap -s 609
609:    /usr/lib/utmpd
 Address    Bytes Pgsz Mode   Mapped File
08046000       8K   4K rw---    [ stack ]
08050000      12K   4K r-x--  /usr/lib/utmpd
08063000       4K   4K rw---  /usr/lib/utmpd
...

# mdb -k
Loading modules: [ unix genunix specfs dtrace mac cpu.generic cpu_ms.AuthenticAMD.15 uppc pcplusmp scsi_vhci zfs ip hook neti arp usba sd sockfs stmf stmf_sbd s1394 fctl lofs random nfs sppp crypto cpc fcip ptm ufs logindmux ipc ]
> 0t609::pid2proc | ::print proc_t p_as
p_as = 0xffffff018cf38b00
> 08046000::vtop -a 0xffffff018cf38b00
virtual 8046000 mapped to physical a5c16000
> 8047000::vtop -a 0xffffff018cf38b00
virtual 8047000 mapped to physical a1267000
...
1 голос
/ 14 февраля 2016

Немного поздно, но это совсем не сложно сделать на Solaris.Просто используйте libkvm.

Это для Solaris 11:

/* needed to get latest /proc structures */
#define _STRUCTURED_PROC 1

#include <stddef.h>
#include <stdlib.h>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include <limits.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <kvm.h>
#include <sys/proc.h>
#include <sys/procfs.h>

void printVirtToPhysMappings( kvm_t *kvm, const char *pidStr );

int main( int argc, char **argv )
{
    kvm_t *kvm = kvm_open( NULL, NULL, NULL, O_RDONLY, argv[ 0 ] );

    for ( int ii = 1; ii < argc; ii++ )
    {
        printVirtToPhysMappings( kvm, argv[ ii ] );
    }

    kvm_close( kvm );
    return( 0 );
}


void printVirtToPhysMappings( kvm_t *kvm, const char *pidStr )
{
    char mapFile[ PATH_MAX ];
    struct stat sb;

    sprintf( mapFile, "/proc/%s/xmap", pidStr );
    pid_t pid = strtol( pidStr, NULL, 0 );
    struct proc *procPtr = kvm_getproc( kvm, pid );

    int mapFD = open( mapFile, O_RDONLY );
    fstat( mapFD, &sb );

    size_t numMaps = sb.st_size / sizeof( prxmap_t );
    prxmap_t mapEntries[ numMaps ];

    pread( mapFD, mapEntries, sb.st_size, 0UL );

    for ( size_t ii = 0; ii < numMaps; ii++ )
    {
        /* use the actual page size - page sizes can vary */
        size_t pageSize = mapEntries[ ii ].pr_hatpagesize;

        /* if page size is 0, page isn't mapped - set default
           page size so we emit the output anyway */
        if ( 0 == pageSize ) pageSize = 4096;

        size_t numPages = mapEntries[ ii ].pr_size / pageSize;
        for ( size_t jj = 0; jj < numPages; jj++ )
        {
            uintptr_t virtAddr = mapEntries[ ii ].pr_vaddr + jj * pageSize;

            /* kvm_physaddr() is an undocumented feature of libkvm */
            void *physAddr = ( void * ) kvm_physaddr( kvm, procPtr->p_as, virtAddr );
            printf( "virtAddr: %p, page size: %ld, physAddr: %p\n", virtAddr, pageSize, physAddr );
        }
    }

    close( mapFD );

}

Вам нужно быть пользователем root для запуска, и нет проверки ошибок -совсем.Дайте ему неверный PID, и он, вероятно, будет SEGV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...