linux字符設(shè)備放在哪個目錄中

今天小編給大家分享一下linux字符設(shè)備放在哪個目錄中的相關(guān)知識點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

成都創(chuàng)新互聯(lián)專注于網(wǎng)站建設(shè),為客戶提供成都網(wǎng)站建設(shè)、成都做網(wǎng)站、網(wǎng)頁設(shè)計開發(fā)服務(wù),多年建網(wǎng)站服務(wù)經(jīng)驗(yàn),各類網(wǎng)站都可以開發(fā),成都品牌網(wǎng)站建設(shè),公司官網(wǎng),公司展示網(wǎng)站,網(wǎng)站設(shè)計,建網(wǎng)站費(fèi)用,建網(wǎng)站多少錢,價格優(yōu)惠,收費(fèi)合理。

linux字符設(shè)備放在“/dev”目錄中。字符設(shè)備是指只能一個字節(jié)一個字節(jié)進(jìn)行讀寫操作的設(shè)備,一般每個字符設(shè)備或者塊設(shè)備都會在“/dev”目錄下對應(yīng)一個設(shè)備文件,并且每個設(shè)備文件都必須有主/次設(shè)備號,主設(shè)備號相同的設(shè)備是同類設(shè)備,使用同一個驅(qū)動程序。

1、Linux設(shè)備驅(qū)動分類

Linux系統(tǒng)將設(shè)備分為三個類:字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)設(shè)備,在這三大類中,字符設(shè)備相對比較簡單,應(yīng)用程序通過字符設(shè)備文件來訪問字符設(shè)備,本講主要介紹字符設(shè)備,如果對塊設(shè)備和網(wǎng)絡(luò)設(shè)備感興趣的話,可以參看相關(guān)資料,并對其進(jìn)行深入了解。

linux字符設(shè)備放在哪個目錄中


2、什么是字符設(shè)備?

字符設(shè)備是指只能一個字節(jié)一個字節(jié)進(jìn)行讀寫操作的設(shè)備,不能隨機(jī)讀取設(shè)備中的某一數(shù)據(jù)、讀取數(shù)據(jù)要按照先后順序。字符設(shè)備是面向流的設(shè)備,常見的字符設(shè)備有鼠標(biāo)、鍵盤、串口、控制臺和LED等。

linux字符設(shè)備放在哪個目錄中

一般每個字符設(shè)備或者塊設(shè)備都會在/dev目錄下對應(yīng)一個設(shè)備文件,并且每個設(shè)備文件都必須有主/次設(shè)備號,主設(shè)備號相同的設(shè)備是同類設(shè)備,使用同一個驅(qū)動程序。

Linux用戶層程序通過設(shè)備文件來使用驅(qū)動程序操作字符設(shè)備或塊設(shè)備。

可以通過

cat /proc/devices

命令查看當(dāng)前已經(jīng)加載的設(shè)備驅(qū)動程序的主設(shè)備號。

linux字符設(shè)備放在哪個目錄中

通過在/dev目錄下執(zhí)行命令

ls -l


可以看到所有設(shè)備文件的主設(shè)備號和次設(shè)備號:

linux字符設(shè)備放在哪個目錄中

對常見設(shè)備文件作如下說明:

/dev/hd[a-t]:IDE設(shè)備

/dev/sd[a-z]:SCSI設(shè)備

/dev/fd[0-7]:標(biāo)準(zhǔn)軟驅(qū)

/dev/md[0-31]:軟raid設(shè)備

/dev/loop[0-7]:本地回環(huán)設(shè)備

/dev/mem:內(nèi)存

/dev/null:無限數(shù)據(jù)接收設(shè)備,相當(dāng)于黑洞

/dev/zero:無限零資源

/dev/tty[0-63]:虛擬終端

/dev/ttyS[0-3]:串口

/dev/lp[0-3]:并口

/dev/console:控制臺

/dev/fb[0-31]:framebuffer

/dev/cdrom => /dev/hdc

/dev/modem => /dev/ttyS[0-9]

/dev/pilot => /dev/ttyS[0-9]


3、如何建立設(shè)備文件?

