Abrufen der Speicherkarte von einem eigenen Prozess in OS X 10.5 / 10.6
-
06-07-2019 - |
Frage
Unter Linux ist der einfachste Weg zu einem Prozess suchen Speicherkarte bei /proc/PID/maps
suchen, so etwas wie dieser geben:
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm 08056000-08058000 rw-p 0000d000 03:0c 64593 /usr/sbin/gpm 08058000-0805b000 rwxp 00000000 00:00 0 40000000-40013000 r-xp 00000000 03:0c 4165 /lib/ld-2.2.4.so 40013000-40015000 rw-p 00012000 03:0c 4165 /lib/ld-2.2.4.so 4001f000-40135000 r-xp 00000000 03:0c 45494 /lib/libc-2.2.4.so 40135000-4013e000 rw-p 00115000 03:0c 45494 /lib/libc-2.2.4.so 4013e000-40142000 rw-p 00000000 00:00 0 bffff000-c0000000 rwxp 00000000 00:00 0
Wie kann ein Prozess erhält die entsprechenden Informationen (Adressbereiche, Schutz, kartiert Dateinamen, etc ...) über einen Prozess eigene Speicherkarte unter OSX 10.5 oder 10.6?
Lösung
Es gibt eine MacFUSE Implementierung von procfs . Mit ihm können Sie die Speicherkarte erhalten Sie wie folgt vor:
cat /proc/PID/task/vmmap
Mit Blick auf die Quellcode , sieht es aus wie es das ist mit < a href = "http://www.gnu.org/software/hurd/gnumach-doc/Virtual-Memory-Interface.html#Virtual-Memory-Interface" rel = "noreferrer"> Mach virtuellen Speicher-Interface die Speicherkarte aus dem Kernel zu erhalten.
Hier ist die Implementierung für die vmmap
Pseudo:
/*
* procfs as a MacFUSE file system for Mac OS X
*
* Copyright Amit Singh. All Rights Reserved.
* http://osxbook.com
*
* http://code.google.com/p/macfuse/
*
* Source License: GNU GENERAL PUBLIC LICENSE (GPL)
*/
READ_HANDLER(proc__task__vmmap)
{
int len = -1;
kern_return_t kr;
#define MAX_VMMAP_SIZE 65536 /* XXX */
char tmpbuf[MAX_VMMAP_SIZE];
task_t the_task;
pid_t pid = strtol(argv[0], NULL, 10);
kr = task_for_pid(mach_task_self(), pid, &the_task);
if (kr != KERN_SUCCESS) {
return -EIO;
}
vm_size_t vmsize;
vm_address_t address;
vm_region_basic_info_data_t info;
mach_msg_type_number_t info_count;
vm_region_flavor_t flavor;
memory_object_name_t object;
kr = KERN_SUCCESS;
address = 0;
len = 0;
do {
flavor = VM_REGION_BASIC_INFO;
info_count = VM_REGION_BASIC_INFO_COUNT;
kr = vm_region(the_task, &address, &vmsize, flavor,
(vm_region_info_t)&info, &info_count, &object);
if (kr == KERN_SUCCESS) {
if (len >= MAX_VMMAP_SIZE) {
goto gotdata;
}
len += snprintf(tmpbuf + len, MAX_VMMAP_SIZE - len,
"%08x-%08x %8uK %c%c%c/%c%c%c %11s %6s %10s uwir=%hu sub=%u\n",
address, (address + vmsize), (vmsize >> 10),
(info.protection & VM_PROT_READ) ? 'r' : '-',
(info.protection & VM_PROT_WRITE) ? 'w' : '-',
(info.protection & VM_PROT_EXECUTE) ? 'x' : '-',
(info.max_protection & VM_PROT_READ) ? 'r' : '-',
(info.max_protection & VM_PROT_WRITE) ? 'w' : '-',
(info.max_protection & VM_PROT_EXECUTE) ? 'x' : '-',
inheritance_strings[info.inheritance],
(info.shared) ? "shared" : "-",
behavior_strings[info.behavior],
info.user_wired_count,
info.reserved);
address += vmsize;
} else if (kr != KERN_INVALID_ADDRESS) {
if (the_task != MACH_PORT_NULL) {
mach_port_deallocate(mach_task_self(), the_task);
}
return -EIO;
}
} while (kr != KERN_INVALID_ADDRESS);
gotdata:
if (the_task != MACH_PORT_NULL) {
mach_port_deallocate(mach_task_self(), the_task);
}
READ_PROC_TASK_EPILOGUE();
}
Andere Tipps
Hier finden Sie aktuelle diesen Thread aus 2007 auf der Mailingliste Darwin-Kernel. Auf den Punkt gebracht, sind Ihre Entscheidungen popen vmmap
oder verwenden Sie die Mach VM Region APIs in setgid
(die /usr/include/mach/mach_vm.h
angemessen ist). Ich fand ein anständiges Beispiel für die Verwendung des Mach-API in den Sage Mathematik-Systems Quellen .
Noch ein paar Links für die Suche nach VMMap Quelle (es ist nicht veröffentlicht ):
- http://www.newosxbook.com /src.jl?tree=listings&file=12-1-vmmap.c
- https://code.google.com /p/psutil/source/browse/psutil/_psutil_osx.c#274 (get_process_memory_maps) und https://code.google.com/p/psutil/issues/detail?id=260
Getting die die zugeordneten Dateinamen und die Namen der Bibliotheken von dyld_shared_cache: https://stackoverflow.com/a/17180619/1026
GNUlib ( http://www.gnu.org/software/gnulib/ ) Es ist in VMA-iter.c über alle virtuellen Speichersegmente in den meisten Betriebssystemen einschließlich MAC OS X enthält eine Funktion zur Iteration