User Mode và Kernel Mode trong lập trình hệ thống

Trong bài trước tôi đã giới thiệu với các bạn những kiến thức cơ bản về các thành phần chính của Windows OS. Bạn có thể tham khảo trước tại đây. Trong bài này, tôi xin trình bày về hai chế độ User Mode và Kernel Mode trong Windows OS.

User mode and kernel mode

Một bộ vi xử lý khi chạy Windows OS sẽ có hai chế độ khác nhau được gọi là: User Mode và Kernel Mode. Các chương trình (applications) thường chạy trên User Mode, còn các thành phần lõi của hệ điều hành sẽ chạy ở Kernel Mode.

Thường thì khái niệm Driver dùng cho những chương trình chạy tại Kernel Mode, nhưng cũng có một vài Driver chạy trên User Mode.

Hình minh họa phía dưới mô phỏng sự kết nối giữa các thành phần ở User Mode và Kernel Mode

Hiểu về User Mode và Kernel Mode

Khi viết các ứng dụng chạy trên Windows, Microsoft cung cấp các hàm lập trình ứng dụng (Windows applications programming interface – Win API) để lập trình viên sử dụng. Với việc sử dụng các Windows API, bạn sẽ phát triển được các ứng dụng hoạt động ổn định trên tất cả các phiên bản của Windows.

Các Windows API này có thể giao tiếp với các UserMode Drivers để thực hiện một số nhiệm vụ nhất định trên UserMode. Ngoài ra, Microsoft cũng hỗ trợ các Native API (thực chất cũng là các Windows API, nhưng được cung cấp bởi một subsystem module như Kernel32.dll hoăc NTDLL.dll). Đó là một cơ chế cho phép chương trình ở UserMode có thể gọi các chương trình con (a subroutine) thực thi ở KernelMode. Ví dụ: DbgPrint function…

Ở KernelMode, sẽ có một cơ chế phục vụ những yêu cầu từ ứng dụng trên UserMode và tương tác với các thiết bị (device) theo một cách nào đó. Cơ chế này đảm bảo cho việc các tham số sử dụng đều là hợp lệ, và đảm bảo việc không cho phép xử lý tới vùng dữ liệu hoặc địa chỉ mà chương trình ở UserMode không được phép thao tác tới.

User mode

Khi một chương trình khởi tạo trên User Mode, Windows sẽ tạo một tiến trình (process) cho chương trình đó. Một tiến trình cung cấp cho chương trình đó một không gian địa chỉ ảo (Virtual address space). Bởi vì mỗi không gian  địa chỉ ảo của mỗi tiến trình là riêng biệt, nên một chương trình khó hay còn có thể nói là không thể thay đổi dữ liệu thuộc về một chương trình khác.

Do mỗi chương trình chạy một cách cô lập như vậy, nên nếu một chương trình bị đổ vỡ (crash), thì sự đổ vỡ này sẽ được giới hạn trong chương trình đó. Những chương trình khác và hệ điều hành sẽ không bị ảnh hưởng bởi sự đổ vỡ này.

Kernel mode

Không gian địa chỉ ảo của mỗi tiến trình ở User Mode bị giới hạn. Một chương trình chạy tại User Mode sẽ không xử lý được những địa chỉ ảo (Vrtual address) được dự trữ để sử dụng bởi hệ điều hành. Sự giới hạn không gian địa chỉ nhằm bảo vệ những chương trình khỏi việc xử lý nhầm vào những vùng dữ liệu quan trọng, có thể gây hại tới hệ điều hành.

Tất cả đoạn mã được viết ở Kernel Mode chia sẻ một không gian địa chỉ duy nhất. Điều đó có nghĩa một kernel-mode driver sẽ không bị cô lập với những driver khác và bản thân hệ điều hành. Nếu một kernel mode driver ghi nhầm địa chỉ hoặc dữ liệu thuộc về hệ điều hành hoặc một driver khác thì những chương trình này sẽ bị tổn hại. Khi đó, việc xử lý sai này có thể khiến driver đó bị crash. Mà khi một driver bị crash ở Kernel Mode thì có thể dẫn tới toàn bộ hệ điều hành bị crash. Khi đó máy tính của bạn sẽ xảy ra hiện tượng bị treo hoặc xuất hiện màn hình xanh (Blue Screen of Death – BSoD).

Ở phần này, tôi xin phép được nói về khái niệm cơ bản của Kernel Mode và User Mode, trong đó có một khái niệm được nhắc tới nhiều là không gian địa chỉ ảo (Virtual Address Space). Trong bài tiếp theo, tôi sẽ đi vào trình bày chi tiết về Virtual Address Space cũng như đi sâu  hơn vào User Mode và Kernel để các bạn thấy được Windows sử dụng hai chế độ này với mỗi chương trình có sự khác biệt như thế nào.


Bình luận

Từ khóa: