1. Kernel - Lõi của một OS: Khi nói đến OS - Operating System, chúng ta thường định nghĩa theo hai hướng:
+ Một OS là tổng thể được đóng gói bao gồm phần mềm trung tâm quản lí tài nguyên và các công cụ tiêu chuẩn đi kèm, hỗ trợ như CLI, GUI, File utilities, editors, etc + Một OS đơn giản là phần mềm trung tâm chuyên dụng quản lí và phân vùng tài nguyên máy tính (CPU, RAM, devices, etc)
Thường thì định nghĩa thứ hai có thể được dùng cho phần nhân (Kernel). Mặc dù các chương trình không nhất thiết phải chạy dưới sự can thiệp của kernel, nhưng Kernel sẽ giúp đơn giản hóa nhiều tác vụ, đem đến nhiều khả năng can thiệp và hiệu chỉnh cho lập trình viên thông qua việc cung cấp Software Layer để kiểm soát tài nguyên máy tính. Bạn có thể soi Linux Kernel trong /boot/vmlinuz.
drmint@Old-Server:/$ ll /boot/vmlinuz* lrwxrwxrwx 1 root root 25 Jan 7 22:10 /boot/vmlinuz -> vmlinuz-5.15.0-91-generic -rw------- 1 root root 11517416 Nov 16 21:01 /boot/vmlinuz-5.15.0-91-generic
Đôi nét về cái tên vmlinuz. Ban đầu khi nhân UNIX - unix được đưa vào thêm khái niệm vùng nhớ ảo (virtual memory), nó trở thành vmunix. Do đó mà nhân linux cũng lấy tên là vmlinuz, chữ 'z' ở đây nhấn mạnh việc phần nhân đang ở dạng nén của tệp thực thi (compressed executable) :v
2. Tác vụ của Linux Kernel: Ủa vậy Kernel làm được gì hay ho nhỉ? Lập lịch (Process scheduling): Linux là một preemptive multitasking OS. Nôm na là Linux sẽ thực thi nhiều tiến trình cùng lúc, và trong quá trình đó, độ ưu tiên sẽ được cân nhắc bởi bộ lập lịch (về kích thước tài nguyên, thời gian sử dụng CPU, etc) Quản lí vùng nhớ (Memory management): cơ bản thì bộ nhớ vật lí (RAM) không phải là vô hạn, nó bị hạn chế rất nhiều khi kernel phải tìm cách chia sẻ vùng nhớ giữa các tiến trình. Linux kernel áp dụng một kĩ thuật gọi là Virtual memory mapping, cho phép mapping địa chỉ ảo với địa chỉ vật lí, giảm sự phức tạp trong quản lí vùng nhớ. Mỗi tiến trình sẽ sử dụng một bộ địa chỉ ảo riêng biệt, và chỉ một phần của tiến trình được giữ trong vùng nhớ => Tăng số lượng tiến trình trên RAM. Việc này giúp tối ưu CPU, đảm bảo tại bất cứ thời điểm nào CPU cũng sẽ chạy ít nhất một tiến trình! Cung cấp file system: cho phép người dùng thao tác với file: tạo, lưu, làm mới, xóa, etc Tạo và hủy tiến trình: Kernel tải một chương trình lên vùng nhớ, cung cấp cho nó tài nguyên (CPU, RAM, truy cập file, etc) để nó chạy => Tiến trình. Sau khi hoàn tất tiến trình, Kernel sẽ đảm bảo tài nguyên được giải phóng hoàn toàn cho việc tái sử dụng bởi các tiến trình sau đó. Kết nối thiết bị ngoại vi (External devices): ờm thì, chúng ta vẫn cần dùng chuột (mình bỏ lâu rồi :v), bàn phím, màn hình, etc. Kernel cung cấp các chương trình chuẩn hóa và đơn giản hóa việc kết nối thiết bị. Mạng (Networking): Kernel truyền/nhận các gói tin trong mạng thông qua các tiến trình ở tầng user, support cả TCP và UDP, IPv4 và IPv6. Cung cấp system call API: món này quan trọng, mình sẽ nói sâu về nó ở các bài sau. Cơ bản thì tiến trình có thể thông qua Kernel để thực thi một số thao tác được giới hạn ở lớp Kernel.
User mode: Process executing => Get system call Return ----------------------------------------------------------------\\---------------------\\----- Kernel mode: Execute system call
3. Kernel mode vs User mode: Ngày nay, các kiến trúc bộ xử lí hiện đại cho phép CPU chạy ở hai mode: USER và KERNEL. Các chỉ lệnh của HW cho phép chuyển đổi giữa hai mode này, phân biệt vùng nhớ được đánh dấu theo các mode. Nói dễ hiểu thì khi bạn được cho phép vui chơi ở vùng nhớ thuộc user space (user mode), mà bạn lén phén đi vào kernel space thì sẽ dẫn đến HW exception, còn khi đang ở kernel mode thì chúng ta hoàn toàn có thể truy cập vùng nhớ hai phía. Một số tác vụ đặc thù chỉ có thể được thực thi khi bộ xử lí chạy kernel mode: chạy chỉ lệnh treo/dừng hệ thống, truy cập phần cứng quản lí vùng nhớ, khởi tạo trình chạy I/O cho thiết bị. Thông qua việc phân chia mode, các cấu trúc dữ liệu quan trọng và chỉ lệnh ở kernel sẽ được bảo vệ khỏi tiến trình của người dùng.
Tiếp theo: SHELL, lớp vỏ bọc lấy Kernel
General view in GNU/Linux
General view in GNU/Linux