Liên kết chương trình và nạp chương trình

Một phần của tài liệu Bài giảng: Cấu trúc máy tính và ghép nối pot (Trang 82 - 85)

CHƯƠNG 5: NGÔN NGỮ BẬC CAO VÀ MÁY TÍNH

5.3. Liên kết chương trình và nạp chương trình

Hầu hết các chương trình ứng dụng đều được cấu tạo từ một vài modul. Mỗi một modul này được xây dựng từ các ngôn ngữ lập trình khác nhau và chúng có thể được cung cấp bởi các thư viện khác nhau, trên các môi trường lập trình khác nhau, thậm chi trên các hệ điều hành khác nhau. Mỗi một modul có các thông tin đặc trưng khác nhau cho nên chúng cần được kết nối để nạp chương trình và thực thi

Chương trình kết nối linker là chương trình phần mềm để kết hợp các chương trình hợp ngữ khác nhau thành 1 chương trình độc lập. Chương trình linker sẽ phải giải quyết tất cả các vấn đề như các biến toàn cục, biến địa phương, giải quyết các địa chỉ các biến trên các chương trình hoàn toàn độc lập. Chương trình cuối cùng sẽ được nạp vào bộ nhớ bằng chương trình loader

Thư viện kết nối động (dynamic link libraries - DLLs) được xây dựng bởi Microsoft trên hệ điều hành Windows được sử dụng rất phổ biến.Chúng ta sẽ tìm hiểu thêm về các thư viện liên kết này ở những phần sau trong mục này 5.3.1. Liên kết chương trình

Để kết hợp các chương trình độc lập với nhau, chương trình kết nối cần phải

• Giải quyết vấn đề các địa chỉ ở các modul khác nhau phải được liên kết lại

• Xác định lại vị trí của các modul trong bộ nhớ bằng cách kết hợp. Trong suốt quá trình này, rất nhiều địa chỉ ở trong các modul phải được thay đổi tương ứng với chương trình mới được tạo ra

• Xem xét lại các biểu tượng được sử dụng trong các modul khác nhau

• Nếu các modul nằm trong các phân đoạn khác nhau, chương trình linker phải nhận diện và thâm nhập vào các phân đoạn khác nhau

Liên kết các địa ch các modul

Để giải quyết vấn đề địa chỉ của các biến và hằng số ở các modul khác nhau, chương trình liên kết cần phải phân biệt các biểu tượng ở các biến địa phương với các biểu tượng ở các biến toàn cục. Điều này được thực hiện bởi các lệnh giả .global và .extern. Lệnh giả .global sẽ gán cho các biểu tượng trong modul là các biến toàn cục và cho phép các modul khác truy cập. Lệnh giả .extern chỉ ra rằng nhãn mà nó trỏ tới được sử dụng trong 1 modul nhưng lại được định nghĩa trong một modul khác. Do đó, lệnh giả .global được sử

dụng trong modul mà các biểu tượng được định nghĩa ở đó còn lệnh giả .extern được sử dụng ở những nơi mà các modul cần sử dụng các biến trong .global. Có một điều chú ý là địa chỉ các nhãn có thể là toàn cục hoặc là địa phương

Tất cả các nhãn được định nghĩa trong một chương trình nhưng sẽ sử dụng trong một chương trình khác, ví dụ như chương trình con sẽ được khai báo với cấu trúc

.global symbol1, symbol2,...

Tất cả các nhãn ở các modul địa phương, có cùng tên nhãn và được sử dụng trong lớn hơn một modul khác sẽ được khai báo

.extern symbol1, symbol2,...

Ví dụ dưới đây mô tả cách sử dụng của .global và .extern

Hình 5.6. Ví dụ minh họa về .global và .extern

Xác định li v trí các modul trong b nh

