linux將所有的裝置都看做【檔案】,並且以操作檔案的方法來【訪問】裝置。所以有字元裝置這麼一說,用控制檔案乙個乙個字元的思路去控制乙個硬體。
整個系統從上到下可以分為以下這麼幾個部分:
linux的外設可以分為以下3類:(對,就只有3類)
字元裝置
能夠像位元組流(比如檔案)一樣被訪問的裝置,就是說它的讀寫是以位元組為單位的。字元裝置的驅動程式實現了open、close、read、write等系統呼叫。
塊裝置這個裝置上面的資料以塊的形式存放,如flash。內次都得讀寫乙個塊才可以,那有人就要問了,為啥要用這麼麻煩的東西啊,只能一塊一塊的進行資料的訪問。答案就是,flash便宜。rom可以乙個位元組乙個位元組的讀取,但是太貴了。flash就很便宜啊,所以廠商愛用flash來替代rom。你說廠商是奸商?哈哈那你就是還忘了有機械硬碟這種東西了xd,能用上flash就知足吧~
網路介面
這個東西同事具有字元裝置、塊裝置的部分特點。網路介面的輸入/輸出是有結構要求的,不是隨隨便便乙個位元組乙個位元組的有效資料直接輸進來的,網路介面的資料輸入是以「報文」「包」「幀」這樣的形式輸入到系統中的。網路介面的「塊」又不是像塊裝置一樣的「塊」是固定的,他的塊可大可小。
我們可以將驅動程式靜態編譯進核心中,當然我們還可以將驅動程式看做乙個【模組】,然後在需要使用這個【模組】的時候進行載入。在配置核心的時候, 如果配置項被設定為m,那麼就表示它將會被編譯成為乙個【模組】。【模組】的擴充套件名為【.ko】(好牛皮的副檔名word天)。我們可以使用【insmod】命令(linux下的命令,我們可以直接在ubuntu的終端中輸入insmod)對其進行載入,然後也可以使用【rmmod】命令對其進行解除安裝,還可以使用【lsmod】命令檢視核心中已經載入了哪些模組。
##字元裝置驅動程式中重要的資料結構和函式
對於整個嵌入式作業系統中的系統呼叫,驅動程式之中都有乙個與之相對應的函式。對於字元裝置驅動程式,這些函式集合在乙個file_operations
型別的資料結構中。file_operations
結構在linux核心的include/linux/fs.h
中。
struct file_operations
int open(const char *pathname, int flags);
int ioctl(ind d, int request, ...);
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
int (*open) (struct inode *, struct file *);
int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
#define ioctl_led_on 0
#define ioctl_led_off 1
int main(int argc, char **argv)
linux裝置驅動程式 字元裝置驅動程式
先留個 有一起學習驅動程式的加qq295699450 字元裝置驅動 這篇比較惱火。載入成功,但是讀不出來資料,有知道怎麼回事的,留個言,一起討論下 資料結構 struct scull mem struct scull dev dev 整個驅動程式 如下 include include include...
Linux裝置驅動程式 字元裝置驅動程式
1.檢視主裝置號,次裝置號 進入 dev目錄執行ls l,第四,五列分別為主次裝置號,10,180,1,5,這些是主裝置號,而60,63這些就是次裝置號 130 shell android dev ls l crw rw r system radio 10,60 1969 12 31 21 00 a...
Linux裝置驅動程式 字元裝置驅動程式設計
linux對裝置的操作與對檔案的操作是一樣的,可以看到乙個裝置所對應的檔案。我們平時用的read write等函式也可以用於裝置檔案。字元裝置 以字元為單位 按照順利操作 沒有快取區,故不支援隨機讀寫 例外 幀快取裝置,如顯示卡,是可以隨機訪問的 裝置號由主裝置號與次裝置號組成。主裝置號標識裝置對應...