Chào mừng bạn đến với Vimentor!

Hỏi đáp
Đăng ký

Giới thiệu về không gian địa chỉ và cấp độ ưu tiên của virtual memory

Cùng Nhau Học Linux Kernel
Cùng Nhau Học Linux Kernel
24 bài viết — 24 Người theo dõi |
0
0

Hôm nay e xin chia sẻ về memory (chỉ một chút thôi)
có ảnh minh họa nhưng e ko biết chèm nó thẳng vào trong đoạn text ntn =)))) mong các bác thông cảm. Và hơn thế nữa các bác hãy tiếp tục bình luận đưa ra ý kiến của mình như với chủ đề thread để cùng nhau làm sáng tỏ vấn đề ^^
----------------------------------------------------------------
***Không gian địa chỉ và cấp độ ưu tiên:
Khích thước tối đa của không gian địa chỉ không phụ thuộc vào việc bao nhiêu bộ nhớ RAM vật lý thực sự có thể sử dụng được, do đó nó được biết đến là không gian địa chỉ ảo (virtual address space). Một lý do khác cho thuật ngữ này, mỗi process có suy nghĩ rằng chúng chỉ sống trong vùng địa chỉ này và không hề tồn tại các process khác từ quan điểm của chúng. ứng dụng không cần quan tâm đến các ứng dụng khác và có thể hoạt động như thể chúng là quá trình duy nhất, điều này không đúng với thực tế nên nó được gọi là không gian địa chỉ ảo.
Linux chia virtual address space thành 2 phần: kernel space và userspace.

Mỗi user process trong hệ thống sở hữu bộ nhớ có kích thước từ 0 -> TASK_SIZE. Phần địa chỉ từ TASK_SIZE -> 264/232 được dành cho kernel và không thể bị truy cập từ user process. TASK_SIZE là một hằng số kiến trúc mà nó dùng để chia tỷ lệ không gian bộ nhớ. Ví dụ trong IA-32(32 bit), không gian địa chỉ được chia ra 3GiB cho mỗi process và 1GiB còn lại dành cho kernel (232 = 4GiB). 
Note: 210 = 1KiB, 220 = 1Mib, 230 = 1Gib.
Cách chia này không phụ thuộc vào việc có bao nhiêu bộ nhớ RAM có thể sử dụng. Vì có sự ảo hóa nên mỗi user process nghĩ rằng nó có 3GiB bộ nhớ. Các userspace của các process thực sự tách biệt với nhau nhưng kernel space ở vùng trên cùng của không gian địa chỉ ảo thì luôn giống nhau.
***Cấp độ ưu tiên: 
Kernel chia không gian địa chỉ ảo thành 2 phần để nó có thể bảo vệ các process riêng lẻ với nhau. 
Ở userspace, tất cả các CPU ngày nay đều cung cấp một số mức ưu tiên cho các process. Có nhiều lệnh cấm khác nhau ở mỗi cấp. Ví dụ ở kiến trúc IA-32 sử dụng một hệ thống 4 cấp, các vòng bên trong có thể truy cập nhiều function hơn.

Linux chỉ sử dụng 2 mode khác nhau là kernel mode và user mode. Mấu chốt của sự khác nhau này là khả năng truy cập vào vùng nhớ ở trên TASK_SIZE (TASK_SIZE->232/264). Chỉ trong kernel mode mới có thể truy cập, ngăn cấm với user mode. Cơ chế này giúp ngăn chặn các process can thiệp lẫn nhau.
Để thực hiện chuyển đổi từ user mode sang kernel mode, ta sử dụng các system call. Nếu một process muốn thực hiện một hành động nào đó có ảnh hưởng đến toàn bộ hệ thống nó chỉ việc gửi một system call đến kernel, kernel sẽ kiểm tra xem process đó có quyền để thử hiện hành động đó hay ko, sau đó thực hiện hành động mong muốn đó. Kết quả được gửi về user mode.
Bên cạnh việc thực hiện công việc thay mặt process, kernel cũng đóng vai trò đồng bộ hardware interrupt và sau đó được chạy trong interrupt context. Không thể ngủ trong interupt context
Cạnh các process bình thường, còn có cả các kernel thread chạy trong hệ thống. Kernel thread không có liên quan đặc biệt đến bất kì userspace process nào. Các kernel thread hoạt động nhiều hơn các userland application, khác với kernel trong interupt context chúng có thể ngủ và chúng cũng được theo dõi bởi scheduler nhưng mọi process khác trong hệ thống. Kernel sử dụng chúng cho các mục đích khác nhau như đồng bộ hóa dữ liệu của RAM và các block devices.
Kernel thread có thể dễ dàng phân biệt bởi lệnh ps vì tên của chúng được đặt trong dấu ngoặc vuông []:

