Virtual Memory 6: Address Translation

Address translation là cách mà hệ điều hành dịch từ địa chỉ virtual address sang địa chỉ physical address để truy cập đến vùng nhớ thực sự nằm trên RAM

Tình huống:
Hệ điều hành 32 bit quản lý 256 MB RAM và 4kB pages.

Khi đó chúng ta vẫn có 1 entry của Virtual Memory có độ dài 32 bit. Tức là mỗi process sẽ có thể  truy cập tới 4GB bộ nhớ ảo.

Nhưng vì chỉ có 256 MB RAM trên thực tế nên chỉ cẩn 28 bit để quản lý physical address. Vậy làm thế nào để convert từ virtual memory (32 bit) sang Physical Memory (28 bit).

Đó là công việc của Page Table (như đã đề cập ở phần 5)

Mỗi PTE (Page Table Entry) trỏ tới một vùng nhớ rộng 4kB, vậy là cần 12 bit để quản lý 1 page. 12 bit này không cần translate mà sẽ được copy y nguyên từ virtual memory sang physical memory. Người ta gọi là "offset" trong 1 page.

Vậy là còn 20 bit đầu của Virtual memory (32 -12) phải covert sang 16 bit Physical Memory (28 - 12)

Tóm lại
Một địa chỉ được chia làm 2 phần: Page Number + Page offset
Page Number chỉ cho chúng ta đến địa chỉ của Page
Page offset cho chúng ta biết địa chỉ ô nhớ trong 1 Page



Khi nói đến mapping thì 1 page trên virtual memory sẽ được map với 1 page trên physical memory, nên địa chỉ offset không thay đổi. Chúng ta chỉ cần chuyển hóa từ địa chỉ virtual memory page sang thành physical memory page mà thôi.

Có một câu hỏi dành cho các bạn
Tại sao chúng ta lại cần nhiều bit để thể hiện virtual address hơn so với physical address?

  • Tại vì page offset của virtual address và page offset của physical address là khác nhau
  • Dung lượng của Virtual memory lớn hơn physical memory
  • Page table không thể map từ số lượng bit nhỏ sang số lượng bit lớn hơn

Virtual Memory 4: VM hoạt động như thế nào

Virtual Memory hoạt động như thế nào?

Keyword là phân chia vùng nhớ (seperate memory spaces). Từ phía process nhìn memory chính là virtual memory. còn VM quản lý việc cấp phát và sử dụng physical memory ở trên RAM

Virtual Address chính là địa chỉ để các chương trình sử dụng, còn physical address là địa chỉ vật lý được gắn trên RAM.

Mỗi chương trình sẽ có thể truy cập vào toàn bộ vùng virtual memory của nó (từ 0 đến 2^32 -1)

Một chương trình truy cập memory như thế nào?

Ví dụ process phải xử lý một lệnh ASM như sau:

ld R3, 1024(R0)
Load giá trị từ vùng nhứ 1024 vào thanh ghi R3. Lúc này process sẽ  truy cập vào thanh ghi 1024 trên virtual memory space. Hệ điều hành sẽ map địa chị 1024 của VM sang địa chỉ vật lý trên RAM và truy cập tới để lấy giá trị. Hệ điều hành sẽ giúp đọc giá trị của vùng nhớ cần truy cập và trả về cho process.



Tương tự như vậy, một lệnh nữa
ld R2, 512(R0)



Nếu trên RAM không có dữ liệu (mapping chỉ ra disk) thì OS (hệ điều hành) sẽ tìm vùng nhớ đó trên disk, load giá trị đó lên RAM và sửa lại bộ mapping. Sau đó thì return lại giá trị cho process


Virtual Memory 2: Ba vấn đề của Memory

Ba vấn đề của Memory (RAM) khiến chúng ta nghĩ đến việc sử dụng Virtual Memory

1. Chúng ta không có đủ RAM


Với hệ điều hành 32 bit, mỗi process chạy sẽ được cấp cho một vùng nhớ 32 bit địa chỉ. Tức là chương trình do chúng ta tạo ra có thể truy cập bất cứ địa chỉ nào từ 0x00000000 tới 0xFFFFFFFF (4GB)

Nhưng nếu máy của chúng ta không có đủ RAM (< 4GB) thì sao nhỉ?

Giờ thì hầu hết các máy tính để bàn hay laptop đều có đủ 4 GB bộ nhớ RAM, thậm chí nhiều hơn. Nhưng thử nghĩ khoảng 5 năm về trước con số này chỉ là 1 GB hay thậm chí 512MB.

Ngay cả bây giờ các thiết bị nhúng (embedded system) cũng không phải lúc nào cũng đủ 4GB RAM.

Nếu các process truy cập trực tiếp tới memory (RAM) thì khả năng cao sẽ có những vùng nhớ không có để mà truy cập. Máy tính sẽ bị crash nếu bạn không chạy ra cửa hàng mua thêm RAM cho đủ 4GB

2. Sử dụng memory không hiệu quả

Giả sử chúng ta có 3 chương trình: A, B, C chạy trên một máy tính có 4GB RAM.
Chương trình A cần 1 GB RAM để thực thi
Chương trình B cần 2 GB RAM
Chương trình C cũng cần 2 GB RAM
 
