Để trả lời câu hỏi của bạn, bạn cần hiểu thêm về Kernel và các kỹ thuật mà nó sử dụng để quản lý tài nguyên (CPU, bộ nhớ, ...) và cung cấp sự trừu tượng thanh lịch cho các chương trình Ứng dụng.
Trước hết tôi muốn làm rõ rằng 'Bộ nhớ ảo' là kỹ thuật quản lý bộ nhớ được sử dụng bởi hệ điều hành hiện đại; cung cấp các lợi ích khác nhau như quá trình cô lập, ở đó bằng cách bảo vệ, cho phép nhiều chương trình chạy cùng nhau, cho phép các chương trình có kích thước lớn hơn bộ nhớ vật lý hiện diện trong hệ thống. Theo kỹ thuật này, một lần nữa có hai thuật ngữ 'Bộ nhớ ảo' và 'Không gian địa chỉ ảo'; không giống nhau nhưng vẫn liên quan chặt chẽ. (Bạn sẽ tự hỏi làm thế nào là bộ nhớ ảo là cả một kỹ thuật cũng như một khái niệm dưới nó, nhưng có nghĩa là chính xác và bạn sẽ hiểu rằng bên dưới)
Trong khoa học máy tính, từ 'nhớ' đã 2 ý nghĩa. Đầu tiên, là cho một cái gì đó mà bạn có thể sử dụng để lưu trữ dữ liệu (sổ đăng ký, bộ nhớ cache, RAM, ROM, HDD, vv). Thứ hai, là dành cho đồng nghĩa với bộ nhớ chính (ví dụ: RAM). Khi bạn thay thế từng từ, 'Ảo Bộ nhớ' không là gì ngoài 'Virtual RAM'. Đó là tổng dung lượng có sẵn tại mọi thời điểm trong hệ thống, trong đó các chương trình được tải để thực thi. Vì vậy, điều này là không có gì nhưng bộ nhớ RAM vật lý + bộ nhớ trao đổi trên lưu trữ thứ cấp được phân bổ bởi hạt nhân. Vì vậy, nếu bạn có 2GB bộ nhớ RAM và 4 GB không gian hoán đổi dành riêng cho nhân viên tại thời điểm cài đặt, thì bộ nhớ ảo của hệ thống của bạn là 6GB. Tôi sẽ không giải thích thêm về bộ nhớ trao đổi ở đây, vì điều này sẽ đi chệch hướng nhiều hơn từ chủ đề.
Chuyển sang không gian địa chỉ ảo. Vì vậy, để hiểu điều này bạn cần phải điều chỉnh tâm trí của bạn một chút. Như tên chính nó "ảo" nói, không gian địa chỉ không có trong thực tế! Đây chỉ là một ảo tưởng được tạo ra bởi hạt nhân cho các lập trình viên ứng dụng (để đạt được nhiều lợi ích như tôi đã đề cập trong đoạn 2) Vì vậy, mỗi quá trình được đưa ra một không gian địa chỉ ảo riêng biệt bởi hạt nhân. (Nếu không có hạt nhân trong hệ thống và bạn đã chạy chương trình ứng dụng của bạn trên phần cứng thì nó sẽ sử dụng không gian địa chỉ vật lý, nghĩa là RAM làm không gian địa chỉ) Vì vậy trên máy có đăng ký địa chỉ 32 bit, hạt nhân có thể cung cấp một không gian địa chỉ ảo 2^32 = 4GB cho mỗi quá trình. Bộ vi xử lý mới nhất có 48 thanh ghi địa chỉ bit để chúng có thể cung cấp không gian địa chỉ ảo là 2^48 = 256TB) Và điều quan trọng là không gian địa chỉ ảo này chỉ trong không khí !! Bạn sẽ nghĩ ngay bây giờ, nếu nó chỉ là trong không khí, làm thế nào có thể mã, dữ liệu của quá trình được thực hiện ngay cả. Có, điều này cần phải được ánh xạ tới bộ nhớ vật lý. Làm thế nào nó được ánh xạ với bộ nhớ vật lý được quản lý bởi hạt nhân bằng cách sử dụng khái niệm gọi là phân trang. Vì vậy, bây giờ bạn có thể thấy hạt nhân đã đạt được cách ly quá trình bằng cách sử dụng không gian địa chỉ ảo.Vì vậy, địa chỉ mà mỗi quá trình có thể tạo ra là từ 0 đến 4GB (giả sử hệ thống có đăng ký địa chỉ 32 bit vì lợi ích đơn giản), vì vậy đó là toàn bộ. Và nó không biết gì về bất kỳ quá trình nào khác đang chạy trong hệ thống. Vì vậy, nó giống như mỗi quá trình được đóng gói trong một không gian riêng biệt.
Vì vậy, mã hạt nhân cũng giống như một quy trình/thực thể khác. Vì vậy, nếu hạt nhân được cư trú trong một không gian địa chỉ hoàn toàn khác nhau. Sau đó, không có phương tiện cho một chương trình ứng dụng tương tác với hạt nhân. Nếu ứng dụng không thể giao tiếp với hạt nhân và hạt nhân không thể giao tiếp với ứng dụng thì không có tính hữu dụng của nhân để thúc đẩy hệ thống. Vì vậy, câu hỏi bây giờ là - Làm thế nào để làm cho các quy trình ứng dụng tương tác với hạt nhân? Một tùy chọn sẽ là - Nếu mã hạt nhân có mặt trong không gian địa chỉ ảo của quy trình ứng dụng thì chúng có thể tương tác với nhau. Đó là lý do tại sao mã nhân có mặt trong mỗi không gian địa chỉ ảo của quá trình bởi vì mọi tiến trình cần giao tiếp với hạt nhân. Đừng lo lắng mã hạt nhân không phải là vật lý nhân đôi cho mỗi quá trình. Như tôi đã đề cập trước đó, VAS chỉ là một ảo ảnh, do đó sẽ chỉ có một bản sao mã nhân có trong bộ nhớ vật lý và nó sẽ được tham chiếu bởi tất cả các không gian địa chỉ ảo (thông qua phân trang). Trong trường hợp của Linux, hạt nhân sẽ được đặt trên không gian địa chỉ trên giữa C000 0000 đến FFFF FFFF (tức là lý do 1GB dành riêng cho hạt nhân trong VAS) và phần còn lại 3GB (từ 0000 0000 đến BFFF FFFF) được phép cho chương trình ứng dụng để sử dụng. Vùng địa chỉ ảo nơi kernel cư trú được gọi là không gian hạt nhân và nơi chương trình ứng dụng cư trú được gọi là không gian người dùng. Nếu bạn đã quan sát cẩn thận, thì bạn sẽ nảy ra câu hỏi rằng nếu cả mã ứng dụng và mã nhân đều nằm trong cùng một không gian địa chỉ ảo, và vì hạt nhân nằm ở vị trí địa chỉ được xác định trước thì có phải không có thể cho mã ứng dụng để làm hỏng mã hạt nhân! Rất tiếc, lúc đầu có vẻ như có thể, nhưng không thể. Lý do là - điều này được bảo vệ bằng cách sử dụng sự trợ giúp của HW. Sẽ có cờ trên bộ vi xử lý cho biết chế độ thực hiện là MODERVISOR MODE hay USER MODE. Mã không gian hạt nhân nên thực thi trong MODERVISOR MODE (thiết lập cờ phù hợp) và mã vùng người dùng nên thực hiện trong USER MODE. Vì vậy, nếu bạn đang ở trong chế độ NGƯỜI DÙNG và cố gắng truy cập/sửa đổi mã trong không gian hạt nhân thì một ngoại lệ được ném! (bộ vi xử lý sẽ biết nó dựa trên địa chỉ mà lệnh đang cố gắng truy cập. Nếu nó cao hơn C000 0000 thì có thể dễ dàng phát hiện nó đang cố gắng truy cập vào mã không gian hạt nhân và chế độ thực thi hiện tại không có sự cho phép thích hợp, vì cờ được đặt với quyền MODE USER). Chỉ cần lưu ý: Trong chế độ SUPERVISOR, bộ xử lý cung cấp quyền truy cập vào bộ tập lệnh bổ sung.
Tôi hy vọng nếu bạn hiểu khái niệm này, bạn có thể tự trả lời cho câu hỏi của mình. Tôi đã trả lời trực tiếp cho nhiều câu hỏi của bạn trong khi giải thích khái niệm đó.
Cảm ơn bạn đã phản hồi. Nhưng somehonw tôi vẫn chưa rõ. Đặc biệt là về phân chia bộ nhớ giữa các tiến trình hạt nhân và người dùng. Nó giống như tổng số không gian 4GB chia b/w hạt nhân (1GB) và phần còn lại 3GB cho quá trình người dùng. Và bây giờ 3GB này được chia sẻ b/w tất cả các quy trình? hoặc mỗi quy trình có dung lượng 4GB? Tại sao mỗi tiến trình có bộ nhớ virut nhân? sẽ chỉ có một instace của hạt nhân OS phải không? thì tại sao mỗi tiến trình lại có không gian ảo hạt nhân riêng biệt. – claws