Trong hệ thống đa xử lý (Nhiều hơn 1 CPU) nhiều thread được bắt đầu trên 1 CPU chuẩn và bị hạn chế để chỉ chạy trên một CPU cụ thể. Được biểu diễn bằng dấu gạch chéo \ và số lượng CPU được thêm vào cuối cùng của tên thread.
------------------------------------------------------
Link bài trước:https://www.facebook.com/groups/259967441230713/permalink/303281890232601/

Các comment hay:

1. Nguyễn Tiến Đạt Cảm ơn bạn đã nhiệt tình chia sẻ những hiểu biết của mình cho mọi người. Mình thấy rằng bài viết của bạn khá đầy đủ, chi tiết. Mình chỉ góp ý như sau:
1. Đối với phần trình bày về không gian địa chỉ, mình có bổ sung thêm thế này:
--> không gian địa chỉ (memory address space) là gì? Đó là dải các số được dùng để đánh địa chỉ cho các lệnh, hoặc dữ liệu của chương trình. Sau khi biên dịch, các lệnh và hầu hết các dữ liệu đều đã có địa chỉ xác định.
--> hiện nay, đa số các hệ điều hành sử dụng cơ chế virtual memory để quản lý bộ nhớ. Nhưng vẫn còn một số hệ điều hành không dùng virtual memory, ví dụ uCLinux.
--> nếu hệ điều hành sử dụng cơ chế chế virutal memory để quản lý bộ nhớ, thì kích thước của memory address space không phụ thuộc vào kích thước RAM, nhưng lại phụ thuộc vào kích thước của thanh ghi PC. Nếu thanh ghi PC rộng 32 bit, thì không gian địa chỉ là 2^32 = 4GB. Giá trị trong thanh ghi PC chính là địa chỉ ảo (virtual address). Trong quá trình lấy lệnh, CPU phát địa chỉ này tới bộ MMU. Bộ MMU sẽ dịch địa chỉ này sang địa thật trên RAM (Physical address). Nhiệm vụ của hệ điều hành là:
- cấu hình bộ MMU này để nó dịch cho đúng.
- nếu MMU không dịch được thì sẽ kernel sẽ quyết định phải làm gì tiếp theo.
2. Đối với phần trình bày về cấp độ ưu tiên, chỗ này mình thấy bạn đang cố gắng diễn đạt khái niệm user mode/kernel mode, khái niệm process context/interrupt context. Nhưng mình nghĩ là người mới đọc sẽ không hiểu lắm, theo mình nên diễn đạt như sau:
---> user mode hay kernel mode là các chế độ thực thi của bộ xử lý. Trong bộ xử lý x86, user mode gọi là ring0, kernel mode gọi là ring3. Nếu bộ xử lý đang thực thi các lệnh trong chế độ user mode thì:
+ không phải lệnh nào CPU cũng sẽ chấp nhận thực hiện (ví dụ nếu CPU gặp phải lệnh LGDT hoặc LLDT hoặc HLT... thì CPU sẽ không thực hiện, mà CPU sẽ chuyển sang thực hiện lệnh của kernel để xử lý lỗi này).
+ CPU sẽ không sử dụng tất cả các thanh ghi của nó để thực hiện công việc (ví dụ thanh ghi GDTR).
+ CPU chỉ được phép phát ra các địa chỉ thuộc vùng user space. Nếu phát hiện hiện ra địa chỉ của lệnh/dữ liệu thuộc vùng kernel space thì CPU sẽ dừng hoạt động, tự động chuyển sang thực hiện các lệnh của kernel để xử lý lỗi này.

***Liên tưởng: bạn là CPU, khi bạn thực hiện các công việc mà bố mẹ bạn giao cho, bạn sẽ làm hết sức. Lúc này ta nói bạn đang làm việc ở chế độ kernel mode. Khi bạn thực hiện các công việc của công ty giao, bạn chỉ làm qua loa thôi, lúc này ta nói bạn đang làm ở chế độ user mode

---> khi nào CPU chuyển sang kernel mode?
+ một là khi user process muốn sử dụng một dịch vụ của kernel (như đọc/ghi file, cấp phát bộ nhớ...) thì user process sẽ phát ra một system call để thông báo cho hệ điều hành biết tao đang cần cái này. Khi đó, CPU sẽ chuyển sang thực thi ở chế độ kernel mode. Vì nguyên nhân chuyển vào kernel mode là do process, nên ta nói CPU đang thực thi trong ngữ cảnh process context.
+ hai là, khi có các I/O controller gửi tín hiệu ngắt tới CPU (chính xác là I/O controller gửi tín hiệu tới Interrupt Controller, Interrupt Controller gửi tín hiệu ngắt tới chân INTR của CPU) thì CPU sẽ tạm dừng công việc hiện tại lại, chuyển chế độ thực thi của nó sang chế độ kernel mode. Vì nguyên nhân chuyển vào kernel mode là do interrupt, nên ta nói CPU đang thực thi ở ngữ cảnh interrupt context.

** Nếu bạn muốn viết các nội dung đặt biệt thì hãy làm theo hướng dẫn sau

Xem thêm 10 bình luận
Viết blog mới của bạn
Báo lỗi trang
Đang tải