Tôi tò mò muốn biết Trình tải Bản đồ DLL trong Xử lý Không gian Địa chỉ như thế nào. Làm thế nào bộ nạp làm phép thuật đó. Ví dụ được đánh giá cao.Trình tải Bản đồ DLL trong Xử lý Không gian Địa chỉ
Xin cảm ơn trước.
Tôi tò mò muốn biết Trình tải Bản đồ DLL trong Xử lý Không gian Địa chỉ như thế nào. Làm thế nào bộ nạp làm phép thuật đó. Ví dụ được đánh giá cao.Trình tải Bản đồ DLL trong Xử lý Không gian Địa chỉ
Xin cảm ơn trước.
Bạn đang tìm mức chi tiết nào? Ở cấp độ cơ bản, tất cả các liên kết động hoạt động khá giống nhau:
Giả sử đây là trong Windows (DLL gợi ý tại đó), bạn có thể muốn đọc trang tài liệu Run-Time Dynamic Linking của Microsoft. Nó không chỉ rõ chi tiết cách DLL được ánh xạ vào không gian địa chỉ; Tôi đoán bạn không cần phải biết điều đó.
thư giãn, tôi đã chỉ định rằng 'tôi tò mò muốn biết'. chỉ tò mò @ m/c level :). Cảm ơn bạn đã liên kết. – mahesh
Nếu bạn thực sự quan tâm, bạn nên đọc cuốn sách Linkers and Loaders.
Cảm ơn bạn D & C về Liên kết tốt nhất đó. – mahesh
OK, tôi giả định phía Windows của mọi thứ ở đây. Điều gì sẽ xảy ra khi bạn tải một tệp PE là trình tải (chứa trong NTDLL) sẽ làm như sau:
DLLMain()
cho một EXE tạo ra một chủ đề mà bắt đầu địa chỉ là điểm mấu chốt của file PE (điều này cũng là quá đơn giản hóa, vì địa chỉ bắt đầu thực tế là bên trong kernel32.dll cho quá trình Win32)Bây giờ khi bạn biên dịch mã, nó phụ thuộc vào trình liên kết cách hàm bên ngoài được tham chiếu. Một số mối liên kết tạo ra các nhánh để - theo lý thuyết - cố gắng kiểm tra địa chỉ hàm chống lại NULL sẽ luôn luôn nói rằng nó không phải là NULL. Đó là một quirk bạn phải nhận thức được nếu và khi mối liên kết của bạn bị ảnh hưởng.Những người khác tham chiếu trực tiếp vào IAT trong trường hợp hàm unreferenced (nghĩ rằng delay-loaded DLLs) có thể là NULL và trình xử lý SEH sẽ gọi trình trợ giúp tải trễ và (cố gắng) giải quyết địa chỉ hàm, trước khi tiếp tục thực hiện tại điểm nó thất bại.
Có rất nhiều băng đỏ liên quan đến quy trình trên mà tôi đã đơn giản hóa.
Ý chính cho những gì bạn muốn biết là ánh xạ vào quá trình diễn ra dưới dạng MMF, mặc dù bạn có thể bắt chước hành vi bằng không gian vùng heap. Tuy nhiên, nếu bạn nhớ điểm về CoW, đó là mấu chốt trong ý tưởng của các tệp DLL. Trên thực tế, cùng bản sao (hầu hết) các trang của DLL sẽ được chia sẻ giữa các quá trình tải một DLL hạt. Các trang không được chia sẻ là những trang mà chúng tôi đã viết, ví dụ như khi giải quyết việc di chuyển và những thứ tương tự. Trong trường hợp này, mỗi quá trình có một bản sao của trang gốc.
Và một lời cảnh báo liên quan đến nhà đóng gói EXE trên DLL. Chúng đánh bại chính xác cơ chế CoW mà tôi đã mô tả ở chỗ chúng phân bổ không gian cho các nội dung được giải nén của DLL trên đống quá trình mà DLL được nạp. Vì vậy, trong khi nội dung tập tin thực tế vẫn được ánh xạ dưới dạng MMF và được chia sẻ, nội dung giải nén chiếm cùng một lượng bộ nhớ cho mỗi quá trình tải DLL thay vì chia sẻ.
Giải thích tuyệt vời về các thuộc tính CoW của các tệp DLL. – shebaw
@Mark Bessey. ở cấp độ máy :). Làm thế nào bộ nạp làm phép thuật đó. Tôi thích phân định của bạn và tôi sẽ đánh giá cao nếu bạn có thể cung cấp liên kết/ví dụ về mã m/c đã giải mã hoặc mã asm để giải thích bit. Hãy dành thời gian của bạn KHÔNG vội vàng. :) – mahesh