一、設備文件的分類
在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-tw/n/131060.html
微信掃一掃
支付寶掃一掃