Kích thước bộ nhớ cho hoạt động mmap kernel


9

Tôi quan tâm đến cách các tệp Linux mmaps vào bộ nhớ chính (trong ngữ cảnh của tôi để thực thi, nhưng tôi đoán quy trình mmap cũng giống như để viết và đọc) và kích thước của nó sử dụng.

Vì vậy, tôi biết Linux sử dụng phân trang với kích thước trang 4kB thường (trong đó tôi có thể tìm thấy kích thước này ở đâu?). Nhưng chính xác điều này có ý nghĩa gì đối với bộ nhớ được phân bổ: Giả sử bạn có một tệp nhị phân có kích thước vài nghìn byte, hãy nói 5812B và bạn thực hiện nó. Điều gì xảy ra trong kernel: Nó có phân bổ 2 * 4kB và sau đó sao chép 5812B vào không gian này, làm lãng phí> 3KB bộ nhớ chính trong trang 2 không?

Sẽ thật tuyệt nếu có ai biết tệp trong nguồn kernel nơi xác định kích thước trang.

Câu hỏi thứ 2 của tôi cũng rất đơn giản Tôi đoán: Tôi giả sử 5812B là kích thước tệp. Có đúng không, kích thước này chỉ đơn giản là được lấy từ inode?

Câu trả lời:


6

Không có mối quan hệ trực tiếp giữa kích thước của tệp thực thi và kích thước trong bộ nhớ. Dưới đây là tổng quan rất nhanh về những gì xảy ra khi tệp nhị phân được thực thi:

  1. Nhân phân tích tệp và chia nó thành phần. Một số phần được tải trực tiếp vào bộ nhớ, trong các trang riêng biệt. Một số phần không được tải ở tất cả (ví dụ: biểu tượng gỡ lỗi).
  2. Nếu tệp thực thi được liên kết động, kernel sẽ gọi trình tải động và nó sẽ tải các thư viện chia sẻ được yêu cầu và thực hiện phiên bản liên kết theo yêu cầu.
  3. Chương trình bắt đầu thực thi mã của nó và thông thường nó sẽ yêu cầu thêm bộ nhớ để lưu trữ dữ liệu.

Để biết thêm thông tin về các định dạng thực thi, liên kết, và tải thực thi, bạn có thể đọc Linkers và bốc John R. Levine .

Trong một thực thi 5kB, có khả năng mọi thứ là mã hoặc dữ liệu cần được tải vào bộ nhớ ngoại trừ tiêu đề. Mã thực thi sẽ có ít nhất một trang, có thể là hai, và sau đó sẽ có ít nhất một trang cho ngăn xếp, có thể là một trang hoặc cho heap (dữ liệu khác), cộng với bộ nhớ được sử dụng bởi các thư viện chia sẻ.

Trong Linux, bạn có thể kiểm tra ánh xạ bộ nhớ để thực thi với cat /proc/$pid/maps. Các định dạng được ghi lại trong proc(5)trang người đàn ông; xem thêm Hiểu Linux / Proc / id / maps .


0

Có: cuối cùng bạn nhận được hai trang 4k. Dữ liệu được tải theo yêu cầu, vì vậy nếu không có gì liên quan đến trang thứ hai, nó sẽ không bao giờ được tải vào bộ nhớ.

include/asm-i386/param.h:#define EXEC_PAGESIZE  4096
include/asm-i386/elf.h:#define ELF_EXEC_PAGESIZE        4096

Không thay đổi các giá trị này và mong đợi bất cứ điều gì để làm việc.

Có, kích thước tệp được lưu trữ trong inode trong ext2 / 3.


0

Đối với phần định nghĩa, trên kernel 2.6,38 ~ cho kiến ​​trúc Intel:

vòm / x86 / bao gồm / asm / page_types.h:

/ * PAGE_SHIFT xác định kích thước trang * /

#define PAGE_SHIFT 12

#define PAGE_SIZE (_AC (1, UL) << PAGE_SHIFT)

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.