Hệ thống chạy và chương trình A, B được thực thi trước và chiếm 3GB RAM bộ nhớ, RAM chỉ còn dư 1 GB. Vậy là chương trình C không thể nào được cấp phát đủ 2GB bộ nhớ cần thiết để thực thi. Chúng ta lãng phí 1 GB RAM

Chúng ta sẽ free vùng nhớ của chương trình A. Vậy RAM đang free tổng cộng là 2 GB nhưng 1 GB ở trên và 1 GB ở dưới. 2GB vùng nhớ không liên tiếp nên chương trình C vẫn không thể được thực thi.

Hiện tượng này được gọi là "phân mảnh bộ nhớ" (memory fragmentation)


3. Làm thế nào để bảo vệ dữ liệu giữa các process

Mỗi process có thể truy cập được tối đa là toàn bộ 4GB bộ nhớ
Nếu hai process muốn truy cập vào cùng một địa chỉ thì sẽ như thế nào?

Ví dụ:
  • Process A muốn ghi giá trị 1111 vào vùng nhớ  số 1024
  • Process B khi thực thi cũng muốn ghi vào vùng nhớ số 1024 nhưng giá trị 2222
  • Vậy là 2 process đã phá hoại dữ liệu lẫn nhau, dữ liệu ghi trên memory đã không được bảo vệ

Vậy làm thế nào để giải quyết được 3 vấn đề trên?
  • Chúng ta cần một khái niệm mới là virtual memory
  • Hệ điều hành sẽ quản lý việc map giữa virtual memory với physical memory (RAM, DISK)
  • Mỗi process sẽ có một vùng virtual memory riêng biệt, được map tới physical memory riêng biệt.
  • Việc mapping giữa virtual memory và physical memory sẽ mang đến cho chúng ta một cách sử dụng memory một cách hiệu quả

Virtual Memory 1: Giới thiệu

Virtual Memory là gì

Virtual Memory dịch từ tiếng Anh sang là "Bộ nhớ ảo". Ảo tức là không có thật, không thật giống như RAM là thứ bạn có thể chạy ù ra ngoài hàng máy tính mua về cắm vào máy. Không tồn tại ở dạng vật lý nhưng tồn tại trong hệ điều hành của máy tính.

Vậy tại sao lại cần "virtual memory"?

Để hiểu được vấn đề này chúng ta nói một chút sơ qua về các thể loại bộ nhớ. Vì mình tin chắc rằng có những sự nhập nhèm nhất định về RAM, ROM và DISK vì đôi khi chúng ta gọi tắt sang tiếng Việt đều là bộ nhớ

RAM

RAM là viết tắt của Random Access Memory. Định nghĩa bác học từ Wikipedia thì nó rất là bác học: 

là một loại bộ nhớ khả biến cho phép truy xuất đọc-ghi ngẫu nhiên đến bất kỳ vị trí nào trong bộ nhớ dựa theo địa chỉ ô nhớ
Hiểu đơn giản là bộ nhớ thực thi các dòng lệnh của chương trình, cần chạy chương trình gì thì đưa lên RAM để chạy.

Dung lượng hiện giờ của RAM (thời điểm tháng 3 năm 2017) trên mỗi máy tính để bàn hoặc laptop bét nhất cũng 4Gb, ngoài ra còn có thể có nhiều hơn (8Gb, 16Gb).

RAM càng lớn thì khả năng truy suất dữ liệu của máy bạn càng nhanh hơn, đồng nghĩa với việc thời gian thực thi một chương trình cũng nhanh hơn

ROM 

ROM thì mang nghĩa bộ nhớ chỉ đọc. Nó chứa các đoạn code đặc biệt của hệ thống và chỉ cho phép mình đọc ra từ nó, chương trình mình viết ra sẽ không có quyền ghi lên ROM để tránh một ngày xấu trời đoạn code của bạn sẽ đánh sập cả hệ thống

Công nghệ phát triển, ROM giờ cũng có thể ghi được, nhưng bạn yên tâm là việc ghi lên ROM cần có các thủ tục đặc biệt, không đơn giản như mấy câu lệnh "Hello World" đâu nhé


DISK

Disk tiếng Việt dịch ra là ổ cứng, là một nơi lưu trữ tất cả các thể loại nội dung mà bạn muốn từ file nhạc, video, movie cho đến ảnh bạn gái, clip phim Ma...

Dung lượng của Disk thông thường từ 512G cho tới hàng Tb

Ổ cứng cũng có rất nhiều loại, nhưng phổ biến nhất hiện giờ vẫn là HHD và SSD. Chi tiết về hai cái này các bạn tìm hiểu thêm ở trên mạng hoặc chờ mình hôm nào nghiên cứu tiếp sẽ viết bài :D

"Chúng" hoạt động như thế nào

Nói nôm na là như vầy:

Khi bật máy tính lên, chương trình đầu tiên (trong Linux gọi là bootloader) sẽ đọc trong vùng nhớ ROM để biết một số thông tin trong quá trình boot.

Khi máy tính đã chạy rồi thì mỗi khi muốn thực thi một chương trình, các biến dữ liệu sẽ được đưa từ bộ nhớ vào RAM để hệ điều hành có thể truy suất, thực thi các phép tính cộng trừ nhân chia ...

Nôm na là vậy, ở phần II, chúng ta sẽ tìm hiểu thêm về các vấn đề của bộ nhớ

Welcome to SpicyTweaks.

Copyright © Embedded System Study. Designed by Momizat Team. Powered to Blogger by SpicyTweaks.

Scroll to top