Chào mừng bạn đến với Vimentor!

Hỏi đáp
Đăng ký

Giới thiệu về Linux driver

Giới thiệu.

Trong bài học trước, chúng ta đã liệt kê 6 thành phần của Linux kernel, trong đó có device management. Thành phần này gồm các driver, mỗi driver chịu trách nhiệm điều khiển, giám sát, trao đổi dữ liệu với một thiết bị.

Phần đầu của bài học này sẽ giới thiệu về 2 loại Linux driver là bus driver và device driver. Phần tiếp theo sẽ tập trung nói rõ hơn về Linux device driver. Cuối cùng, chúng ta sẽ tìm hiểu một ví dụ thực tế về Linux driver.

Giới thiệu về Linux driver.

Driver là một phần mềm, gồm các lệnh, hướng dẫn CPU cách tương tác với thiết bị. Các thiết bị có thể là chuột, bàn phím, ổ cứng, card mạng, loa, màn hình,… Tuy nhiên, các thiết bị này không được nối trực tiếp với CPU, bởi vì:

  • Hệ thống có nhiều thiết bị, nhưng số lượng chân của CPU hữu hạn.
  • Tốc độ làm việc của các thiết bị thấp hơn nhiều so với CPU.

Chính vì vậy, các thiết bị kết nối với CPU thông qua một thiết bị khác, gọi là bộ điều khiển (device controller). Có nhiều cách để phân loại bộ điều khiển:

  • Phân loại theo chức năng, ví dụ:
    • Hard disk controller: trợ giúp CPU điều khiển ổ cứng.
    • Graphic controller: trợ giúp CPU điều khiển các thiết bị hiển thị.
    • Keyboard controller: trợ giúp CPU điều khiển bàn phím.
  • Phân loại theo kỹ thuật giao tiếp với các thiết bị, ví dụ:
    • PCI controller: hỗ trợ CPU giao tiếp với các thiết bị khác, mà các thiết bị này được thiết kế theo chuẩn PCI.
    • USB controller: hỗ trợ CPU giao tiếp với các thiết bị khác, mà các thiết bị này được thiết kế theo chuẩn USB.
    • I2C controller: hỗ trợ CPU giao tiếp với các thiết bị khác, mà các thiết bị này được thiết kế theo chuẩn I2C.

Hình 1 là sơ đồ khối của hệ thống máy tính cá nhân, sử dụng bộ xử lý của Intel. Từ hình này, ta cũng thấy rằng, thiết bị (device) và bộ điều khiển (device controller) chỉ mang tính chất tương đối. Ví dụ, trên PCI bus, PCI controller đóng vai trò là bộ điều khiển, còn I2C controller đóng vai trò là thiết bị. Nhưng trên I2C bus, thì I2C controller lại là bộ điều khiển, còn EEPROM và RTC đóng vai trò là thiết bị.

Hình 1 Sơ đồ khối của máy tính cá nhân sử dụng bộ xử lý Intel

Đứng từ góc độ của CPU, bộ điều khiển 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. Driver này được gọi là bus driver. Còn driver hướng dẫn CPU làm việc với thiết bị thì được gọi là device driver (hình 2).

Hình 2 Mối liên hệ giữa driver, bộ điều khiển và thiết bị dưới góc độ thực thi

Để thuận tiện cho quá trình phát triển, bus driver và device driver được chia làm 2 thành phần (hình 3).

  • Device driver gồm 2 phần:
    • Thành phần OS specific. Thành phần này cung cấp cho hệ điều hành các dịch vụ đọc/ghi dữ liệu của thiết bị. Điều này cho phép chúng ta xây dựng hệ điều hành độc lập với cấu trúc của thiết bị.
    • Thành phần device specific. Thành phần này chứa các lệnh hướng dẫn CPU điều khiển thiết bị, giám sát thiết bị, trao đổi dữ liệu với thiết bị. Chúng ta sử dụng datasheet của thiết bị để xây dựng thành phần này. Datasheet là một tài liệu được cung cấp bởi nhà sản xuất thiết bị. Nó mô tả sơ đồ khối chức năng, nguyên lý hoạt động, hiệu suất hoạt động, đặc tính điện của thiết bị và đặc biệt là bản đồ thanh ghi (register map).
  • Bus driver gồm 2 phần:
    • Thành phần protocol abstraction. Thành phần này che giấu đi sự phức tạp của các giao thức trên bus, cung cấp các dịch vụ cho device driver sử dụng. Ví dụ như đọc/ghi một thanh ghi nào đó của thiết bị.
    • Thành phần protocol specific. Thành phần này chứa các lệnh hướng dẫn CPU làm việc với bộ điều khiển, giúp đọc/ghi dữ liệu trên bus. Nó cũng được xây dựng dựa trên datasheet của bộ điều khiển.

Hình 3 Các thành phần của bus driver và device driver

Để dễ hình dung, ta xét một tiến trình đọc thời gian từ thiết bị DS1307. Thiết bị này chính là khối RTC trong hình 1. Trên I2C bus, DS1307 là thiết bị, I2C controller là bộ điều khiển. Driver của thiết bị DS1307 là DS1307 driver. Đây là một device driver. Còn driver của I2C controller là I2C driver. Đây là một bus driver.

Hình 4 Ví dụ về driver cho thiết bị và bộ điều khiển trên I2C bus

