CHƯƠNG 3 : QUẢN LÝ BỘ NHỚ
3.1. ĐỊA CHỈ VÀ CÁC VẤN ĐỀ LIÊN QUAN
Có thể hình dung bộ nhớ máy tính như một chuỗi các ơ nhớ được đánh địa chỉ bắt đầu từ 0. Đơn vị đánh địa chỉ có thể là từ máy (words) nhưng thường là byte. Trong quá trình thực hiện tiến trình, CPU đọc các lệnh từ bộ nhớ và thực hiện các lệnh này. Các lệnh có thể có yêu cầu đọc, xử lý và ghi dữ liệu ngược vào bộ nhớ. Để có thể thực hiện các lệnh và xử lý dữ liệu, cả dữ liệu và lệnh đều phải được gán địa chỉ. CPU sử dụng địa chỉ để xác định lệnh và dữ liệu cụ thể.
3.1.1. Vấn đề gán địa chỉ
Chương trình máy tính thường khơng được viết trực tiếp trên ngơn ngữ máy, trừ thế hệ máy tính đầu tiên, mà viết trên một ngơn ngữ bậc cao hoặc trên hợp ngữ. Các chương trình nguồn phải qua một quá trình dịch và liên kết trước khi trở thành chương trình có thể tải vào và thực hiện. Q trình đó được biểu diễn trên hình 3.1.
Ở mỗi giai đoạn, địa chỉ được biểu diễn theo một cách khác nhau. Khi viết chương trình, chúng ta sử dụng địa chỉ dưới dạng các tên (ví dụ tên biến, tên hàm) theo quy ước của ngơn ngữ lập trình. Khi dịch, chương trình dịch biến đổi mã nguồn của từng mô đun (từng file mã nguồn) thành mã máy và thay đổi tên thành địa chỉ. Do khơng biết vị trí chính xác của mơ đun được dịch trong chương trình nên chương trình dịch chỉ có thể ánh xạ tên thành các địa chỉ tương đối tính từ đầu mơ đun chương trình được dịch.
Liên kết là quá trình kết hợp các mơ đun chương trình, bao gồm cả các mơ đun chứa các hàm thư viện, thành chương trình hồn chỉnh, cịn gọi là các mơ đun tải được. Chương trình liên kết biết vị trí chính xác các mơ đun trong chương trình, do vậy chương trình liên kết có thể gán địa chỉ trong phạm vi tồn chương trình, thay vì trong từng mơ đun như chương trình dịch. Sau khi liên kết xong, ta được chương trình có thể tải vào bộ nhớ để thực hiện.
Để thực hiện một chương trình, hệ điều hành đọc chương trình từ đĩa vào bộ nhớ và tạo ra tiến trình tương ứng. Vị trí mà chương trình sẽ được tải vào trong bộ nhớ là có thể thay đổi
và thường không biết trước. Chẳng hạn, mặc dù địa chỉ đầu của bộ nhớ là 00000, địa chỉ đầu của tiến trình hồn tồn có thể khác 00000 và thậm chí có thể thay đổi trong q trình thực hiện tiến trình. Do đó, khi viết chương trình, lập trình viên chưa biết và chưa thể gán địa chỉ cho các lệnh cũng như dữ liệu. Các chương trình dịch và liên kết cũng khơng biết địa chỉ chính xác khi thực hiện cơng việc của mình.
Hình 3.1. Quá trình tạo và tải chương trình vào bộ nhớ
Như vậy, hệ điều hành cần có khả năng gán địa chỉ và ánh xạ các địa chỉ này tuỳ thuộc vào vị trí tiến trình trong bộ nhớ. Khả năng sử dụng những vùng nhớ không cố định cho tiến trình và ánh xạ địa chỉ là một yêu cầu rất quan trọng đối với hệ điều hành khi thực hiện chức năng quản lý bộ nhớ.
Ngoại lệ. Trong một số hệ điều hành đơn giản, như hệ điều hành MS-DOS, một số dạng
chương trình như chương trình kiểu .com ln được tải vào một vị trí xác định trong bộ nhớ. Với chương trình và hệ thống kiểu này, địa chỉ được xác định ngay từ lúc viết mã nguồn trên hợp ngữ, hoặc trong quá trình dịch và liên kết.
Mã nguồn (prog.c)
Chương trình dịch
Mơ đun object (prog.o) Chương trình liên kết Mã nguồn mơ đun khác (printf.c) Chương trình dịch
Mơ đun object (printf.o)
Thư viện hóa
Thư viện (*.lib)
Mơ đun tải được (prog.exe) Chương trình tải (hệ điều hành) Tiến trình trong bộ nhớ PTIT
3.1.2. Địa chỉ lô gic và địa chỉ vật lý
Do vị trí tiến trình trong bộ nhớ có thể thay đổi, cần phân biệt hai loại địa chỉ: địa chỉ lôgic và địa chỉ vật lý.
Địa chỉ lôgic là địa chỉ được gán cho các lệnh và dữ liệu khơng phụ thuộc vào vị trí cụ thể của tiến trình trong bộ nhớ. Khi thực hiện chương trình, CPU “nhìn thấy” và sử dụng địa chỉ lôgic này để trỏ đến các phần khác nhau của lệnh, dữ liệu. Một dạng địa chỉ lơgic điển hình là địa chỉ tương đối, trong đó mỗi phần tử của chương trình được gán một địa chỉ tương đối với một vị trí nào đó, chẳng hạn đầu chương trình, và khơng phụ thuộc vào vị trí thực của tiến trình trong bộ nhớ. Tồn bộ địa chỉ được gán trong chương trình tạo thành khơng gian nhớ lơgic của chương trình. Trong trường hợp sử dụng bộ nhớ ảo, địa chỉ lơgic cịn được gọi là địa chỉ ảo.
Để truy cập bộ nhớ, địa chỉ lô gic cần được biến đổi thành địa chỉ vật lý. Địa chỉ vật lý là địa chỉ chính xác trong bộ nhớ của máy tính và được phần cứng quản lý bộ nhớ đặt lên đường địa chỉ để truy cập ô nhớ tương ứng. Địa chỉ vật lý còn được gọi là địa chỉ tuyệt đối. Thông thường, không gian nhớ vật lý khác với không gian nhớ lơgic của chương trình.
Trong thời gian thực hiện tiến trình, địa chỉ lôgic được ánh xạ sang địa vật lý nhờ một cơ chế phần cứng gọi là khối ánh xạ bộ nhớ (MMU=Memory Mapping Unit). Có nhiều cách
khác nhau để thực hiện ánh xạ này. Cơ chế ánh xạ cụ thể cho những cách tổ chức bộ nhớ khác nhau sẽ được trình bày trong các phần sau.