Trong hệ thống 32 bit, mỗi quy trình hầu như có 2^32 byte không gian địa chỉ CONTIGUOUS. Vì vậy, tại sao mã thực thi cuối cùng được tạo ra bởi một mối liên kết cần phải được relocatable. Yêu cầu là gì vì tất cả các địa chỉ được tạo ra sẽ là các địa chỉ ảo trong không gian địa chỉ của quá trình và quá trình khác KHÔNG THỂ sử dụng như vậy. Do đó, quá trình có thể được đặt ở bất kỳ nơi nào mà nó muốn. Tại sao phải di chuyển?Bộ nhớ ảo và mã có thể định vị lại
Trả lời
Nó cần phải được relocatable bởi vì để thực hiện quá trình của bạn cần phải được đưa vào bộ nhớ chính thực tế trong một hàng đợi sẵn sàng. Bây giờ trong bộ nhớ chính nó sẽ được đặt là không cố định (nó được đặt bất cứ nơi nào đủ không gian có sẵn) để địa chỉ thực tế của các hướng dẫn thay đổi từ địa chỉ ảo của nó.
Do đó báo cáo thực hiện cuộc gọi đến chức năng, trả lại vv cần được cập nhật phù hợp trỏ đến địa chỉ thực tế của những chức năng
Nhưng điều đó sẽ được quản lý bởi MMU (Bộ phận quản lý bộ nhớ). Việc di dời phải làm gì với nó. – user1863877
Một số hệ điều hành làm cho đoạn code relocatable thực thi (điều này chắc chắn không phải là phổ cập tới tất cả các hệ điều hành) để cho phép address space layout randomization. Điều này giúp giảm thiểu các cuộc tấn công nhất định.
Trong quá khứ khi ngăn xếp được thực thi, tràn bộ đệm có thể được khai thác bằng cách viết mã thực thi trực tiếp trên chồng hoặc chồng tràn. Khi hệ điều hành trở nên thông minh hơn và bắt đầu ngăn chặn việc thực hiện ngăn xếp và đống, các cuộc tấn công trở nên phức tạp hơn và bắt đầu sử dụng các chuỗi mã đã biết trong bộ nhớ bằng cách thực hiện return oriented programming. Việc giảm thiểu các lớp tấn công lần đầu tiên được thực hiện bằng cách ngẫu nhiên bố trí bộ nhớ cho các thư viện chia sẻ (vì chúng dễ khai thác hơn) và sau đó khi kẻ tấn công chuyển sang tấn công thực thi chính, bằng cách ngẫu nhiên vị trí bộ nhớ của tập tin thực thi. Để làm cho nó có thể thực thi chính cần phải relocatable.
Mã thực thi không phải lúc nào cũng chứa địa chỉ tương đối. Ví dụ: trên Windows, việc giải quyết thường là tuyệt đối (ví dụ: cho dữ liệu chung).
Xem xét hai thư viện động khác nhau. Cả hai được biên dịch cho một địa chỉ cơ sở cố định là 0x00100000. Chương trình của bạn cố gắng tải cả hai. Trình tải để đặt DLL thứ hai ở đâu? Địa chỉ cơ sở ưa thích của nó đã được sử dụng bởi các DLL khác.
Trong trường hợp này, mã relocatable giúp đặt DLL thứ hai ở một địa chỉ khác và vá con trỏ nội bộ của nó đến vị trí mới. Với các địa chỉ cơ sở cố định, tải DLL thứ hai sẽ thất bại.
kiểm tra điều này: http: //stackoverflow.com/questions/7193888/load-time-relocation-and-virtual-memory – mohit