建立設(shè)備文件有兩種方式,一是通過系統(tǒng)調(diào)用mknod(),編程中調(diào)用該函數(shù)可以建立一個新的設(shè)備文件名,另外一種就是通過mknod命令,命令的第一個參數(shù)為設(shè)備文件名,第二個參數(shù)為設(shè)備類型,比如c表示字符設(shè)備,第三、四個參數(shù)為設(shè)備文件的主設(shè)備號和次設(shè)備號,比如231和0。主設(shè)備號和次設(shè)備號合起來唯一的確定一個設(shè)備,同一個設(shè)備不同類型的主設(shè)備號是一樣的,次設(shè)備號不同,比如一個硬盤的多個分區(qū)就有不同的次設(shè)備號,通過主設(shè)備號就可以把設(shè)備文件與驅(qū)動程序關(guān)聯(lián)起來。

mknod filename type major minor

  • filename:要創(chuàng)建的設(shè)備文件名;

  • type:設(shè)備類型,c代表一個字符設(shè)備,b代表一個塊設(shè)備;

  • major:主設(shè)備號;

  • minor:次設(shè)備號;

4、如何描述字符設(shè)備?

Linux內(nèi)核中抽象出struct cdev結(jié)構(gòu)體來表示一個字符設(shè)備,cdev 定義于 <linux/cdev.h> 中其中,其中最關(guān)鍵的是file_operations結(jié)構(gòu),它是實(shí)現(xiàn)字符設(shè)備的操作集。

struct cdev {
        struct kobject kobj;   //  內(nèi)嵌內(nèi)核對象
        struct module *owner;  //該字符設(shè)備所在的內(nèi)核模塊
        const struct file_operations *ops; //文件操作結(jié)構(gòu)體
        struct list_head list;  //已注冊字符設(shè)備鏈表
        dev_t dev; //由主、次設(shè)備號構(gòu)成的設(shè)備號
        unsigned int count;//同一主設(shè)備號的次設(shè)備號的個數(shù)
};


Linux使用file_operations結(jié)構(gòu)訪問驅(qū)動程序的函數(shù),這個結(jié)構(gòu)的每一個成員的名字都對應(yīng)著一個系統(tǒng)調(diào)用。

struct file_operations {
       struct module *owner;
       loff_t (*llseek) (struct file *, loff_t, int);
       ssize_t (*read) (struct file *, char *, size_t, loff_t *);
       ssize_t (*write) (struct file *, const char *, size_t, loff_t *);
       int (*readdir) (struct file *, void *, filldir_t);
       unsigned int (*poll) (struct file *, struct poll_table_struct *);
       int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
       int (*mmap) (struct file *, struct vm_area_struct *);
       int (*open) (struct inode *, struct file *);
       int (*flush) (struct file *);
       int (*release) (struct inode *, struct file *);
       int (*fsync) (struct file *, struct dentry *, int datasync);
       int (*fasync) (int, struct file *, int);
       int (*lock) (struct file *, int, struct file_lock *);
       ssize_t (*readv) (struct file *, const struct iovec *, unsigned long,loff_t *);
       ssize_t (*writev) (struct file *, const struct iovec *, unsigned long,    loff_t *);
    };


用戶進(jìn)程利用在對設(shè)備文件進(jìn)行諸如read,write操作的時候,系統(tǒng)調(diào)用通過設(shè)備文件的主設(shè)備號找到相應(yīng)的設(shè)備驅(qū)動程序,然后讀取這個數(shù)據(jù)結(jié)構(gòu)相應(yīng)的函數(shù)指針,接著把控制權(quán)交給該函數(shù),這是Linux的設(shè)備驅(qū)動程序工作的基本原理。

5、字符設(shè)備與文件系統(tǒng)的接口

linux字符設(shè)備放在哪個目錄中

如圖,在Linux內(nèi)核中,最左邊, 使用cdev結(jié)構(gòu)體來描述字符設(shè)備;通過其成員dev_t來定義設(shè)備號(分為主、次設(shè)備號)以確定字符設(shè)備的唯一性;通過其成員file_operations來定義字符設(shè)備驅(qū)動提供給虛擬文件系統(tǒng)VFS的接口函數(shù),如常見的open()、read()、write()等,這些函數(shù)真正的操作硬件設(shè)備。

