0

Giới thiệu về Linux kernel development

Sự ra đời của linux

Linux ra đời nằm 1991 từ dự án cá nhân của Linux Torvalds khi ông còn là 1 sinh viên. Dự án đã phát triển dần dần cho đến nay với khoảng hơn 5000 người tham gia đóng góp trên toàn thế giới tại năm 2025. Ngày nay hệ điều hành Linux chiếm phần lớn trong mảng embedded và cũng như hệ thống server. Linux là phần cốt lõi của hệ điều hành, việc phát triển nó cũng không hề dễ dàng

Dưới đây là 1 số điểm mạnh của Linux so với các hệ điều hành khác:

  • Nó miễn phí
  • Nó có hệ thống tài liệu phong phú và cộng đồng quan tâm lớn
  • Nó có thể port sang nhiều platform, kiến trúc khác nhau
  • Nó là mã nguồn mở nê có thể tự do xem mã nguồn
  • Support rất nhiều package mã nguồn mở

Cách đánh số phiên bản của Linux

Vào những thời kì đầu của Linux(trước năm 2003), Linux sử dụng cách đánh số chẵn lẻ

  • Số phiên bản lẻ (odd) → unstable (không ổn định, bản thử nghiệm)
  • Số phiên bản chẵn (even) → stable (ổn định)

Ví dụ:

  • 2.3.x → bản thử nghiệm

  • 2.4.x → bản ổn định

  • 2.5.x → thử nghiệm

  • 2.6.x → ổn định Khi phiên bản 2.6 được phát hành việc đánh dấu phiên bản được chuyển sang định dạng X.Y.Z

  • x: là Major version sẽ tăng khi có thay đổi lớn không thể tương thích ngược

  • y: là Minor version sẽ tăng khi có thêm chức năng mới nhưng vẫn tương thích ngược

    Ví dụ: Thêm tính năng mà không thay đổi tên của hàm, API chính

  • z: là Patch version, tăng khi sửa lỗi(fix bug). Có thể là nhiều bản patch sửa lỗi tổng hợp sẽ gom vào 1 bản phát hành z

Cách Linux tổ chức source code

  • arch/: Linux kernel là 1 project phát triển và lớn mạnh rất nhanh, nó hỗ trợ ngày càng nhiều kiến trúc phần cứng khác nhau. Điều đó chỉ ra rằng nhân Linux phải được viết một cách độc lập về phần cứng nhiều nhất có thể. Những phần mã nguồn đặc trưng cho mỗi kiến trúc sẽ được viết ở 1 nơi riêng biệt, nó được đặt trong thư mục này. Thư mục này chứa các thư mục con đặc trưng cho từng loại kiến trúc CPU ví dụ như: arm/, powerPC/, x86_64/…

  • block/: Thư mục này chứa mã nguồn cho các loại thiết I/O truy xuất theo kiểu block. Gồm bộ lập lịch I/O, tầng BIO, hàng đợi I/O nhiều luồng, quản lý thiết bị chung.

  • crypto/: Chứa các API của thuật toán mã hoá và giải mã.

  • Documentation/: Thư mục này nên là nơi được xem nhiều nhất. Nó chứa mô tả cho các API được dùng cho các kernel framework và các subsystem khác nhau của linux. Khi có thắc mắc chúng ta nên đọc thư mục này đầu tiên thay vì đi tìm kiếm trên mạng hoặc hỏi chat GPT.

  • drivers/: Đây là thư mục nặng nhất, chứa nhiều source code nhất. Liên tục phát triển khi các driver mới được thêm vào. Nó chứa mọi trình điều khiển của các phần cứng khác nhau với rất nhiều folder con.

  • fs/: Thư mục này chứa mã nguồn thực thi của nhiều loại file system khác nhau mà kernel hỗ trợ như: FAT, NTFS, ext2, ext3, ext4,...

  • include/: Chứa header file của linux kernel

  • init/: Chứa mã nguồn khởi tạo và khởi động của hệ thống

  • ipc/: Chứa mã nguồn tạo nên cơ chế IPC(inter process communication) ví dụ: message queue, semaphores and share memory.

  • kernel/: Thư mục này chứa các phần độc lập với kiến trúc là base của linux kernel.

  • lib/: Các hàm của thư viện, các chức năng hỗ trợ được viết ở đây:

    Generic helper function:
    1. Xử lí chuỗi
    2. Thao tác bit
    3. Các thuật toán sắp xếp
    4. Các hàm toán học
    5. ID allocator (phân bổ ID cho các tài nguyên)
    6. Hàm xử lí danh sách liên kết
    Các hàm CRC (Cyclic Redundancy Check)
    1. Mạng
    2. File system
    3. Bộ nhớ
    4. Thiết bị lưu trữ
    Quản lí đối tượng kernel
    1. Kobject
    2. Kset
    3. Gửi udev-event ra user space
    4. Cấu trúc phân cấp đối tượng của kernel
  • mm/: Chứa mã nguồn của việc quản lí bộ nhớ memory management

  • net/: Chứa mã nguồn của các loại networking protocol

  • scripts/: Chứa mã nguồn của farmework security

  • audio/: Mã nguồn hệ thống subsystem của audio được đặt ở đây

  • usr/: Chứa mã nguồn dùng để tạo initramfs và initrd

    • đóng gói file hệ thống ban đầu (initial root filesystem)
    • xử lý định dạng cpio
    • giải nén initramfs khi boot

Mô hình OPP hướng đối tượng trong linux kernel

Kernel không dùng C++ những vẫn áp dụng hướng đối tượng bằng cách:

  1. "Class” để biểu diễn 1 subsystem

Ví dụ:

  • /sys/class/net/: Subsystem mạng
  • /sys/class/pwm/: Subsystem PWM
  1. “Object” struct device hoặc struct kobject
  • Mỗi thiết bị là 1 object
  • Kobject là nền tảng để xây dựng nên toàn bộ mô hình OOP này.
  1. Kobject hỗ trợ:
  • Hệ thống phân cấp(parent/child)
  • Tham chiếu(kref) để quản lí time life
  • Tạo ra các entry trong sysfs
  • Gán vào các class tương ứng
  1. Giống như virtual function trong OOP linux dùng “ops”
  • Cho phép cùng 1 giao diện nhưng mỗi khi nó được mount vào 1 thiết bị nó sẽ gọi tới hàm tương ứng của thiết bị đó

Đây là 1 bản dịch và tóm tắt cho chương đầu tiên của cuốn Linux Device Drivers Development của Jon Madieu. Cảm ơn các bạn đã đọc!!!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí