Câu hỏi cơ bản của tôi là tại sao VSIZE cho quá trình 64 bit lớn hơn nhiều so với chương trình tương tự được biên dịch cho 32 bit?Tại sao VSIZE lại lớn hơn rất nhiều đối với quá trình 64 bit Linux?
Sau đây là đầu ra của tệp/proc/<pid>/bản đồ cho quy trình 32 bit.
00148000-00149000 r-xp 00000000 00:00 0 [vdso]
00149000-002d2000 r-xp 00000000 fd:02 8914142 /lib/libc-2.12.so
002d2000-002d3000 ---p 00189000 fd:02 8914142 /lib/libc-2.12.so
002d3000-002d5000 r--p 00189000 fd:02 8914142 /lib/libc-2.12.so
002d5000-002d6000 rw-p 0018b000 fd:02 8914142 /lib/libc-2.12.so
002d6000-002d9000 rw-p 00000000 00:00 0
005c9000-005da000 r-xp 00000000 fd:02 17059392 /tmp/vsizetest/lib/libtesting.so
005da000-005db000 rw-p 00010000 fd:02 17059392 /tmp/vsizetest/lib/libtesting.so
005db000-0061b000 rw-p 00000000 00:00 0
00661000-00689000 r-xp 00000000 fd:02 8917713 /lib/libm-2.12.so
00689000-0068a000 r--p 00027000 fd:02 8917713 /lib/libm-2.12.so
0068a000-0068b000 rw-p 00028000 fd:02 8917713 /lib/libm-2.12.so
00694000-006ab000 r-xp 00000000 fd:02 8917680 /lib/libpthread-2.12.so
006ab000-006ac000 r--p 00016000 fd:02 8917680 /lib/libpthread-2.12.so
006ac000-006ad000 rw-p 00017000 fd:02 8917680 /lib/libpthread-2.12.so
006ad000-006af000 rw-p 00000000 00:00 0
006e5000-00703000 r-xp 00000000 fd:00 3150403 /lib/ld-2.12.so
00703000-00704000 r--p 0001d000 fd:00 3150403 /lib/ld-2.12.so
00704000-00705000 rw-p 0001e000 fd:00 3150403 /lib/ld-2.12.so
00983000-009a0000 r-xp 00000000 fd:02 8914997 /lib/libgcc_s-4.4.5-20110214.so.1
009a0000-009a1000 rw-p 0001d000 fd:02 8914997 /lib/libgcc_s-4.4.5-20110214.so.1
00ca5000-00d86000 r-xp 00000000 fd:02 6300601 /usr/lib/libstdc++.so.6.0.13
00d86000-00d8a000 r--p 000e0000 fd:02 6300601 /usr/lib/libstdc++.so.6.0.13
00d8a000-00d8c000 rw-p 000e4000 fd:02 6300601 /usr/lib/libstdc++.so.6.0.13
00d8c000-00d92000 rw-p 00000000 00:00 0
08048000-08049000 r-xp 00000000 fd:02 21134666 /tmp/vsizetest/bin/testvsz
08049000-0804a000 rw-p 00000000 fd:02 21134666 /tmp/vsizetest/bin/testvsz
09b8d000-09bae000 rw-p 00000000 00:00 0 [heap]
f7796000-f779c000 rw-p 00000000 00:00 0
ff998000-ff9ae000 rw-p 00000000 00:00 0 [stack]
Những kết quả trong một tổng VSIZE của 3656.
Sau đây là sản phẩm của/proc/pid < tập tin >/bản đồ cho quá trình 64 bit.
00400000-00401000 r-xp 00000000 fd:02 21134667 /tmp/vsizetest/bin64/testvsz
00600000-00601000 rw-p 00000000 fd:02 21134667 /tmp/vsizetest/bin64/testvsz
02301000-02322000 rw-p 00000000 00:00 0 [heap]
3b7c800000-3b7c820000 r-xp 00000000 fd:00 661349 /lib64/ld-2.12.so
3b7ca1f000-3b7ca20000 r--p 0001f000 fd:00 661349 /lib64/ld-2.12.so
3b7ca20000-3b7ca21000 rw-p 00020000 fd:00 661349 /lib64/ld-2.12.so
3b7ca21000-3b7ca22000 rw-p 00000000 00:00 0
3b7cc00000-3b7cd86000 r-xp 00000000 fd:00 661350 /lib64/libc-2.12.so
3b7cd86000-3b7cf86000 ---p 00186000 fd:00 661350 /lib64/libc-2.12.so
3b7cf86000-3b7cf8a000 r--p 00186000 fd:00 661350 /lib64/libc-2.12.so
3b7cf8a000-3b7cf8b000 rw-p 0018a000 fd:00 661350 /lib64/libc-2.12.so
3b7cf8b000-3b7cf90000 rw-p 00000000 00:00 0
3b7d000000-3b7d083000 r-xp 00000000 fd:00 661365 /lib64/libm-2.12.so
3b7d083000-3b7d282000 ---p 00083000 fd:00 661365 /lib64/libm-2.12.so
3b7d282000-3b7d283000 r--p 00082000 fd:00 661365 /lib64/libm-2.12.so
3b7d283000-3b7d284000 rw-p 00083000 fd:00 661365 /lib64/libm-2.12.so
3b7d800000-3b7d817000 r-xp 00000000 fd:00 661352 /lib64/libpthread-2.12.so
3b7d817000-3b7da16000 ---p 00017000 fd:00 661352 /lib64/libpthread-2.12.so
3b7da16000-3b7da17000 r--p 00016000 fd:00 661352 /lib64/libpthread-2.12.so
3b7da17000-3b7da18000 rw-p 00017000 fd:00 661352 /lib64/libpthread-2.12.so
3b7da18000-3b7da1c000 rw-p 00000000 00:00 0
3b7e000000-3b7e007000 r-xp 00000000 fd:00 661361 /lib64/librt-2.12.so
3b7e007000-3b7e206000 ---p 00007000 fd:00 661361 /lib64/librt-2.12.so
3b7e206000-3b7e207000 r--p 00006000 fd:00 661361 /lib64/librt-2.12.so
3b7e207000-3b7e208000 rw-p 00007000 fd:00 661361 /lib64/librt-2.12.so
3b87000000-3b87016000 r-xp 00000000 fd:00 664219 /lib64/libgcc_s-4.4.6-20110824.so.1
3b87016000-3b87215000 ---p 00016000 fd:00 664219 /lib64/libgcc_s-4.4.6-20110824.so.1
3b87215000-3b87216000 rw-p 00015000 fd:00 664219 /lib64/libgcc_s-4.4.6-20110824.so.1
3d44c00000-3d44ce8000 r-xp 00000000 fd:00 3019214 /usr/lib64/libstdc++.so.6.0.13
3d44ce8000-3d44ee8000 ---p 000e8000 fd:00 3019214 /usr/lib64/libstdc++.so.6.0.13
3d44ee8000-3d44eef000 r--p 000e8000 fd:00 3019214 /usr/lib64/libstdc++.so.6.0.13
3d44eef000-3d44ef1000 rw-p 000ef000 fd:00 3019214 /usr/lib64/libstdc++.so.6.0.13
3d44ef1000-3d44f06000 rw-p 00000000 00:00 0
7f30ab397000-7f30ab39c000 rw-p 00000000 00:00 0
7f30ab39c000-7f30ab3ad000 r-xp 00000000 fd:02 21127804 /tmp/vsizetest/lib64/libtesting.so
7f30ab3ad000-7f30ab5ac000 ---p 00011000 fd:02 21127804 /tmp/vsizetest/lib64/libtesting.so
7f30ab5ac000-7f30ab5ad000 rw-p 00010000 fd:02 21127804 /tmp/vsizetest/lib64/libtesting.so
7f30ab5ad000-7f30ab5ee000 rw-p 00000000 00:00 0
7f30ab606000-7f30ab609000 rw-p 00000000 00:00 0
7fff69512000-7fff69528000 rw-p 00000000 00:00 0 [stack]
7fff695ff000-7fff69600000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Những kết quả trong một VSIZE của 18480.
Sự khác biệt chính giữa 2 bản đồ là các mục sau đây từ các dữ liệu 64 bit:
3b7cd86000-3b7cf86000 ---p 00186000 fd:00 661350 /lib64/libc-2.12.so
3b7d083000-3b7d282000 ---p 00083000 fd:00 661365 /lib64/libm-2.12.so
3b7d817000-3b7da16000 ---p 00017000 fd:00 661352 /lib64/libpthread-2.12.so
3b7e007000-3b7e206000 ---p 00007000 fd:00 661361 /lib64/librt-2.12.so
3b87016000-3b87215000 ---p 00016000 fd:00 664219 /lib64/libgcc_s-4.4.6-20110824.so.1
3d44ce8000-3d44ee8000 ---p 000e8000 fd:00 3019214 /usr/lib64/libstdc++.so.6.0.13
7f30ab3ad000-7f30ab5ac000 ---p 00011000 fd:02 21127804 /tmp/vsizetest/lib64/libtesting.so
nào chiếm 14.316 của 18.480 VSIZE.
Thử nghiệm khác với các chương trình khác dường như cho thấy rằng trong 64 bit, bạn dường như nhận được một bộ nhớ riêng tư, không thể đọc, không thể ghi, không thực thi được cho mỗi thư viện được sử dụng bởi quy trình, trong khi ở 32 bit, hầu như không có bất kỳ khối nào trong số này.
Có ai biết bộ nhớ này là gì không?
Lưu ý: Dựa trên một số câu trả lời cho một câu hỏi tương tự, What these memory regions for, from a Linux process?, đây không phải là quy trình đa luồng và đã được biên dịch -fPIC.
câu trả lời hay, bộ nhớ nhọn được tải theo trang. Chỉ cần thêm rằng pmap được thực hiện bằng cách đọc "/ proc//maps" ... :-) –
tristan
Chỉ cần sửa đổi câu để làm rõ cách thức hoạt động của pmap. Điểm tốt nhất về pmap là nó phân tích cú pháp tệp bản đồ và tính toán kích thước của các vùng cho bạn. – alcachi