2010-03-15 25 views
17

Khi nói 3 chương trình (thực thi) được nạp vào bộ nhớ cách bố trí có thể trông như thế này:Bộ nhớ ảo hạt nhân của mỗi quá trình có chứa gì?

alt text http://img97.imageshack.us/img97/3460/processesm.jpg

tôi câu hỏi sau:

  1. là khái niệm của Virtual Memory giới hạn cho quy trình người dùng? Bởi vì, tôi tự hỏi đâu là hệ điều hành Kernel, Trình điều khiển sống? Bố cục bộ nhớ của nó như thế nào? Tôi muốn biết thêm về bộ nhớ bên nhân. Tôi biết hệ điều hành của nó cụ thể làm cho bạn lựa chọn (windows/linux).

  2. Khái niệm về bộ nhớ ảo trên mỗi cơ sở quy trình? Tôi có nghĩa là nó chính xác cho tôi để nói 4GB của process1 + 4GB của process2 + 4GB của process3 = 12GB bộ nhớ ảo (cho tất cả các quá trình). Điều này không đúng. Hoặc từ tổng số 4GB không gian 1GB được lấy bởi hạt nhân & phần còn lại 3GB được chia sẻ b/w tất cả các quy trình.

  3. Họ nói, trên máy 32 bit trong không gian địa chỉ 4GB. Một nửa của nó (hoặc gần đây hơn 1GB) bị hạt nhân chiếm đóng. Tôi có thể thấy trong biểu đồ này rằng "Kernel Virtual memory" đang chiếm 0xc0000000 - 0xffffffff (= 1 GB). Họ đang nói về điều này? Hay nó là cái gì khác? Chỉ muốn xác nhận.

  4. Điều gì chính xác hiện Kernel Virtual Memory của mỗi quy trình này có chứa không? Bố cục của nó là gì?

  5. Khi chúng tôi thực hiện IPC, chúng tôi nói về bộ nhớ dùng chung. Tôi không thấy bất kỳ bộ nhớ nào được chia sẻ giữa các quá trình này. Nó sống ở đâu?

  6. Tài nguyên (tệp, đăng ký trong cửa sổ) là toàn cầu cho tất cả các quy trình. Vì vậy, bảng điều khiển tài nguyên/tệp phải nằm trong một số không gian chung. Khu vực nào sẽ ở trong đó?

  7. Tôi có thể biết thêm về nội dung hạt nhân này ở đâu.

Trả lời

19
  1. Khi một hệ thống sử dụng bộ nhớ ảo, hạt nhân sử dụng bộ nhớ ảo là tốt. Windows sẽ sử dụng 2GB trên (hoặc 1GB nếu bạn đã chỉ định khóa chuyển đổi/3GB trong bộ nạp khởi động Windows) để sử dụng riêng. Điều này bao gồm mã hạt nhân, dữ liệu (hoặc ít nhất là dữ liệu được phân trang trong - đó là đúng, Windows có thể trang ra các phần của không gian địa chỉ hạt nhân vào đĩa cứng) và các bảng trang.

  2. Mỗi quy trình có không gian địa chỉ VM riêng. Khi một quá trình chuyển đổi xảy ra, các bảng trang thường được hoán đổi với bảng trang của quy trình khác. Việc này đơn giản để thực hiện trên bộ xử lý x86 - việc thay đổi địa chỉ cơ sở bảng trang trong thanh ghi điều khiển CR3 sẽ đủ. Toàn bộ không gian địa chỉ 4GB được thay thế bằng các bảng thay thế một không gian địa chỉ 4GB hoàn toàn khác. Có nói rằng, thông thường sẽ có khu vực của không gian địa chỉ được chia sẻ giữa các quá trình. Các vùng đó được đánh dấu trong các bảng trang có các cờ đặc biệt chỉ ra cho bộ vi xử lý rằng các vùng đó không cần phải bị vô hiệu trong bộ xử lý translation lookaside buffer.

  3. Như tôi đã đề cập trước đó, mã của hạt nhân, dữ liệu và bảng trang của chính chúng cần được đặt ở đâu đó. Thông tin này nằm trong không gian địa chỉ hạt nhân. Có thể một số phần của mã, dữ liệu và bảng trang của hạt nhân có thể tự được hoán đổi ra đĩa nếu cần.Một số phần được coi là quan trọng hơn những phần khác và không bao giờ được hoán đổi.

  4. Xem (3)

  5. Tùy theo. Bộ nhớ chia sẻ chế độ người dùng được đặt trong không gian địa chỉ chế độ người dùng. Các phần của không gian địa chỉ chế độ hạt nhân có thể được chia sẻ rất tốt giữa các quá trình. Ví dụ, sẽ không có gì lạ khi mã của hạt nhân được chia sẻ giữa tất cả các tiến trình trong hệ thống. Vị trí bộ nhớ đó không chính xác. Tôi đang sử dụng các địa chỉ tùy ý ở đây, nhưng bộ nhớ dùng chung nằm ở số 0x100000 trong một quá trình có thể được đặt tại 0x101000 bên trong một quy trình khác. Hai trang trong không gian địa chỉ khác nhau, tại địa chỉ hoàn toàn khác nhau, có thể trỏ đến cùng một bộ nhớ vật lý.

  6. Tôi không chắc chắn ý của bạn ở đây. Các trình xử lý tệp mở không phải là toàn cầu đối với tất cả các quy trình. Hệ thống tệp được lưu trữ trên đĩa cứng là toàn cầu cho tất cả các quy trình. Trong Windows, các tệp xử lý được nhân quản lý quản lý và các đối tượng được lưu trữ trong không gian địa chỉ hạt nhân và được quản lý bởi trình quản lý đối tượng hạt nhân.

  7. Đối với hệ thống dựa trên Windows NT, tôi khuyên bạn nên Windows Internals, 5ed bởi Mark Russinovich và David Solomon

