Liên kết động trong Linux và Windows (Phần 1)
Số trang: 17
Loại file: pdf
Dung lượng: 1.12 MB
Lượt xem: 9
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Liên kết động trong Linux và Windows (Phần 1)Phần IBài báo này thảo luận về khái niệm thư viện chia sẻ trong cả Windows và Linux. Đồng thời lướt qua các kiểu cấu trúc dữ liệu để giải thích liên kết động làm việc như thế nào trong các hệ điều hành này. Bài này rất hữu ích cho các nhà phát triển hứng thú nghiên cứu vấn đề về các hàm ẩn bảo mật, liên quan tới tốc độ liên kết động. Và cũng khẳng định một số kiến thức cơ bản về liên kết động đã được đưa...
Nội dung trích xuất từ tài liệu:
Liên kết động trong Linux và Windows (Phần 1) Liên kết động trong Linux và Windows (Phần 1)Phần IBài báo này thảo luận về khái niệm thư viện chia sẻ trong cả Windows vàLinux. Đồng thời lướt qua các kiểu cấu trúc dữ liệu để giải thích liên kếtđộng làm việc như thế nào trong các hệ điều hành này. Bài này rất hữu íchcho các nhà phát triển hứng thú nghiên cứu vấn đề về các hàm ẩn bảo mật,liên quan tới tốc độ liên kết động. Và cũng khẳng định một số kiến thức cơbản về liên kết động đã được đưa ra trước đây.Phần một giới thiệu các khái niệm cho cả Linux và Windows, nhưng cơ bảntập trung trên Linux. Lần tới, trong phần hai chúng ta sẽ thảo luận chúng làmviệc trong Windows như thế nào và sau đó là so sánh hai môi trường vớinhau.Thư viện tĩnh và thư viện độngThư viện là một tập hợp các chương trình con cho phép mã chương trìnhđược chia sẻ và thay đổi theo kiểu modul. Các chương trình chạy và thư việnliên hệ với nhau theo một tiến trình gọi là linking (liên kết), làm việc quamột cầu nối (linker).Thư viện có thể chia thành hai loại: thư viện tĩnh và thư viện chia sẻ.Thư viện tĩnh là một tập hợp các file kiểu đối tượng. Theo quy ước, các filenày có đuôi kết thúc là “.a” trong UNIX và “.lib” trong Windows. Khi mộtchương trình được liên kết ngược với một thư viện tĩnh, mã máy từ các fileđối tượng cho bất kì hàm mở rộng dùng trong chương trình sẽ được sao chéptừ thư viện vào chương trình chạy cuối cùng.Ngược lại với thư viện tĩnh, mã lệnh trong thư viện chia sẻ không giới hạnchương trình chạy tại thời gian liên kết. Phụ thuộc vào việc ghép địa chỉ lúcnào và như thế nào, tiến trình liên kết có thể phân loại là prelinking, loadtime linking, implicit run-time linking và explicit run-time linking.Mã độc lập vị trí ( hay Win32 DDLs với “.SO” )Các mã độc lập vị trí có thể được sao chép từ bất kì khu vực bộ nhớ nào, sauđó chạy mà không cần thêm chỉnh sửa gì. Không giống như mã định vị lại vịtrí đòi hỏi phải có một tiến trình đặc biệt là các cầu nối để có được vị trí vàsự thực thi phù hợp.Win32 DLLs không độc lập vị trí. Chúng cần định vị lại suốt trong quá trìnhtải, trừ phi phần cơ sở được sửa chữa để không cần dùng. Định vị lại để cácđịa chỉ giống nhau có thể được chia sẻ. Nhưng nếu các tiến trình khác nhauxung đột trong dàn xếp bộ nhớ, bộ nạp cần tạo ra các bản “đa sao chép” củaDDL trong bộ nhớ. Khi bộ nạp Windows vẽ bản đồ DDL vào bộ nhớ, nó mởfile và cố gắng nạp chúng vào các địa chỉ cơ bản trước. Tại các trang trongbản đồ đã được vẽ, hệ thống phân trang sẽ xem xét liệu các trang này đãđược thể hiện trong bộ nhớ chưa. Nếu đã có thì chỉ cần vẽ lại các trang chotiến trình mới, khi việc định vị lại vị trí đã được bộ nạp thực hiện xong tạicác địa chỉ cơ sở. Nếu không thì các trang vẫn đang được lấy về từ ổ đĩa.Nếu phạm vi địa chỉ xác định cho DDL không phù hợp, bộ nạp vẽ lại bản đồtrang vào khu vực tự do trong không gian địa chỉ chương trinh. Trongtrường hợp này, nó đánh dấu trang mã lệnh như là COW (copy-on-write: saochép để ghi) mà trước đó đã được đánh dấu là read + execute (đọc và thựcthi). Từ đó, các cầu nối phải thể hiện mã lệnh đã sửa chữa tại thời gian địnhvị lại vị trí, bắt buộc các trang phải được phục hồi theo kiểu file phân trang.Linux giải quyết vấn đề này bằng cách dùng PIC (Position IndependentCode – mã độc lập vị trí). Các đối tượng chia sẻ trong Linux thường có PICđể tránh phải định vị lại vị trí thư viện trong thời gian tải. Tất cả các trangmã lệnh có thể được chia sẻ giữa toàn bộ tiến trình dùng cùng một thư việnvà có thể được lập trang tới (hoặc từ) hệ thống file. Trong dòng x86, khôngcó cách đơn giản nào để định địa chỉ dữ liệu liên quan tới khu vực hiện tại,kể từ khi tất cả các jump và các call là kiểu liên hệ cấu trúc con trỏ. Do đó,tất cả các tham chiếu tới khu vực địa chỉ tĩnh mở rộng được thực hiện trựctiếp qua một bảng, gọi là bảng GOT (Global Offset Table).Liên kết động trong LinuxCấu trúc dữ liệu ELFVì đây không phải là bài báo đặe tả định dạng kiểu ELF, chúng ta sẽ chỉthảo luận về các cấu trúc dữ liệu, liên quan tới nội dung mà chúng ta đangxem xét. Đối với liên kết động, các cầu nối ELF cơ bản dùng hai bảng đặctrưng theo bộ xử lý: Global Offset Table (GOT) và Procedure Linkage Table(PLT).Global Offset Table (GOT) - Bảng địa chỉ Offset mở rộngCác mối liên kết ELF hỗ trợ mã PIC qua bảng GOT trong từng thư việnchia sẻ. GOT chỉ chứa địa chỉ của tất cả các dữ liệu tĩnh dùng trong chươngtrình. Địa chỉ của GOT thông thường được lưu trữ trong một thanh ghi(EBX), trong đó một địa chỉ quan hệ của mã lệnh được dùng.Procedure Linkage Table (PLT) - Bảng liên kết các chương trình conCả chương trình chạy sử dụng thư viện chia sẻ và chính bản thân thư việnchia sẻ đều có một bảng PLT. Tương tự như cách bảng GOT gửi lại các tínhtoán địa chỉ độc lập vị trí tới khu vực địa chỉ tuyệt đối, PLT cũng gửi lại cáchàm gọi địa chỉ tuyết đối tới khu vực địa chỉ tuyệt đối.Ngoà ...
Nội dung trích xuất từ tài liệu:
Liên kết động trong Linux và Windows (Phần 1) Liên kết động trong Linux và Windows (Phần 1)Phần IBài báo này thảo luận về khái niệm thư viện chia sẻ trong cả Windows vàLinux. Đồng thời lướt qua các kiểu cấu trúc dữ liệu để giải thích liên kếtđộng làm việc như thế nào trong các hệ điều hành này. Bài này rất hữu íchcho các nhà phát triển hứng thú nghiên cứu vấn đề về các hàm ẩn bảo mật,liên quan tới tốc độ liên kết động. Và cũng khẳng định một số kiến thức cơbản về liên kết động đã được đưa ra trước đây.Phần một giới thiệu các khái niệm cho cả Linux và Windows, nhưng cơ bảntập trung trên Linux. Lần tới, trong phần hai chúng ta sẽ thảo luận chúng làmviệc trong Windows như thế nào và sau đó là so sánh hai môi trường vớinhau.Thư viện tĩnh và thư viện độngThư viện là một tập hợp các chương trình con cho phép mã chương trìnhđược chia sẻ và thay đổi theo kiểu modul. Các chương trình chạy và thư việnliên hệ với nhau theo một tiến trình gọi là linking (liên kết), làm việc quamột cầu nối (linker).Thư viện có thể chia thành hai loại: thư viện tĩnh và thư viện chia sẻ.Thư viện tĩnh là một tập hợp các file kiểu đối tượng. Theo quy ước, các filenày có đuôi kết thúc là “.a” trong UNIX và “.lib” trong Windows. Khi mộtchương trình được liên kết ngược với một thư viện tĩnh, mã máy từ các fileđối tượng cho bất kì hàm mở rộng dùng trong chương trình sẽ được sao chéptừ thư viện vào chương trình chạy cuối cùng.Ngược lại với thư viện tĩnh, mã lệnh trong thư viện chia sẻ không giới hạnchương trình chạy tại thời gian liên kết. Phụ thuộc vào việc ghép địa chỉ lúcnào và như thế nào, tiến trình liên kết có thể phân loại là prelinking, loadtime linking, implicit run-time linking và explicit run-time linking.Mã độc lập vị trí ( hay Win32 DDLs với “.SO” )Các mã độc lập vị trí có thể được sao chép từ bất kì khu vực bộ nhớ nào, sauđó chạy mà không cần thêm chỉnh sửa gì. Không giống như mã định vị lại vịtrí đòi hỏi phải có một tiến trình đặc biệt là các cầu nối để có được vị trí vàsự thực thi phù hợp.Win32 DLLs không độc lập vị trí. Chúng cần định vị lại suốt trong quá trìnhtải, trừ phi phần cơ sở được sửa chữa để không cần dùng. Định vị lại để cácđịa chỉ giống nhau có thể được chia sẻ. Nhưng nếu các tiến trình khác nhauxung đột trong dàn xếp bộ nhớ, bộ nạp cần tạo ra các bản “đa sao chép” củaDDL trong bộ nhớ. Khi bộ nạp Windows vẽ bản đồ DDL vào bộ nhớ, nó mởfile và cố gắng nạp chúng vào các địa chỉ cơ bản trước. Tại các trang trongbản đồ đã được vẽ, hệ thống phân trang sẽ xem xét liệu các trang này đãđược thể hiện trong bộ nhớ chưa. Nếu đã có thì chỉ cần vẽ lại các trang chotiến trình mới, khi việc định vị lại vị trí đã được bộ nạp thực hiện xong tạicác địa chỉ cơ sở. Nếu không thì các trang vẫn đang được lấy về từ ổ đĩa.Nếu phạm vi địa chỉ xác định cho DDL không phù hợp, bộ nạp vẽ lại bản đồtrang vào khu vực tự do trong không gian địa chỉ chương trinh. Trongtrường hợp này, nó đánh dấu trang mã lệnh như là COW (copy-on-write: saochép để ghi) mà trước đó đã được đánh dấu là read + execute (đọc và thựcthi). Từ đó, các cầu nối phải thể hiện mã lệnh đã sửa chữa tại thời gian địnhvị lại vị trí, bắt buộc các trang phải được phục hồi theo kiểu file phân trang.Linux giải quyết vấn đề này bằng cách dùng PIC (Position IndependentCode – mã độc lập vị trí). Các đối tượng chia sẻ trong Linux thường có PICđể tránh phải định vị lại vị trí thư viện trong thời gian tải. Tất cả các trangmã lệnh có thể được chia sẻ giữa toàn bộ tiến trình dùng cùng một thư việnvà có thể được lập trang tới (hoặc từ) hệ thống file. Trong dòng x86, khôngcó cách đơn giản nào để định địa chỉ dữ liệu liên quan tới khu vực hiện tại,kể từ khi tất cả các jump và các call là kiểu liên hệ cấu trúc con trỏ. Do đó,tất cả các tham chiếu tới khu vực địa chỉ tĩnh mở rộng được thực hiện trựctiếp qua một bảng, gọi là bảng GOT (Global Offset Table).Liên kết động trong LinuxCấu trúc dữ liệu ELFVì đây không phải là bài báo đặe tả định dạng kiểu ELF, chúng ta sẽ chỉthảo luận về các cấu trúc dữ liệu, liên quan tới nội dung mà chúng ta đangxem xét. Đối với liên kết động, các cầu nối ELF cơ bản dùng hai bảng đặctrưng theo bộ xử lý: Global Offset Table (GOT) và Procedure Linkage Table(PLT).Global Offset Table (GOT) - Bảng địa chỉ Offset mở rộngCác mối liên kết ELF hỗ trợ mã PIC qua bảng GOT trong từng thư việnchia sẻ. GOT chỉ chứa địa chỉ của tất cả các dữ liệu tĩnh dùng trong chươngtrình. Địa chỉ của GOT thông thường được lưu trữ trong một thanh ghi(EBX), trong đó một địa chỉ quan hệ của mã lệnh được dùng.Procedure Linkage Table (PLT) - Bảng liên kết các chương trình conCả chương trình chạy sử dụng thư viện chia sẻ và chính bản thân thư việnchia sẻ đều có một bảng PLT. Tương tự như cách bảng GOT gửi lại các tínhtoán địa chỉ độc lập vị trí tới khu vực địa chỉ tuyệt đối, PLT cũng gửi lại cáchàm gọi địa chỉ tuyết đối tới khu vực địa chỉ tuyệt đối.Ngoà ...
Tìm kiếm theo từ khóa liên quan:
thủ thuật máy tính công nghệ thông tin tin học quản trị mạng computer networkTài liệu liên quan:
-
52 trang 433 1 0
-
24 trang 359 1 0
-
Top 10 mẹo 'đơn giản nhưng hữu ích' trong nhiếp ảnh
11 trang 320 0 0 -
Làm việc với Read Only Domain Controllers
20 trang 310 0 0 -
74 trang 303 0 0
-
96 trang 297 0 0
-
Báo cáo thực tập thực tế: Nghiên cứu và xây dựng website bằng Wordpress
24 trang 291 0 0 -
Đồ án tốt nghiệp: Xây dựng ứng dụng di động android quản lý khách hàng cắt tóc
81 trang 285 0 0 -
EBay - Internet và câu chuyện thần kỳ: Phần 1
143 trang 277 0 0 -
Tài liệu hướng dẫn sử dụng thư điện tử tài nguyên và môi trường
72 trang 270 0 0