一、設備文件的分類
在Linux中,所有的硬件都是通過文件系統來訪問的。Linux將文件分為三類,分別是常規文件、目錄和設備文件。其中設備文件又可分為字符設備和塊設備。這裡我們主要介紹字符設備。
二、字符設備的概念
字符設備是一種I/O設備,它以字符為單位進行讀/寫操作。Linux將它們看作是不用“換行”或“回車”字符分割的字節流,可以像訪問文件一樣打開、關閉、讀取和寫入。Linux內核中的每個字符設備都有一個主設備號和次設備號作為標識。
三、字符設備驅動程序
字符設備驅動程序是Linux的內核模塊,負責將應用程序傳遞的字節流轉換為實際的硬件操作。驅動程序需要實現的函數包括:open,read,write,release等。下面是一個簡單的字符設備驅動程序的示例:
<linux/init.h> <linux/module.h> <linux/fs.h> MODULE_LICENSE("GPL"); static int my_open(struct inode *inode, struct file *file) { ... } static ssize_t my_read(struct file *file, char *buf, size_t count, loff_t *ppos) { ... } static ssize_t my_write(struct file *file, const char *buf, size_t count, loff_t *ppos) { ... } static int my_release(struct inode *inode, struct file *file) { ... } static struct file_operations my_fops = { .owner = THIS_MODULE, .open = my_open, .read = my_read, .write = my_write, .release = my_release, }; static int __init my_init(void) { ... } static void __exit my_exit(void) { ... } module_init(my_init); module_exit(my_exit);
四、字符設備文件的創建和使用
設備文件的創建和使用可以通過命令行操作。以創建/dev/mydev為例,首先需要使用mknod命令創建設備文件:
$ sudo mknod /dev/mydev c major minor
其中major和minor分別為設備文件的主設備號和次設備號。然後,可以使用cat和echo命令對設備文件進行讀寫操作:
$ echo "hello" > /dev/mydev $ cat /dev/mydev hello
也可以通過應用程序對設備文件進行讀寫操作,下面是一個簡單的應用程序示例:
<stdio.h> <fcntl.h> <unistd.h> int main(void) { int fd = open("/dev/mydev", O_RDWR); char buf[1024]; read(fd, buf, sizeof(buf)); write(fd, "world", sizeof("world")); close(fd); return 0; }
五、字符設備的應用場景
字符設備的應用場景非常廣泛,例如串口、鍵盤、鼠標、聲卡等外設都可以通過字符設備進行訪問。此外,字符設備還可以用於與應用程序進行通信,例如系統內的某個應用程序可以創建一個字符設備用於與另一個應用程序進行通信,數據傳輸時直接通過設備文件進行讀寫。
原創文章,作者:PACG,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/131060.html