đáp ứng để bình luận:

Và bây giờ 3GB này được chia sẻ b/w tất cả quy trình? hoặc mỗi quy trình có không gian 4GB ?

Nó phụ thuộc vào hệ điều hành. Một số hạt nhân (chẳng hạn như L4 microkernel) sử dụng cùng một bảng trang cho nhiều quy trình và tách biệt các không gian địa chỉ bằng cách sử dụng segmentation. Trên Windows, mỗi quá trình đều có các bảng trang của riêng nó. Hãy nhớ rằng mặc dù mỗi quá trình có thể có một không gian địa chỉ ảo ảo riêng, điều đó không có nghĩa là bộ nhớ vật lý luôn khác nhau. Ví dụ, hình ảnh cho kernel32.dll được nạp trong tiến trình A được chia sẻ với kernel32.dll trong tiến trình B. Phần lớn không gian địa chỉ hạt nhân cũng được chia sẻ giữa các tiến trình.

Tại sao mỗi quá trình có bộ nhớ ảo hạt nhân?

Cách tốt nhất để nghĩ về điều này là tự hỏi "Hạt nhân hoạt động như thế nào nếu nó không thực thi bằng bộ nhớ ảo?" Trong tình huống giả định này, mỗi khi chương trình của bạn gây ra sự chuyển đổi ngữ cảnh thành hạt nhân (giả sử bạn thực hiện cuộc gọi hệ thống), bộ nhớ ảo sẽ bị vô hiệu hóa trong khi CPU đang thực thi trong không gian hạt nhân. Có một chi phí để làm điều đó và có một chi phí để chuyển nó trở lại khi bạn chuyển trở lại không gian người dùng.

Hơn nữa, giả sử rằng chương trình người dùng được chuyển vào con trỏ đến một số dữ liệu cho cuộc gọi hệ thống của nó. Con trỏ này là một địa chỉ ảo. Bạn đã tắt bộ nhớ ảo, do đó con trỏ cần được dịch sang địa chỉ vật lý trước khi hạt nhân có thể làm bất cứ điều gì với nó. Nếu bạn đã bật bộ nhớ ảo, bạn sẽ nhận được điều đó miễn phí nhờ bộ nhớ quản lý bộ nhớ trên CPU. Thay vào đó, bạn phải dịch thủ công địa chỉ trong phần mềm. Có tất cả các loại ví dụ và kịch bản mà tôi có thể mô tả (một số liên quan đến phần cứng, một số liên quan đến việc bảo trì bảng trang, vv) nhưng ý chính của nó là dễ dàng hơn để có một lược đồ quản lý bộ nhớ đồng nhất. Nếu không gian người dùng đang sử dụng bộ nhớ ảo, sẽ dễ dàng hơn khi viết kernel nếu bạn duy trì sơ đồ đó trong không gian hạt nhân.Ít nhất đó là kinh nghiệm của tôi.

sẽ chỉ có một instnace của OS hạt nhân phải không? thì tại sao mỗi quá trình lại có không gian ảo hạt nhân riêng biệt?

Như tôi đã đề cập ở trên, một chút không gian địa chỉ đó sẽ được chia sẻ giữa các quy trình. Có một quá trình dữ liệu trong không gian hạt nhân được hoán đổi trong khi chuyển đổi ngữ cảnh giữa các tiến trình, nhưng rất nhiều dữ liệu được chia sẻ bởi vì chỉ có một hạt nhân.

+1

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

0

Để 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ác vấn đề liên quan