2010-05-27 29 views
8

Tôi có nhiều mã trong thư viện được chia sẻ ELF chỉ được sử dụng trong khi khởi tạo thư viện (nó được gọi từ bộ khởi tạo tĩnh). Nếu tôi đặt mã này trong phần riêng của nó (hoặc có lẽ nó có thể đi trong phần .init), mà tôi có thể làm bằng cách sử dụng __attribute__((section(".mysection"))), có cách nào để buộc phần này được phân trang sau khi thư viện đã được tải không?Xóa phần ELF khỏi RAM sau khi khởi tạo thư viện

This question có liên quan, nhưng kết luận là hạt nhân sẽ trang ra các trang không sử dụng khi thiếu bộ nhớ, vì vậy không cần phải làm như vậy một cách rõ ràng. Tuy nhiên, tôi đang làm việc trong một môi trường nhúng nơi bộ nhớ ở mức phí bảo hiểm và chi phí phân trang mã từ đĩa (ổ flash USB chậm) cao. Do đó, tôi muốn xóa mã này một cách rõ ràng, điều mà tôi biết sẽ không bao giờ được sử dụng nữa, thay vì để hạt nhân có thể quyết định xóa một số mã khác mà cuối cùng có thể cần được quay trở lại.

Tôi chắc chắn tôi nhớ đọc về một syscall để yêu cầu hạt nhân để trang vào hoặc ra một số khu vực của bộ nhớ, mặc dù tôi không thể tìm thấy bất kỳ tài liệu tham khảo này bất cứ nơi nào, vì vậy có lẽ tôi tưởng tượng nó. Có một điều như vậy tồn tại?

+0

syscall 'madvise', đặc biệt với thông số MADV_WILLNEED/MADV_DONTNEED, là những gì tôi đang nghĩ đến. Tuy nhiên, tôi vẫn muốn biết nếu có một cách dễ dàng để buộc một phần ELF cụ thể được phân trang ra ngoài. – jchl

Trả lời

2

Tìm tài liệu về lớp phủ tinh tinh. Sắp xếp mã của bạn để bạn có lớp phủ để khởi tạo và một lớp khác để xử lý. Bạn cũng có thể muốn xem một lớp phủ để tắt máy. Mã trong lớp phủ phải được thay thế, khi lớp phủ tiếp theo được gọi.

+2

Thật thú vị, trang này hiện là kết quả tìm kiếm hàng đầu của Google đối với "lớp phủ elf". – jchl

+0

Tôi không thể tìm thấy nhiều thông tin về lớp phủ ELF. Điều tốt nhất tôi có thể tìm thấy là http://sourceware.org/binutils/docs-2.20/ld/Overlay-Description.html, điều này không đặc biệt hữu ích trong ngữ cảnh. Bạn có thể xây dựng hoặc cung cấp một số liên kết đến tài liệu có liên quan, đặc biệt liên quan đến việc sử dụng lớp phủ với các thư viện được chia sẻ không? Bên cạnh đó, tôi không chắc chắn lớp phủ sẽ làm việc cho tôi, vì mã khởi tạo cần truy cập vào tất cả các mã khác trong thư viện. – jchl

+0

Tại sao bạn có thể có một lớp phủ vi mô cho mã post-init đầu tiên? –

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