Hiểu Linux / Proc / id / maps


155

Tôi đang cố gắng để sử dụng bộ nhớ ứng dụng Linux nhúng của tôi. Các /proc/pid/mapstiện ích / tập tin có vẻ là một nguồn lực tốt cho thấy các chi tiết. Thật không may, tôi không hiểu tất cả các cột và mục.

Các mục inode ẩn danh 0 có nghĩa là gì? Đây dường như là một số phân khúc bộ nhớ lớn hơn.


1
proc(5) mmap(2)"Hiểu hạt nhân Linux" 9.3. Vùng nhớ; 16.2. Ánh xạ bộ nhớ "Tìm hiểu trình quản lý bộ nhớ ảo Linux" 4.4 Vùng nhớ
wRAR

Câu trả lời:


261

Mỗi hàng trong /proc/$PID/mapsmô tả một vùng bộ nhớ ảo liền kề trong một tiến trình hoặc luồng. Mỗi hàng có các trường sau:

address           perms offset  dev   inode   pathname
08048000-08056000 r-xp 00000000 03:0c 64593   /usr/sbin/gpm
  • địa chỉ - Đây là địa chỉ bắt đầu và kết thúc của vùng trong không gian địa chỉ của quy trình
  • quyền - Điều này mô tả cách các trang trong khu vực có thể được truy cập. Có bốn quyền khác nhau: đọc, viết, thực thi và chia sẻ. Nếu đọc / ghi / thực thi bị vô hiệu hóa, a -sẽ xuất hiện thay vì r/ w/ x. Nếu một khu vực không được chia sẻ , nó là riêng tư , vì vậy một psẽ xuất hiện thay vì một s. Nếu quá trình cố gắng truy cập bộ nhớ theo cách không được phép, lỗi phân đoạn sẽ được tạo. Quyền có thể được thay đổi bằng cách sử dụng mprotectcuộc gọi hệ thống.
  • offset - Nếu vùng được ánh xạ từ một tệp (sử dụng mmap), thì đây là phần bù trong tệp bắt đầu ánh xạ. Nếu bộ nhớ không được ánh xạ từ một tệp, nó chỉ là 0.
  • thiết bị - Nếu vùng được ánh xạ từ một tệp, đây là số thiết bị chính và phụ (ở dạng hex) nơi tệp nằm.
  • inode - Nếu vùng được ánh xạ từ một tệp, đây là số tệp.
  • tên đường dẫn - Nếu vùng được ánh xạ từ một tệp, đây là tên của tệp. Trường này là trống cho các khu vực ánh xạ ẩn danh. Ngoài ra còn có các khu vực đặc biệt với những cái tên như thế [heap], [stack]hoặc [vdso]. [vdso]là viết tắt của đối tượng chia sẻ động ảo. Nó được sử dụng bởi các cuộc gọi hệ thống để chuyển sang chế độ kernel. Đây là một bài viết hay về nó: "linux-gate.so.1 là gì?"

Bạn có thể nhận thấy rất nhiều khu vực ẩn danh. Chúng thường được tạo bởi mmapnhưng không được đính kèm vào bất kỳ tập tin nào. Chúng được sử dụng cho rất nhiều thứ linh tinh như bộ nhớ dùng chung hoặc bộ đệm không được phân bổ trên heap. Ví dụ, tôi nghĩ rằng thư viện pthread sử dụng các vùng được ánh xạ ẩn danh làm ngăn xếp cho các luồng mới.


4
Có, các pthread đang phân bổ các khối 8Mb cho một ngăn xếp với phần nhỏ hơn để phát hiện tràn ngăn xếp (tôi nghĩ). Vì vậy, mỗi pthread được tạo, theo mặc định, phân bổ một vùng bộ nhớ 0 inode là 8Mb và một vùng 0 inode của 4Kb.
simon

Vì vậy, trong ví dụ của bạn gpmlà ánh xạ tệp nhị phân tại một số địa chỉ ảo ngay từ đầu, với tiêu đề ELF, v.v.? Không phải trình tải phải phân tích tiêu đề ELF và ánh xạ các phần riêng lẻ, không phải toàn bộ tệp?
Dmitry Grigoryev

9

ánh xạ bộ nhớ không chỉ được sử dụng để ánh xạ các tệp vào bộ nhớ mà còn là một công cụ để yêu cầu RAM từ kernel. Đây là những mục nhập inode 0 - phân đoạn stack, heap, bss của bạn và hơn thế nữa


5

Vui lòng kiểm tra: http://man7.org/linux/man-pages/man5/proc.5.html

address           perms offset  dev   inode       pathname
00400000-00452000 r-xp 00000000 08:02 173521      /usr/bin/dbus-daemon

Trường địa chỉ là không gian địa chỉ trong quy trình mà ánh xạ chiếm.

Trường perms là một tập các quyền:

 r = read
 w = write
 x = execute
 s = shared
 p = private (copy on write)

Trường bù là phần bù vào tệp / bất cứ thứ gì;

dev là thiết bị (chính: phụ);

inode là inode trên thiết bị đó.0 chỉ ra rằng không có inode nào được liên kết với bộ nhớ, như trường hợp của BSS (dữ liệu chưa được khởi tạo).

Trường tên đường dẫn thường sẽ là tệp sao lưu ánh xạ. Đối với các tệp ELF, bạn có thể dễ dàng phối hợp với trường bù bằng cách xem trường Offset trong các tiêu đề chương trình ELF (readelf -l).

Trong Linux 2.0, không có trường nào đưa ra tên đường dẫn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.