Driver trên Linux là gì ?

Driver trên Linux là gì ?

01/05/2022 Off By devk2x

Vai trò của driver

Driver là một trình điều khiển có vai trò điều khiển, quản lý, giám sát một thực thể nào đó dưới quyền của nó. Có 2 loại Linux driver là bus driver và device driver:

  1. Bus driver làm việc với một đường bus (Đứng từ góc độ của CPU, bộ điều khiển – device controller) cũng chỉ là một thiết bị. Do đó, cần có driver hướng dẫn CPU làm việc với bộ điều khiển
  2. Device driver làm việc với một thiết bị (chuột, bàn phím, màn hình, đĩa cứng, camera, …)

Có thể lấy ví dụ tương tự như vai trò của một phi công hoặc một hệ thống bay tự động được giám sát bởi phi công, một thành phần phần cứng có thể được điều khiển bởi một driver hoặc được điều khiển bởi một phần cứng khác mà được quản lý bởi một driver. Trường hợp này, phần cứng có vai trò điều khiển được gọi là một device controller. Bản thân các controller cũng cần driver. Ví dụ: hard disk controller, display controller, audio controller, … quản lý các thiết bị kết nối với chúng, mà nói một cách kỹ thuật hơn đó là các IDE controller, PCI controller, USB controller, SPI controller, I2C controller, … Các khái niệm này được minh họa tổng quan như hình sau:

Tương tác giữa thiết bị và driver
Tương tác giữa thiết bị và driver

Các device controller thông thường được kết nối với CPU thông qua đường bus (PCI, IDE, USB, SPI, …). Trong vi điều khiển, CPU và các device controller thường được thiết kế trên một chip. Điều này cho phép giảm kích thước và giá thành, phù hợp với phát triển hệ thống nhúng. Mà về mặt nguyên tắc, sẽ không có gì khác biệt đối lớn đối với các driver trên các hệ thống máy tính cá nhân.

Nhiệm vụ của driver

Các bus driver cung cấp giao diện đặc tả cho các giao thức phần cứng tương ứng. Nó nằm ở tầng dưới cùng trong mô hình phân lớp phần mềm của hệ điều hành. Nằm trên nó là các device driver thực sự để vận hành các thiết bị, mang đặc trưng của từng thiết bị xác định. Ngoài ra, mục đích quan trọng của các driver thiết bị là cung cấp một giao diện trừu tường hóa cho người sử dụng, tức là cung cấp một giao diện lên tầng trên của hệ điều hành. Một cách tổng quan, một driver sẽ bao gồm 2 phần quan trọng:

  1. giao tiếp với thiết bị (Device-specific)
  2. giao tiếp với hệ điều hành (OS-specific)
Các thành phần của driver thên Linux
Các thành phần của driver thên Linux

Thành phần giao tiếp với thiết bị (device-specific) của một driver là giống nhau đối với tất cả các hệ điều hành. Nó có thể hiểu và giải mã các thông tin về thiết bị (chi tiết kỹ thuật, kiểu thao tác, hiệu năng, cách lập trình giao tiếp với thiết bị, …)

Thành phần giao tiếp với hệ điều hành (OS-specific) gắn kết chặt chẽ với các cơ chế của hệ điều hành, và do vậy sẽ là khác nhau giữa một driver trên Linux và một driver trên Windows, hoặc MacOS, …

Mô hình phân lớp theo chiều dọc

Trên Linux, device driver cung cấp một giao diện “system call” (giao diện gọi các hàm hệ thống) đến tầng ứng dụng cho người dùng; đây được coi là một ranh giới giữa tầng nhân (kernel space) và tầng người dùng (user space) của Linux. Mô hình phân tầng được chỉ ra như hình vẽ.

Kiến trúc tổng quan nhân Linux
Kiến trúc tổng quan nhân Linux

Tùy thuộc vào đặc trưng của của driver với hệ điều hành, driver trên Linux được phân chia thành 3 loại (phân cấp theo chiều dọc):

  • Packet-oriented or the network vertical (driver hướng gói dữ liệu)
  • Block-oriented or the storage vertical (driver hướng khối dữ liệu)
  • Byte-oriented or the character vertical (driver hướng byte/ký tự)

Packet-oriented hay network driver gồm 2 phần:

  1. network protocol stack
  2. network interface card (NIC) device drivers, hoặc đơn giản là network device driver (có thể là Ethernet, Wi-Fi, hoặc bất kỳ các giao tiếp mạng nào khác,…)

Block-oriented hay storage driver gồm 2 phần:

  1. File-system drivers để giải mã các định dạng khác nhau trên các phân vùng lưu trữ khác nhau (FAT, ext, …)
  2. Block device drivers cho các giao thức phần cứng ứng với các thiết bị lưu trữ khác nhau (IDE, SCSI, MTD, …)

Các Byte-oriented hay character driver lại tiếp tục được phân chia thành các lớp con (sub-classified) như tty driver, input driver, console driver, frame-buffer drivers, sound driver, … (tương ứng với các giao tiếp như RS232, PS/2, VGA, I2C, SPI, …)


Nguồn: Linux Device Drivers, 3rd Edition, O’Reilly Books