Driver và Firmware trong Linux


Gần đây, khi tìm hiểu cách cài đặt driver cho USB Wifi, mình có tìm hiểu thêm về quá trình tạo nhân Linux. Đặc biệt, việc thiết lập cấu hình trước khi build tạo ảnh của kernel.
Mình thấy ngoài Driver, tức là thành phần trung gian giữa ứng dụng và phần cứng, còn có 1 khái niệm nữa. Đó là Firmware.

Bài này sẽ dịch lại trang, để hiểu qua về Firmware trong Linux Kernel.

1. Firmware ở đây là gì?

Nhiều thiết bị có tới 2 thành phần để tạo nên chức năng của chúng khi trong hệ điều hành. Đầu tiên, đó là một Driver, là phần mềm cho phép hệ điều hành nói chuyện được với phần cứng của thiết bị. Thứ hai, đó là Firmware, thường là một mã nhị phân được upload trực tiếp vài thiết bị để nó có thể hoạt động được. Bạn có thể nghĩ Firmware ở đây là cách để lập trình phần cứng bên trong thiết bị. Trong thực tế, hầu hết Firmware đều có dạng (closed-source), thường không có source code đi kèm, và được phân phối miễn phí.

2. Lấy Firmware như thế này ở đâu?

Firmware thường được maintained bởi chính các công ty phát triển thiết bị. Trên Windows, firmware thường là một phần của Driver bạn cài đặt để sử dụng thiết bị đó, và tất nhiên, user không hề thấy nó. Trên Linux, firmware đến từ rất nhiều nguồn. Một số có ngay trong source của nhân. Số khác được phân phối từ upstream. Một số khác thì thật không may, chúng không được phân phối miễn phí.

Trên Ubuntu, firmware có thể đến từ 1 trong các nguồn dưới đây:
– Gói linux-image
– Gói linux-firmware
– Gói linux-firmware-nonfree
– Gói driver riêng biệt
– Các nguồn khác như Driver CD, Email, Website.

Chú ý rằng, gói linux-firmware-nonfree không được cài mặc định.
Các firmware đã được cài đặt sẽ nằm ở /lib/firmware/.

3. Các Firmware này được sử dụng lúc nào?

Khi driver cho các thiết bị này được chạy, nó sẽ “yêu cầu” các firmare tương ứng từ lib/firmware/
Quá trình về cơ bản sẽ như sau:
1. Driver yêu cầu file Firmware.
2. Kernel sẽ gửi 1 yêu cầu đến udev để hỏi Firmware
3. udev sẽ chạy 1 script để load dữ liệu từ firmware vào 1 file đặc biệt được tạo bởi Kernel.
4. Kernels sẽ đọc đọc Firmware từ file đó và chuyển cho Driver.
5. Driver sau đó sẽ bằng cách nào đó load firmware vào thiết bị.

Vị dụ về USB Wifi Buffalo sử dụng chip Ralink

Thông thường các module khi yêu cầu External Firmware, nhân sẽ tìm trong đường dẫn /lib/firmware. Đường dẫn này được set trong biến CONFIG_EXTRA_FIRMWARE_DIR khi cấu hình để build kernel.

Trong trường hợp của chúng ta, module đã được load nhưng firmware dành cho thiết bị không có trong /lib/firmware, có lẽ ta chỉ cần copy vào thư mục trên là vấn đề sẽ được giải quyết.

Advertisements

2 thoughts on “Driver và Firmware trong Linux

  1. Pingback: Một chút về Driver cho USB Device trong Linux | === Write to read it later ===

  2. Pingback: Cài thêm driver usb-wifi adapter cho bản build Raspbery PI sử dụng Yocto Project (chưa xong) | === Write to read it later ===

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s