2009-10-27 25 views
9

Trong Linux, cách dễ nhất để nhìn vào một quá trình bản đồ bộ nhớ đang xem xét /proc/PID/maps, cho một cái gì đó như thế này:Lấy bản đồ bộ nhớ của tiến trình riêng của mình trong OS X 10.5/10,6

 
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 

thế nào có thể một quá trình có được thông tin tương đương (các dải địa chỉ, bảo vệ, tên tệp ánh xạ, v.v ...) về bản đồ bộ nhớ riêng của quá trình theo OSX 10.5 hoặc 10.6?

Trả lời

12

Có một MacFUSE implementation of procfs. Với nó, bạn có thể nhận được bản đồ bộ nhớ như sau:

cat /proc/PID/task/vmmap 

Nhìn vào source code, có vẻ như nó sử dụng Mach virtual memory interface để có được bản đồ bộ nhớ từ hạt nhân.

Đây là việc thực hiện cho vmmap pseudofile:

/* 
* 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(); 
} 
+0

Điều này có vẻ thực sự tuyệt vời, có thể tôi sẽ chấp nhận nó khi tôi chạy một số thử nghiệm về điều đó. – Sufian

2

Hãy xem this thread từ năm 2007 trên mailing list Darwin-kernel. Tóm lại, lựa chọn của bạn là popen vmmap (là setgid một cách thích hợp) hoặc sử dụng API vùng VM VM trong /usr/include/mach/mach_vm.h. Tôi đã tìm thấy một ví dụ tốt về việc sử dụng API Mach trong số Sage Mathematics System sources.

+0

Cảm ơn các chủ đề, tôi đoán làm điều này portably trên tất cả các phiên bản OSX là không dễ dàng. – Sufian

+0

liên kết hiền đã cập nhật: http://trac.sagemath.org/sage_trac/browser/sage/misc/darwin_memory_usage.c – Nickolay

+0

liên kết được cập nhật: http://wstein.org/home/tornaria/sage-4.1.alpha2.sagemath_only- x86_64-Linux/devel/sage-main/sage/misc/darwin_memory_usage.c –

2

GNUlib (http://www.gnu.org/software/gnulib/) chứa một hàm cho iterating trên tất cả các phân đoạn bộ nhớ ảo trong hầu hết các hệ điều hành bao gồm MAC OS X. Đó là trong vma-iter.c hơn

Các vấn đề liên quan