linux字符設(shè)備放在哪個目錄中

在上一個圖的基礎(chǔ)上我們看這個圖,字符設(shè)備驅(qū)動程序是以內(nèi)核模塊的形式加載到內(nèi)核中的,首先模塊加載函數(shù)按靜態(tài)或者動態(tài)方式獲取設(shè)備號;然后字符設(shè)備初始化函數(shù)建立cdev與 file_operations之間的連接, 通過注冊函數(shù)向系統(tǒng)添加一個cdev以完成注冊; 模塊卸載時與加載對應(yīng),要注銷cdev,并釋放設(shè)備號。

在用戶程序中,可以通過系統(tǒng)調(diào)用open(), read(), write()等調(diào)用驅(qū)動程序在內(nèi)核中所實(shí)現(xiàn)的這些函數(shù)。這樣用戶態(tài)到內(nèi)核驅(qū)動之間的通路就打通了。

6、編寫簡單的字符設(shè)備驅(qū)動程序

linux字符設(shè)備放在哪個目錄中

如圖,編寫字符設(shè)備驅(qū)動分為三大步驟:

  1. 驅(qū)動的初始化,其中又分為四個步驟,調(diào)用相關(guān)的函數(shù)達(dá)到。

  2. 實(shí)現(xiàn)設(shè)備的操作,具體的操作取決于你自己所要實(shí)現(xiàn)的功能,這里只列出了基本的操作

  3. 驅(qū)動的注銷,注銷就是釋放資源。

其中調(diào)用的接口函數(shù)功能如下:

linux字符設(shè)備放在哪個目錄中

第1個函數(shù)是分配函數(shù),動態(tài)申請cdev的內(nèi)存,給該結(jié)構(gòu)分配內(nèi)存空間。

第2個函數(shù)是初始化函數(shù),初始化cdev的成員,并建立cdev和file_operations之間關(guān)聯(lián).

第3個函數(shù)注冊cdev設(shè)備對象,也就是把字符設(shè)備添加到字符設(shè)備表中,就像大家入學(xué)時進(jìn)行注冊一樣。

第4個函數(shù)是注銷驅(qū)動程序調(diào)用,將cdev對象從系統(tǒng)中刪除。

第5個函數(shù)釋放cdev數(shù)據(jù)結(jié)構(gòu)所占的內(nèi)存。

6.1 設(shè)備號的申請和釋放

一個字符設(shè)備或塊設(shè)備都有一個主設(shè)備號和一個次設(shè)備號。主設(shè)備號用來標(biāo)識與設(shè)備文件相連的驅(qū)動程序,用來反映設(shè)備類型。次設(shè)備號被驅(qū)動程序用來辨別操作的是哪個設(shè)備,用來區(qū)分同類型的設(shè)備。注冊時申請設(shè)備號,注銷時釋放設(shè)備號,就像大家入學(xué)是有一個學(xué)號,畢業(yè)離開時就釋放掉這個學(xué)號。

linux字符設(shè)備放在哪個目錄中

6.2 用戶空間與內(nèi)核空間數(shù)據(jù)的傳送

當(dāng)我們在用戶程序中調(diào)用read()函數(shù)時,陷入內(nèi)核空間,實(shí)際上要通過內(nèi)核的copy_to_user()函數(shù)把內(nèi)核空間緩沖區(qū)中的數(shù)據(jù)拷貝到用戶空間的緩沖區(qū),反之,當(dāng)我們調(diào)用write()函數(shù)時,內(nèi)核通過調(diào)用copy_from_user()函數(shù)把用戶空間的數(shù)據(jù)拷貝到內(nèi)核緩沖區(qū)。

linux字符設(shè)備放在哪個目錄中

以上就是“l(fā)inux字符設(shè)備放在哪個目錄中”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章名稱:linux字符設(shè)備放在哪個目錄中
本文網(wǎng)址:http://muchs.cn/article48/ihijep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、營銷型網(wǎng)站建設(shè)、、關(guān)鍵詞優(yōu)化微信小程序、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)