Nhân hệ điều hành

Nhân hệ điều hành "(tiếng Anh: Kernel)" là một chương trình máy tính, là thành phần trung tâm và không thể thiếu của các hệ điều hành máy tính, kiểm soát hoàn toàn mọi thứ trong hệ thống. Nó là "phần của mã hệ điều hành luôn thường trú trong bộ nhớ" có nhiệm vụ quản lý các tài nguyên hệ thống (liên lạc giữa các thành phần phần cứng và phần mềm). Trong phần lớn các hệ thống, nó là chương trình đầu tiên được nạp vào trong quá trình khởi động máy tính (sau bootloader). Nó xử lý phần còn lại của khởi động cũng như các yêu cầu vào/ra từ phần mềm, chuyển chúng thành hướng dẫn xử lý dữ liệu cho CPU. Nó quản lý bộ nhớ và các thiết bị ngoại vi như: bàn phím, màn hình, máy in, và loa. Nhân hệ điều hành thường cung cấp các tiện ích xử lý này cho các tiến trình của các phần mềm ứng dụng qua các cơ chế liên lạc giữa các tiến trình ("inter-process communication") và các lời gọi hệ thống ("system call").
Các nhân khác nhau thực hiện các tác vụ của hệ điều hành theo các cách khác nhau, tùy theo thiết kế và cài đặt. Các nhân kiểu nguyên khối ("monolithic kernel") thực hiện các nhiệm vụ của mình bằng cách thực thi toàn bộ mã hệ điều hành trong cùng một địa chỉ bộ nhớ để tăng hiệu năng hệ thống. Trong khi đó các nhân loại nhỏ ("microkernel") chạy hầu hết các dịch vụ tại không gian người dùng ("user space") với mục đích tăng khả năng bảo trì và tính mô đun của hệ điều hành. Có nhiều thiết kế nằm ở giữa hai thái cực này ví dụ như ("hybrid kernel") là nhân tự động phân luồng.
Mã lệnh quan trọng của hạt nhân thường được tải vào một vùng bộ nhớ riêng biệt, vùng này được bảo vệ khỏi sự truy cập của các chương trình ứng dụng hoặc các phần khác ít quan trọng hơn của hệ điều hành. Kernel thực hiện các nhiệm vụ của nó, chẳng hạn như chạy các tiến trình, quản lý các thiết bị phần cứng như đĩa cứng và xử lý các ngắt, trong kernel space được bảo vệ này. Ngược lại, các chương trình ứng dụng như trình duyệt, trình xử lý văn bản hoặc trình phát âm thanh hoặc video sử dụng một vùng bộ nhớ, không gian người dùng riêng biệt. Sự tách biệt này ngăn không cho dữ liệu của người dùng và dữ liệu hạt nhân can thiệp với nhau và gây ra sự mất ổn định và chậm chạp, cũng như ngăn chặn các chương trình ứng dụng bị trục trặc làm hỏng toàn bộ hệ điều hành.
Giao diện của hạt nhân là một lớp trừu tượng mức thấp. Khi một tiến trình yêu cầu một dịch vụ tới hạt nhân, nó phải gửi một lời gọi hệ thống, thường là thông qua một hàm wrapper giao tiếp với các ứng dụng không gian người dùng bởi các thư viện hợp ngữ nhúng để truy nhập hạt nhân sau khi tải các thanh ghi CPU với số syscall và các tham số của nó (ví dụ: hệ điều hành tương tự UNIX thực hiện nhiệm vụ này bằng cách sử dụng thư viện chuẩn C).
Có các thiết kế kiến trúc nhân khác nhau. Hạt nhân monolithic chạy hoàn toàn trong một không gian địa chỉ duy nhất với CPU thực thi ở chế độ giám sát, tập trung vào hiệu năng. Microkernels chạy hầu hết các dịch vụ tại không gian người dùng ("user space") với mục đích tăng khả năng bảo trì và tính mô đun của hệ điều hành. MINIX 3 là một ví dụ đáng chú ý về thiết kế microkernel. Thay vào đó, nhân Linux là monolithic, mặc dù nó cũng là mô-đun, vì nó có thể chèn và loại bỏ các mô-đun nhân có thể tải được trong runtime.
Thành phần trung tâm này của hệ thống máy tính có nhiệm vụ "chạy" hoặc "thực thi" các chương trình. Kernel chịu trách nhiệm quyết định bất kỳ lúc nào trong số nhiều chương trình đang chạy sẽ được cấp phát cho bộ xử lý hoặc các bộ xử lý.
Khái quát chung.
Trong một định nghĩa về 'nhân hệ điều hành' Jochen Liedtke đã tuyên bố rằng "sử dụng thường xuyên để biểu thị cho một phần của hệ điều hành có tính bắt buộc và chia sẻ với tất cả các phần mềm khác."
Hầu hết các hệ điều hành đều dựa trên cơ sở là nhân. Sự tồn tại của nhân hệ điều hành là hệ quả tất yếu của việc thiết kế hệ thống máy tính thành một chuỗi các tầng trừu tượng để phù hợp trong các tiến trình xử lý công việc trên máy tính được đơn giản hóa (đối với con người) nhưng dần phức tạp hóa (đối với máy tính). Ở mỗi tầng trừu tượng ở cấp phức tạp thấp hơn (đối với máy tính) lại dựa vào các chức năng của chính các tầng ngay trên chúng (các tầng phức tạp lớn hơn đối với máy tính) để xử lý. Nhân hệ điều hành dưới một khía cạnh nào đó là một cái tên đơn giản biếu thị cho tầng trừu tượng ở mức thấp nhất được xử lý trong các phần mềm trước khi đi qua trình biên dịch ngôn ngữ assembly sang ngôn ngữ máy và đưa đến phần cứng của máy tính để thi hành. 
Trong một số loại phần mềm nhằm tránh sự sử dụng nhân hệ điều hành hoặc bỏ qua nhân hệ điều hành để đưa trực tiếp đến thi hành phần cứng, người ta sẽ thiết kế toàn bộ phần mềm trong một hệ thống mà không sử dụng đến các tầng trừu tượng (có thể hiểu là tầng trừu tượng ở mức thấp tương đương với nhân nên bỏ qua nhân); điều này sẽ làm gia tăng sự phức tạp của việc thiết kế, lập trình ra phần mềm. Việc thiết kế phần mềm bỏ qua nhân này được ví như tạo ra một hệ thống đơn giản nhất (đối với máy tính) có tính khả thi cao và có thể thực thi các phần mềm.
Trong khi được biết đến với cái tên phổ biến "nhân hệ điều hành", những cách gọi mới mẻ cho bộ phần tương tự của hệ thống máy tính được biết đến như hạt nhân - nucleus hay là lõi - core, (Chú ý rằng, bất cứ khi nào từ "core" cũng được sử dụng có liên quan tới bộ nhớ chính của hệ thống máy tính, bởi vì các máy tính ra đời trước sử dụng một dạng của bộ nhớ được gọi là core memory), và được hình thành một cách sáng tạo như những vùng chỉ chứa những yếu tố cần thiết, cốt lõi của một hệ điều hành.
Trong hầu hết các trường hợp, boot loader bắt đầu thực thi nhân hệ điều hành trong supervisor mode, Nhân hệ điều hành sau đó được nạp phần đầu của nó và thi hành tiến trình đầu tiên. Sau khi khởi động hoàn tất, nhân hệ điều hành không được thực thi ngay lập tức, nó chỉ nằm trong lời trả lời cho sự kiện bên ngoài("Ví dụ:", thông qua hàm hệ thống,các ứng dụng sẽ yêu cầu dịch vụ từ nhân hệ điều hành, hoặc thông qua ngắt được sử dụng bởi phần cứng để thông báo cho nhân hệ điều hành về các sự kiện xảy ra). Ngoài ra, nhân hệ điều hành còn đặc biệt cung cấp một vòng lặp được thực thi bất cứ lúc nào mà không có tiến trình nào được thực thi; nó thường được gọi là "tiến trình nhàn rỗi".
Quản lý tài nguyên.
Các khía cạnh chính cần thiết trong quản lý tài nguyên là xác định miền thực thi (không gian địa chỉ) và cơ chế bảo vệ được sử dụng để làm trung gian cho quyền truy cập vào tài nguyên trong miền. Kernels cũng cung cấp các phương pháp để đồng bộ hóa và giao tiếp liên tiến trình (IPC). Các triển khai này có thể nằm trong chính hạt nhân hoặc hạt nhân cũng có thể dựa vào các tiến trình khác đang chạy. Mặc dù kernels phải cung cấp IPC để cung cấp quyền truy cập vào các phương tiện được cung cấp bởi tiến trình khác, kernels cũng phải cung cấp các chương trình đang chạy với một phương thức để thực hiện yêu cầu truy cập các phương tiện này. Kernel cũng chịu trách nhiệm chuyển đổi ngữ cảnh giữa các tiến trình hoặc các luồng.
Quản lý bộ nhớ.
Kernel có toàn quyền truy cập vào bộ nhớ của hệ thống và phải cho phép các tiến trình truy cập an toàn vào bộ nhớ này khi chúng yêu cầu. Thường thì bước đầu tiên để thực hiện việc này là định địa chỉ ảo, thường đạt được bằng cách phân trang và/hoặc phân đoạn. Định địa chỉ ảo cho phép kernel chuyển đổi một địa chỉ vật lý nhất định dường như là một địa chỉ khác, địa chỉ ảo. Không gian địa chỉ ảo có thể khác nhau đối với các tiến trình khác nhau; bộ nhớ mà một tiến trình truy cập tại một địa chỉ (ảo) cụ thể có thể là bộ nhớ khác với bộ nhớ mà một tiến trình khác truy cập tại cùng một địa chỉ. Điều này cho phép mọi chương trình hoạt động như thể nó là chương trình duy nhất (ngoại trừ hạt nhân) đang chạy và do đó ngăn chặn các ứng dụng gây lỗi cho nhau.
Trên nhiều hệ thống, địa chỉ ảo của chương trình có thể tham chiếu đến dữ liệu hiện không có trong bộ nhớ. Lớp định hướng được cung cấp bởi địa chỉ ảo cho phép hệ điều hành sử dụng các kho lưu trữ dữ liệu khác, chẳng hạn như ổ cứng, để lưu trữ những gì nếu không sẽ phải lưu lại trong bộ nhớ chính (RAM). Kết quả là hệ điều hành có thể cho phép các chương trình sử dụng nhiều bộ nhớ hơn so với bộ nhớ vật lý có sẵn của hệ thống. Khi một chương trình cần dữ liệu hiện không có trong RAM, CPU báo hiệu cho hạt nhân và hạt nhân phản hồi bằng cách ghi nội dung của khối bộ nhớ không hoạt động vào ổ đĩa (nếu cần) và thay thế nó bằng dữ liệu được chương trình yêu cầu. Sau đó, chương trình có thể được tiếp tục lại từ điểm đã dừng. Đề án này thường được gọi là phân trang nhu cầu.
Định địa chỉ ảo cũng cho phép tạo các phân vùng ảo của bộ nhớ trong hai vùng riêng biệt, một vùng được dành riêng cho hạt nhân (kernel space) và vùng còn lại cho ứng dụng (user space). Bộ xử lý không cho phép các ứng dụng xử lý bộ nhớ dành cho kernel,do đó ngăn ứng dụng làm hỏng kernel đang chạy. Phân vùng cơ bản của không gian bộ nhớ này đã đóng góp nhiều vào các thiết kế hiện tại của các kernel có mục đích chung thực tế và gần như phổ biến trong các hệ thống, mặc dù một số nhân nghiên cứu (ví dụ, Singularity) có các cách tiếp cận khác.
Quản lý thiết bị.
Để thực hiện các chức năng hữu ích, các tiến trình cần quyền truy cập vào các thiết bị ngoại vi được kết nối với máy tính, được điều khiển bởi nhân thông qua trình điều khiển thiết bị. Trình điều khiển thiết bị là một chương trình máy tính cho phép hệ điều hành tương tác với thiết bị phần cứng. Nó cung cấp cho hệ điều hành thông tin về cách điều khiển và giao tiếp với một phần cứng nhất định.Trình điều khiển là một phần quan trọng và quan trọng đối với một ứng dụng chương trình. Mục tiêu thiết kế của một trình điều khiển là sự trừu tượng; chức năng của trình điều khiển là chuyển các lệnh gọi hàm trừu tượng do hệ điều hành ủy quyền (lệnh gọi lập trình) thành các lệnh gọi thiết bị cụ thể. Về lý thuyết, thiết bị sẽ hoạt động chính xác với trình điều khiển phù hợp. Trình điều khiển thiết bị được sử dụng cho những thứ như card màn hình, card âm thanh, máy in, máy quét, modem và card mạng LAN.
Ở cấp độ phần cứng, các phần tóm tắt phổ biến của trình điều khiển thiết bị bao gồm:
Và ở cấp độ phần mềm, tóm tắt trình điều khiển thiết bị bao gồm:
Ví dụ, để hiển thị cho người dùng một cái gì đó trên màn hình, một ứng dụng sẽ đưa ra một yêu cầu tới hạt nhân, nó sẽ chuyển tiếp yêu cầu tới trình điều khiển hiển thị của nó, sau đó sẽ chịu trách nhiệm thực sự vẽ ký tự/pixel.
Kernel phải duy trì một danh sách các thiết bị có sẵn. Danh sách này có thể được biết trước (ví dụ trên một hệ thống nhúng trong đó hạt nhân sẽ được viết lại nếu phần cứng có sẵn thay đổi), do người dùng định cấu hình (điển hình trên các PC cũ hơn và trên các hệ thống không được thiết kế cho mục đích cá nhân) hoặc được phát hiện bởi hệ điều hành tại thời điểm chạy (thường được gọi là plug and play).Trong các hệ thống plug-and-play, trình quản lý thiết bị trước tiên thực hiện quét trên các bus phần cứng khác nhau, chẳng hạn như Peripheral Component Interconnect (PCI) hoặc Universal Serial Bus (USB), để phát hiện các thiết bị đã cài đặt, sau đó tìm kiếm trình điều khiển thích hợp.
Vì quản lý thiết bị là một chủ đề rất cụ thể về hệ điều hành, các trình điều khiển này được xử lý khác nhau theo từng loại thiết kế nhân, nhưng trong mọi trường hợp, nhân phải cung cấp I/O để cho phép trình điều khiển truy cập vật lý vào thiết bị của chúng thông qua một số cổng hoặc bộ nhớ vị trí. Các quyết định quan trọng phải được đưa ra khi thiết kế hệ thống quản lý thiết bị, vì trong một số thiết kế, quyền truy cập có thể liên quan đến chuyển mạch ngữ cảnh, làm cho hoạt động rất tốn CPU và dễ gây ra chi phí hiệu suất đáng kể.