- Back to Home »
- Linux Basic »
- Device driver, device file
Saturday, June 6, 2015
1. Device driver
Khái niệm
Device driver là một chương trình phần mềm nằm dưới tầng kernel, nhiệm vụ của nó là nhận các chỉ thị từ user space để điều khiển hardware hoạt động. Device driver được viết theo cơ chế module của kernel, theo một form nhất định được kernel quy định rõ. Để có thể điều khiển được hardware, nó thực hiện việc đọc và ghi các thanh ghi register của phần cứng (control + status + data register, ...) . Trong lập trình Linux thì Device driver thuộc phần nâng cao, bạn đọc có thể xem qua một số hướng dẫn từ cơ bản đến nâng cao tại các link sau:
+ Linux Device Driver serial (Cơ bản)
+ Linux Device Drivers, 3rd Edition (Nâng cao)
Compile device driver
Khi compile source code driver thì kết quả cho ra một file .ko (kernel obbject), driver hệ thống nằm trong gói source code của kernel.
Các loại devices
Có 3 loại device cơ bản trong hệ thống Linux
+ Character Devices (Byte-oriented: RS232, PS/2, VGA, I2C, SPI, Keyboard, ...)
+ Block Devices (Block-oriented: IDE, SCSI, MTD, …)
+ Network Devices (Packet-oriented: Ethernet, Wi-fi, ...)
2. Device file (device node)
Device là một file đặc biệt nằm trên user space, có nhiệm vụ đại diện cho một thiết bị phần cứng, hay nói cách khác nó là interface giữa user application với device driver. Device file được biểu diễn với dạng /dev/xxx. Ví dụ /dev/input/mice là device file để interface với chuột, bạn đọc có thể thử bằng cách gõ lệnh
# cat /dev/input/mice
sau đó di chuyển chuột bạn sẽ thấy trên terminal trace ra rất nhiều ký tự, đó chính là thông tin được đọc từ chuột và đưa lên thông qua device file.
Có thể xem tất cả các device file thông qua lệnh
# ls -l /dev
Một số tên gọi đại diện cho một thiết bị như:
+ /dev/tty* các thiết bị serial như uart, keyboard, ...
+ /dev/sd* các thiết bị như ổ cứng, usb
+ /dev/video các thiết bị như camera, webcam
+ /dev/fb* video memory (frame bufer)
+ /dev/null device file đặc biệt, để write tất cả mọi thứ từ stdout và stderr vào nếu bạn không muốn nó trace ra ở stdout & stderr
+ /dev/zero device file đặc biệt, chỉ dùng để đọc, nó luôn trả về giá tri zero
+ ...
3. Device driver event
Mối liên hệ giữa device file và device driver thể hiện qua các cặp function, mỗi thao tác trên user space đều có một function được implement dưới device driver tương ứng.
Ví dụ ta có
+ device driver của cổng uart : uart.ko
+ device file tương ứng /dev/uart
Các thao tác được mô tả như sau:
+ Load module
Muốn sử dụng driver trước hết phải load driver thông qua lệnh insmod uart.ko, lúc đó dưới driver sẽ chạy hàm khởi tạo init_module()
+ Open device
device_file = fopen("/dev/uart", O_RDWR);
dưới driver sẽ chạy hàm open.
Các thao tác dưới đây được mô tả tương tự như thao tác open
+ Read device
+ Write device
+ Close device
+ Remove device
Thực hiện lệnh rmmod uart trên user space tương ứng dưới driver sẽ chạy hàm Cleanup_module() để remove device driver ra khỏi kernel.