Trong ví dụ ở hình 5.6, ta thấy rằng cả 2 chương trình đều được bắt đầu ở cùng một địa chỉ là 2048, do vậy chúng không thể tồn tại ở cùng một thời điểm bởi nếu như vậy sẽ dẫn tới hiện tượng xung đột bộ nhớ. Để giải quyết vấn đề này các biểu tượng phải được đặt lại địa chỉ trong quá trình liên kết. Ý tưởng để giải quyết là chương trình thay vì biên dịch ở địa chỉ 2048 thì nó sẽ biên dịch ở địa chỉ 3000 chẳng hạn, và do đó độ lệch địa chỉ sẽ là 3000 – 2048 = 925. Việc này

sẽ được chương trình liên kết quản lý. Do đó sẽ không có một chương trình con nào được biên dịch ở cùng một địa chỉ so với chương trình chính.

5.3.2. Nạp chương trình

Chương trình nạp loader là chương trình được sử dụng để nạp chương trình lên bộ nhớ. Nhiệm vụ của loader là nạp các phân vùng bộ nhớ khác nhau với các đặc thù như các giá trị thanh ghi điều khiển ví dụ như %sp, bộ đếm chương trình, %pc chuyển nó thành giá trị tương ứng để chương trình có thể hoạt động bình thường

Nếu tại một thời điểm chỉ có 1 chương trình được nạp, việc thực thi chương trình hoạt động rất đơn giản. Tuy nhiên, trong các hệ điều hành hiện đại, một vài chương trình có thể được nạp cùng lúc, do đó không có cách nào để linker hay loader có thể biết được địa chỉ mà nó đang xử lý. Chương trình nạp cần xác định lại địa chỉ của các modul bằng cách nạp vào địa chỉ offset đối với toàn bộ các lệnh trong modul. Phương pháp này có tên là relocating loader. Phương pháp nạp relocating không lặp lại công việc của chương trình liên kết linker.

Chương trình liên kết linker sẽ kết hợp một vài modul thành một modul duy nhất, trong khi đó, bộ nạp loader đánh lại địa chỉ của một chương trình duy nhất để nhiều chương trình có thể đồng thời nạp vào bộ nhớ chương trình. Phương pháp nạp thứ 2 có tên linking loader. Phương pháp này có chức năng của cả chương trình kết nối linker và chương trình nạp loader: xác định lại địa chỉ các biến, đánh lại địa chỉ các modul và nạp vào bộ nhớ

Chương trình liên kết sẽ tạo ra file chứa các thông tin đặc tả lại quá trình liên kết như địa chỉ bắt đầu của chương trình, các thông tin đánh lại địa chỉ và các điểm bắt đầu của các chương trình con

Một cách khác để nạp bộ nhớ chương trình là sử dụng chương trình quản lý bộ nhớ memory managemet unit MMU. Chương trình này sẽ phân chia bộ nhớ vật lý thành từng phân vùng (segment). Việc truy cập một ô nhớ sẽ là truy cập vào phân vùng tương ứng và địa chỉ offset. Các chương trình khác nhau có thể có cùng địa chỉ offset nhưng sẽ có địa chỉ segment khác nhau

Thư vin liên kết động DLL

Quay trở lại về thư viện liên kết động DLL, khái niệm này có một số tính năng hấp dẫn. Các biến của các chương trình con thường xuyên được sử dụng ví dụ như chương trình quản lý bộ nhớ hay quản lý đồ họa sẽ được lưu vào một vị trí, đó là thư viện DDL. Điều này làm cho kích thước chương trình nhỏ hơn bởi vì mỗi chương trình không cần phải lưu lại một bản sao DDL mà thông thường phải có. Tất cả các chương trình chia sẻ các đoạn mã của mình ngay cả trong lúc thực hiện. Hơn nữa, thư viện DDL còn được nâng cấp khả năng phân tích lỗi hoặc các chức năng khác. Như thế, các chương trình sử dụng tới nó không cần phải chuyển mã hay liên kết lại

Một phần của tài liệu Bài giảng: Cấu trúc máy tính và ghép nối pot (Trang 82 - 85)

Tải bản đầy đủ (PDF)

(178 trang)