Hình 4 mô tả quá trình đọc thời gian từ thiết bị DS1307:

  • Bước 1: Tiến trình gọi system call "read" của hệ điều hành.
  • Bước 2: Hệ điều hành sẽ gọi hàm "read_daytime". Hàm này thuộc phần OS specific của DS1307 driver.
  • Bước 3: Hàm "read_daytime" của OS specific tiếp tục gọi hàm "read_ds1307". Hàm này thuộc phần device specific của DS1307 driver.
  • Bước 4: Hàm "read_ds1307" sẽ gọi hàm "i2c_read_reg" bảy lần để đọc dữ liệu từ 7 thanh ghi của thiết bị DS1307. Các thanh ghi này chứa năm, tháng, ngày, thứ, giờ, phút, giây. Hàm "i2c_read_reg" là một hàm thuộc phần protocol abstraction của I2C driver. Hàm này nhận 2 tham số đầu vào: một là địa chỉ của DS1307 trên I2C bus, và một là địa chỉ của thanh ghi cần đọc  trong thiết bị DS1307 (năm, tháng, ngày, giờ,...).
  • Bước 5: Hàm "i2c_read_reg" sẽ lần lượt gọi các hàm "i2c_start", "i2c_send_address", "i2c_read_byte". Các hàm này thuộc phần protocol specific của I2C driver. Các hàm này sẽ hướng dẫn CPU làm việc với I2C controller thông qua bus hệ thống (bus địa chỉ, bus dữ liệu, bus điều khiển).
  • Bước 6: I2C controller bắt đầu giao tiếp với DS1307 thông qua I2C bus.
  • Bước 7: DS1307 gửi dữ liệu về năm, tháng, ngày, thứ, giờ, phút, giây tới cho I2C controller thông qua I2C bus.
  • Bước 8: I2C controller gửi dữ liệu về cho CPU thông qua bus hệ thống.
  • Bước 9: hàm "i2c_read_reg" trả dữ liệu về cho hàm "read_ds1307". Hàm "read_ds1307" trả dữ liệu về cho hàm "read_daytime". Hàm "read_daytime" trả dữ liệu về cho system call "read". Cuối cùng, system call "read" trả dữ liệu về cho tiến trình.

Giới thiệu về Linux device driver.

Trong mục này, chúng ta sẽ giới thiệu về device driver. Lý do là vì, khóa học này hướng dẫn các bạn cách lập trình device driver, chứ không phải bus driver.

Dựa vào lượng dữ liệu mỗi lần thiết bị trao đổi với CPU, thiết bị được chia làm 3 loại:

  • Character device: lượng dữ liệu nhỏ nhất mà CPU và thiết bị trao đổi với nhau là 1 byte. Ví dụ về các thiết bị thuộc loại này là chuột, bàn phím, loa,…
  • Block device: lượng dữ liệu nhỏ nhất mà CPU và thiết bị trao đổi với nhau là một khối, gồm nhiều byte (ví dụ 1 khối gồm 512 byte). Thông thường, block device là các thiết bị lưu trữ, như ổ cứng chẳng hạn.
  • Network device: lượng dữ liệu nhỏ nhất mà CPU và thiết bị trao đổi với nhau là một gói tin, gồm nhiều byte. Gói tin có kích thước không cố định. Thông thường, network device là các thiết bị mạng, như NIC card, Wifi chip.

Tương ứng với ba loại thiết bị trên, chúng ta có ba loại device driver: character driver, block driver, network driver. Do đó, hình 3 của bài 1.1 sẽ được vẽ chi tiết hơn như hình 5 dưới đây.

Hình 5 Phân loại device driver

Case study.

Trong bài tập lần này, chúng ta sẽ cùng tìm hiểu về cách Linux triển khai cho một bus driver và một device driver liên kết với bus driver đó. Bus driver mà chúng ta sẽ tìm hiểu là usb driver. Còn device driver mà chúng ta sẽ tìm hiểu là mouse driver.

Các bạn hãy lên trang sau https://elixir.bootlin.com/linux/v4.4.137/source/ để tìm hiểu mã nguồn của Linux kernel phiên bản 4.4.

Thư mục /drivers/usb/core chứa mã nguồn triển khai cho thành phần protocol abstraction của usb driver. Thư mục /drivers/usb/host chứa mã nguồn triển khai cho thành phần protocol specific của usb driver.

File /drivers/input/mouse/bcm5974.c chứa mã nguồn triển khai cho mouse driver. Device driver này thuộc loại character driver. Trong file này, cấu trúc bcm5974_driver chính là thành phần OS specific của device driver. Còn các hàm bắt đầu bằng tiền tố bcm5974_* chính là thành phần device specific của device driver.

Kết luận

Driver là một phần mềm, gồm các lệnh hướng dẫn cho CPU biết cách giao tiếp với với thiết bị. Driver được chia làm 2 loại: device driver và bus driver.

  • Device driver chịu trách nhiệm điều khiển thiết bị đầu cuối. Device driver gồm 2 phần: OS specific và device specific. Phần OS specific cung cấp cho hệ điều hành các dịch vụ đọc/ghi dữ liệu trên thiết bị. Phần device specific thực hiện điều khiển thiết bị. Device driver được chia làm 3 loại: char driver, block driver và net driver.
  • Bus driver chịu trách nhiệm điều khiển bộ điều khiển (thiết bị trung gian). Bus driver gồm 2 phần: protocol abstraction và protocol specific. Phần protocol abstraction che giấu đi sự phức tạp của giao thức truyền thông trên bus ngoại vi, và cung cấp dịch vụ cho device driver. Phần protocol specific ra lệnh cho bộ điều khiển vận chuyển các bản tin của device driver lên trên bus ngoại vi, đi tới thiết bị đầu cuối và ngược lại.

Luyện tập cho bài học này

** Nếu bạn muốn viết các nội dung đặt biệt thì hãy làm theo hướng dẫn sau

Xem thêm 10 bình luận
Viết blog mới của bạn
Báo lỗi trang
Đang tải