2012-01-29 62 views
5

trong Hệ điều hành Không gian địa chỉ ảo của ứng dụng chế độ người dùng là riêng tư, một ứng dụng không thể thay đổi dữ liệu thuộc về ứng dụng khác. Mỗi ứng dụng chạy trong sự cô lập và nếu một ứng dụng gặp sự cố, sự cố sẽ bị giới hạn ở một ứng dụng đó. Các ứng dụng khác và hệ điều hành không bị ảnh hưởng bởi sự cốchế độ hạt nhân và bảo vệ bộ nhớ

lý do tại sao chế độ lõi hệ điều hành không bảo vệ bộ nhớ và BOSD xảy ra ??

+0

lý do tại sao nó trở thành chủ đề? –

+0

Điều này nghe giống như một câu hỏi osdev trên chủ đề với tôi ... – bdonlan

Trả lời

8

Trước tiên, ở một mức độ nào đó, bạn sẽ luôn có một thành phần không thể Fail ™. Nếu thành phần này gặp sự cố, không thể khôi phục được. Ví dụ, nếu bạn thùng rác bảng chạy các tiến trình, bạn không thể xây dựng lại nó ngoài việc khởi động lại. Vì vậy, ngay cả với bảo vệ bộ nhớ hạn chế sự cố của thành phần này chỉ ảnh hưởng đến chính nó, BSOD (hoặc tương đương) có thể xảy ra.

Nhưng điểm của bạn là một điểm tốt - có một số thành phần thường có thể có thể được đặt lại mà không có sự cố thảm khốc. Trình điều khiển, ví dụ, hoặc ngăn xếp mạng. Thật vậy, có những hệ điều hành bảo vệ ở cấp độ này - chúng được gọi là microkernel architectures.

Tuy nhiên, vấn đề với vi mạch là hiệu suất. Khi bảo vệ bộ nhớ CPU x86 đạt được với hai thứ - Current Privilege Level (CPL, hoặc 'ring'), một số giữa 0 (truy cập tối đa) và 3 (chế độ người dùng) và Page Table. Bảng trang ánh xạ các địa chỉ ảo đến các địa chỉ vật lý và đặt giới hạn truy cập trên mỗi trang (khối bộ nhớ 4096 byte). Mỗi quá trình có bảng trang riêng và mỗi trang trong bảng trang có thể bị hạn chế bằng cách đặt CPL tối đa, cờ chỉ đọc, cờ không thực thi hoặc cờ không truy cập.

Thay đổi CPL của bạn là một hoạt động tương đối nhanh (mặc dù có những hạn chế bảo mật trên như thế nào và khi bạn được phép làm như vậy). Thay đổi bảng trang, tuy nhiên, là khá tốn kém, vì nó yêu cầu xóa bộ nhớ cache trên CPU được gọi là Translation Lookaside Buffer (TLB).

Thông thường trong một hệ điều hành bình thường, hệ điều hành sẽ bảo lưu X GB thấp nhất của bộ nhớ cho các tiến trình người dùng (3GB thường là số lựa chọn cho các kiến ​​trúc 32-bit). Phía trên (4 - X) GB được ánh xạ trực tiếp tới bộ nhớ vật lý đầu tiên (4 - X) GB và chỉ giới hạn ở CPL 0 ('ring 0'). Do đó, hạt nhân có thể đặt các cơ sở dữ liệu riêng của mình trong 1GB trên hoặc hơn và luôn truy cập chúng tại cùng một địa chỉ ảo, bất kể quá trình đang chạy là gì. Nếu một quá trình tạo một syscall yêu cầu nửa tá hệ thống con để làm điều gì đó, không vấn đề gì - bạn chỉ có thể gọi các hàm giữa chúng.

Tuy nhiên, trong hệ thống microkernel, mỗi hệ thống con hạt nhân sẽ có bảng trang của riêng nó và ánh xạ địa chỉ của riêng nó. Để phục vụ cuộc gọi của người dùng, CPU có thể cần phải thực hiện một vài thay đổi bảng trang và hiệu suất này tăng lên. Hơn nữa, mỗi hệ thống con cần phải được chuẩn bị để đối phó với thất bại của các phụ thuộc của nó, làm tăng sự phức tạp của hệ thống. Vì những vấn đề này, vi mô, lớn và nhỏ, chỉ được sử dụng làm hệ điều hành và đồ chơi (ví dụ: minix, GNU HURD).

Điều đó nói rằng, trong những năm gần đây, đã có một số mờ ranh giới giữa vĩ mô và vi hạt nhân. Ví dụ, trong Windows 7, trình điều khiển đồ họa trên thực tế được phân lập từ phần còn lại của hạt nhân; nếu nó bị treo, hệ thống có thể phục hồi. Trong Linux và OS X, FUSE có thể tải các trình điều khiển hệ thống tập tin trong không gian người dùng; trình điều khiển NTFS trên các hệ thống này, trên thực tế, sử dụng cơ chế này.

+0

cảm ơn bạn bdonlan.but câu hỏi của tôi là simple.i muốn biết "tại sao hệ điều hành không cô lập bộ nhớ (cho mỗi thành phần và KMD) trong chế độ hạt nhân ?? –

+0

@AS, tôi đã giải thích điều đó. Microkernels làm trong thực tế cô lập bộ nhớ. Chúng chỉ chậm vì điều đó. – bdonlan