Linux Kernel Overview¶
Tài liệu này giới thiệu nhanh về Linux kernel: vai trò, các thành phần bên trong và các subsystem. Mỗi mục chỉ ở mức tổng quan, nội dung chi tiết nằm trong các page được link kèm theo.
Phiên bản kernel
Trang này tham chiếu kernel mainline dòng 6.x. Một số page con được viết từ các phiên bản cũ hơn; khi chi tiết phụ thuộc phiên bản, page sẽ ghi rõ.
Linux Kernel là gì¶
Linux kernel là phần lõi của hệ điều hành, đóng vai trò lớp trung gian giữa phần cứng và các ứng dụng: quản lý CPU, bộ nhớ, thiết bị ngoại vi và cung cấp một giao diện thống nhất để ứng dụng sử dụng các tài nguyên đó.
Một số đặc điểm chính:
- Monolithic kernel: các thành phần chính (scheduler, memory management, file system, network, driver) chạy chung trong kernel space. Khác với microkernel, nhưng kernel vẫn có thể mở rộng động bằng loadable module.
- Mã nguồn mở, hỗ trợ nhiều kiến trúc (x86, ARM/ARM64, RISC-V...).
- Cấu hình được thông qua Kconfig/defconfig: chỉ build những tính năng cần thiết, phù hợp từ hệ nhúng nhỏ đến server.
- Hỗ trợ real-time: PREEMPT_RT đã vào mainline từ 6.12, không cần vá
patch ngoài để có kernel real-time (bật bằng
CONFIG_PREEMPT_RT).
Kernel Space và User Space¶
- User space: nơi chạy ứng dụng và thư viện (glibc...). Ứng dụng không truy cập trực tiếp phần cứng.
- Kernel space: chạy ở mức đặc quyền cao của CPU, truy cập được toàn bộ phần cứng và bộ nhớ.
- System call là cửa ngõ để ứng dụng yêu cầu dịch vụ từ kernel (
open,read,write,mmap,ioctl...). - Ngoài system call, kernel còn trao đổi với user space qua các file đặc biệt:
/dev(device file),/procvà/sys(thông tin và cấu hình kernel),debugfs,configfs. - Netlink socket: kênh hai chiều dạng message, dùng cho cấu hình mạng
(
ip,ethtool), uevent cho udev, và nhiều subsystem khác.
Xem thêm: Kernel Space, User Space Interfaces.
Các thành phần chính trong kernel¶
| Thành phần | Nhiệm vụ | Thư mục trong source |
|---|---|---|
| Process Scheduler | Quản lý process/thread, phân chia thời gian CPU | kernel/sched/ |
| Memory Management | Bộ nhớ ảo, page, cấp phát (buddy, slab allocator SLUB), mmap |
mm/ |
| Virtual File System (VFS) | Giao diện file thống nhất trên nhiều file system | fs/ |
| Networking | Network stack (socket, TCP/IP, ...) | net/ |
| IPC | SysV IPC, POSIX mqueue (ipc/); signal (kernel/signal.c); pipe (fs/pipe.c) |
ipc/, kernel/, fs/ |
| Device Drivers | Điều khiển phần cứng, chiếm phần lớn source | drivers/ |
| Architecture code | Mã phụ thuộc kiến trúc (boot, interrupt, MMU...) | arch/ |
Các cấu trúc dữ liệu dùng chung trong kernel (list, rbtree, kfifo...) xem tại Kernel Data Structure.
Lưu ý: allocator SLAB cũ đã bị bỏ từ 6.8, hiện kernel chỉ còn SLUB (API
kmalloc/kmem_cache_* không đổi).
Các subsystem¶
Subsystem là một framework chung do kernel cung cấp cho một nhóm thiết bị hoặc chức năng. Driver của từng phần cứng cụ thể chỉ cần đăng ký vào framework này thay vì tự làm lại phần chung. Dưới đây là các subsystem chính, chia theo nhóm (cột cuối để trống nếu tài liệu chưa có page tương ứng).
Core kernel¶
| Subsystem | Chức năng | Page liên quan |
|---|---|---|
| Scheduler | Lập lịch process/thread | |
| Memory Management | Bộ nhớ ảo, cấp phát, mmap, DMA mapping |
|
| VFS và file system | ext4, tmpfs, procfs, sysfs, debugfs... | |
| IRQ (interrupt) | Quản lý ngắt, irqchip, threaded IRQ | |
| Timer / Time | hrtimer, clocksource, clockevent | |
| Workqueue, tasklet, kthread | Hoãn xử lý, chạy ngữ cảnh process | |
| Locking / Synchronization | spinlock, mutex, RCU, atomic | |
| Security | LSM, SELinux, AppArmor, seccomp, capabilities | |
| cgroups / namespaces | Giới hạn tài nguyên và cô lập process (nền tảng của container) | Container Internals |
| Tracing / Debug | ftrace, perf, kprobe, eBPF, dynamic debug | FTrace, Dynamic Debug, Perf |
Device model và bus¶
| Subsystem | Chức năng | Page liên quan |
|---|---|---|
| Driver core / Device model | bus, device, driver, kobject, sysfs | Linux Device Driver Overview |
| Platform bus | Pseudo-bus cho thiết bị không tự dò được (thường là ngoại vi MMIO trên SoC); cần Device Tree/ACPI khai báo | Platform Device |
| Device Tree / OF | Mô tả phần cứng cho kernel | Device Tree |
| I2C | Bus I2C/SMBus | I2C Subsystem |
| SPI | Bus SPI | SPI Device |
| PCI / PCIe | Bus PCI Express | PCIe |
| USB | Host, gadget, các class driver | |
| MMC / SD / SDIO | Thẻ nhớ, eMMC | |
| MTD / NAND / NOR | Flash memory | |
| Virtio | Thiết bị ảo hóa | I/O Virtualization |
| UIO / VFIO | Đưa thiết bị ra cho driver chạy ở user space (nền tảng của DPDK) | DPDK |
Framework phần cứng dùng chung¶
| Subsystem | Chức năng | Page liên quan |
|---|---|---|
| Clock (CCF) | Quản lý clock tree | Common Clock Framework |
| Pinctrl | Cấu hình pin mux, pin config | |
| GPIO | GPIO controller, gpiolib | GPIO |
| Regulator | Quản lý nguồn cấp | |
| Power management | runtime PM, suspend/resume, cpufreq, cpuidle, devfreq | |
| Reset | Reset controller | |
| DMA Engine | DMA controller, dmaengine API | |
| Thermal | Cảm biến và điều khiển nhiệt | |
| Hwmon | Giám sát phần cứng (nhiệt độ, điện áp, quạt) | |
| Watchdog | Watchdog timer | |
| PWM | Điều chế độ rộng xung | |
| Mailbox / Remoteproc / RPMsg | Giao tiếp với core/processor khác | |
| RTC | Real-time clock, giữ giờ khi tắt máy (drivers/rtc) |
|
| NVMEM | EEPROM, OTP, eFuse | EEPROM |
| FPGA Manager | Nạp bitstream, FPGA region/bridge (Zynq, ZynqMP) | |
| Firmware loader | Nạp firmware cho thiết bị (request_firmware) |
Giao tiếp, I/O và media¶
| Subsystem | Chức năng | Page liên quan |
|---|---|---|
| TTY / Serial | UART, console | UART |
| Input | Bàn phím, chuột, touch, nút nhấn | |
| IIO | ADC, DAC, cảm biến | JESD (liên quan) |
| Sound (ALSA / ASoC) | Audio | Audio |
| V4L2 / Media | Camera, video capture, codec | |
| DRM / KMS / fbdev | Đồ họa và hiển thị | |
| LED, Backlight | Điều khiển đèn LED, đèn nền | |
| Bluetooth, Wireless (cfg80211/mac80211) | Kết nối không dây | |
| CAN | Bus CAN |
Mạng và lưu trữ¶
| Subsystem | Chức năng | Page liên quan |
|---|---|---|
| Networking | Socket, TCP/IP, netfilter, netdev, phylib | DPDK (bypass kernel) |
| PTP hardware clock | PHC, hardware timestamping (drivers/ptp) |
Linux PTP |
| Block layer | Block device, I/O scheduler, device-mapper, NBD | Network Block Device |
JESD204 không phải subsystem trong mainline: các driver JESD204 (AXI JESD204,
framework jesd204) chủ yếu nằm trong tree Linux của Analog Devices, dùng
cùng các driver IIO của ADC/DAC tốc độ cao.
Danh sách trên mang tính tổng quan, không phải đầy đủ tuyệt đối; xem danh sách
đầy đủ trong Documentation/ của kernel source hoặc tại
docs.kernel.org.
Device Model và Device Tree¶
Linux xem mọi thiết bị theo mô hình bus – device – driver: device được khai
báo (thường qua device-tree trên hệ nhúng), driver được đăng ký, và kernel
ghép (match) hai bên rồi gọi probe(). Thông tin này được phơi ra user space
qua sysfs (/sys).
Thiết bị trên bus tự dò được (PCI, USB) được kernel tự enumerate. Thiết bị không tự dò được (I2C, SPI, ngoại vi MMIO trên platform bus) phải được khai báo, đó là lý do hệ nhúng cần Device Tree.
Xem thêm: Linux Device Driver Overview, Device Tree.
Kernel Module¶
Kernel hỗ trợ hai dạng: built-in (nằm trong kernel image, khởi tạo lúc
boot) và loadable module (nạp lúc chạy bằng insmod/modprobe, gỡ bằng
rmmod/modprobe -r).
Device driver thường được viết dưới dạng kernel module.
Xem thêm: Kernel Module.
Source tree và build¶
- Chu kỳ phát triển và các bản stable/LTS: Kernel Release Process.
- Các thư mục cấp cao:
arch/,drivers/,fs/,kernel/,mm/,net/,include/,Documentation/. - Cấu hình bằng Kconfig (
make menuconfig,defconfig) và build bằng Kbuild/Makefile. - Kết quả build gồm:
- Kernel image, tùy kiến trúc:
Image(arm64),zImage(arm32),bzImage(x86). vmlinux(ELF chưa nén, có symbol) vàSystem.map: dùng khi debug, giải mã Oops.- Device-tree blob (
.dtb) và các module (.ko).
- Kernel image, tùy kiến trúc:
Boot¶
Quá trình boot (bootloader → kernel → init, initcall) xem tại Linux Kernel Boot Process; các tham số truyền cho kernel lúc boot xem tại Kernel Command Line.
Debug và quan sát¶
printk/dmesgvà Dynamic Debug.- FTrace để trace hoạt động của kernel.
/procvà/sysđể xem trạng thái và cấu hình.
Tài liệu tham khảo¶
- The Linux Kernel documentation
- Linux Device Drivers (LDD3) - Corbet, Rubini, Kroah-Hartman (viết cho kernel 2.6.10, năm 2005: khái niệm vẫn đúng, nhiều API đã đổi)
- Understanding the Linux Kernel, 3rd ed. - Bovet, Cesati (kernel 2.6.11)
- Linux Kernel Labs
