日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

(五)Linux之设备驱动模型

發(fā)布時間:2025/3/8 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (五)Linux之设备驱动模型 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

        • (一)Linux內(nèi)核驅(qū)動簡介
        • (二)雜項設備驅(qū)動模型
            • (1)相關接口
            • (2)雜項設備注冊過程
        • (三)早期經(jīng)典字符設備驅(qū)動模型
            • (1)相關接口
            • (2)雜項設備注冊過程
        • (二)雜項和早期經(jīng)典的區(qū)別

(一)Linux內(nèi)核驅(qū)動簡介

對于剛接觸linux驅(qū)動的同學來說,應該思考一個問題就是為什么要有Linux內(nèi)核驅(qū)動呢?原因就是Linux內(nèi)核對設備的驅(qū)動編寫進行了規(guī)范。

我們在linux系統(tǒng)的/dev目錄下可以查看設備節(jié)點文件,這些節(jié)點文件是怎么存在的也是值得思考的,本篇文章將會講解一個雜項設備驅(qū)動模型、早期經(jīng)典字符設備驅(qū)動模型,都是針對字符設備進行講解的。


通過ls選項看到,文件權限前面的符號表示該文件是字符設備文件、塊設備文件或者其他的,每一個設備文件都有一個主設備號和一個次設備號

主設備號:標識設備的類型,標識具體的某一類設備,如usb設備為一類設備 次設備號:標識某一類設備中的具體的某一個設備,如我的金士頓U盤

驅(qū)動程序為程序員開發(fā)后放入內(nèi)核的功能模塊,所以驅(qū)動程序本身不屬于內(nèi)核的一部分,導致在向內(nèi)核添加驅(qū)動功能的時候需要向內(nèi)核提出申請,即注冊操作。

(二)雜項設備驅(qū)動模型

雜項設備:主設備號固定為10 的設備稱為在下個設備,Linux驅(qū)動中把無法歸類的五花八門的設備定義為混雜設備(用miscdevice結構體表述)。miscdevice共享一個主設備號MISC_MAJOR(即10),但次設備號不同。

(1)相關接口

int misc_register(struct miscdevice * misc)

int:返回值,成功返回0,失敗返回負數(shù) struct miscdevice * misc:設備結構體struct miscdevice {int minor; //次設備號 // 當minor的值為255的時候內(nèi)核會自動分配次設備號,// 一般采用此方法,因為自己指定容易和已有的次設備號沖突 const char *name; //設備節(jié)點名 const struct file_operations *fops;//文件操作指針結構體struct list_head list; //雜項設備鏈表,使用者不用關心struct device *parent; //父設備類,無需關心struct device *this_device; //本設備,無需關心const char *nodename; //節(jié)點名umode_t mode; //權限};

注冊雜項設備需要關心的參數(shù):
int minor; //次設備號
const char *name; //設備節(jié)點名
const struct file_operations *fops;//文件操作指針結構體

struct file_operations結構體如下:

struct file_operations {struct module *owner; //一般賦值為THIS_MODULEloff_t (*llseek) (struct file *, loff_t, int);/*ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);char __user *:內(nèi)核空間讀取到文件中的數(shù)據(jù),直接傳遞到用戶空間調(diào)用的read接口中ssize_t read(int fd, void *buf, size_t count);buf中的數(shù)據(jù)即來源于 char __user **//*ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);const char __user *:用戶層調(diào)用的write接口向文件寫入的數(shù)據(jù)ssize_t write(int fd, const void *buf, size_t count);buf中的數(shù)據(jù)直接傳遞到了const char __user *size_t:數(shù)據(jù)的大小loff_t *指的是寫入數(shù)據(jù)的偏移量 */unsigned int (*poll) (struct file *, struct poll_table_struct *);long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);int (*open) (struct inode *, struct file *);int (*release) (struct inode *, struct file *);//內(nèi)核中的release等同于系統(tǒng)的closeint (*fsync) (struct file *, loff_t, loff_t, int datasync);int (*fasync) (int, struct file *, int);int (*lock) (struct file *, int, struct file_lock *); }; 以int (*open) (struct inode *, struct file *);為例: open指針指向的函數(shù)是用來接收系統(tǒng)層調(diào)用的open函數(shù)所傳遞的參數(shù)值 struct inode *:保存文件屬性的 struct file *:保存文件操作中的數(shù)據(jù)
(2)雜項設備注冊過程
  • 定以struct miscdevice 并初始化
  • 定以struct file_operations并初始化
  • 使用misc_register(struct miscdevice * misc)進行注冊
  • 注銷-------在模塊程序中的卸載函數(shù)中進行注銷操作
  • 下面以一個例子講解,重點看注冊函數(shù)misc_register:
    miscdevice.c

    #include <linux/kernel.h> #include <linux/module.h> #include <linux/miscdevice.h> #include <linux/fs.h>#define MISCDEVICE_NAME "miscdevice"ssize_t misc_read(struct file * fp , char __user * buf, size_t size, loff_t * offset) {printk("this is misc read\n");return 0; } ssize_t misc_write(struct file * fp , char __user * buf, size_t size, loff_t * offset) {printk("this is misc write\n");return 0; }int misc_release (struct inode * node, struct file * fp) {printk("this is misc release \n");return 0; } int misc_open(struct inode * node, struct file * fp) {printk("this is misc open \n");return 0; }struct file_operations fp= { .read=misc_read, .write=misc_write, .release=misc_release, .open =misc_open };struct miscdevice misc = {.minor = 255,.name = MISCDEVICE_NAME,.fops=&fp }; static int __init miscdevice_init(void) {printk("miscdevice init success\n");misc_register(&misc);//注冊雜項設備return 0; }static void __exit miscdevice_cleanup(void) {printk("miscdevice exit success\n");misc_deregister(&misc);//注銷雜項設備 } module_init(miscdevice_init); module_exit(miscdevice_cleanup); MODULE_LICENSE("GPL");

    以上注冊和注銷都依賴于模塊化編程,不懂的可以參考:Linux內(nèi)核模塊化編程

    編寫系統(tǒng)調(diào)用函數(shù)
    misc_app.c

    #include<stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int main(int argc, char *argv[]) {int fd= open(argv[1],O_RDWR);if(fd== -1){perror("open");return -1;}write(fd,"hell",4);close(fd);return 0; }

    Makfile

    CFLAG = -C TARGET = miscdevice APP=misc_app KERNEL = /mydriver/linux-3.5 obj-m +=$(TARGET).oall:make $(CFLAG) $(KERNEL) M=$(PWD)arm-linux-gcc -o $(APP) $(APP).c clean:make $(CFLAG) $(KERNEL) M=$(PWD) cleanrm $(APP)

    使用交叉編譯器編譯msic_app.c后,并且剛剛編寫的miscdevice.c編譯成模塊后
    啟動tiny4412開發(fā)板查看

    注意:

    • 1、注冊成功會在根文件系統(tǒng)的dev目錄下產(chǎn)生一個指定的節(jié)點文件
    • 2、設備驅(qū)動模型中的接口(文件操作接口)只有上層接口調(diào)用的時候才會有效果
    • 3、操作驅(qū)動模型對應的設備只需序打開該設備對應的節(jié)點文件名

    (三)早期經(jīng)典字符設備驅(qū)動模型

    (1)相關接口

    int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops)

    static inline int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops) {return __register_chrdev(major, 0, 256, name, fops); }* @major: major device number or 0 for dynamic allocation* 主設備號或者0用來自動分配 * @baseminor: first of the requested range of minor numbers 默認為0 * 申請設備號的起始次設備號,在此處默認為0 * @count: the number of minor numbers required * 申請次設備號的個數(shù) * @name: name of this range of devices * 申請設備號對應的設備名 * @fops: file operations associated with this devices * 文件操作結構體

    static inline void unregister_chrdev(unsigned int major, const char *name)

    static inline void unregister_chrdev(unsigned int major, const char *name) {__unregister_chrdev(major, 0, 256, name); }
    (2)雜項設備注冊過程
  • 定以并初始化struct file_operations
  • 在模塊的加載函數(shù)中對驅(qū)動模型進行注冊register_chrdev
  • 在模塊的注銷函數(shù)中注銷早期設備驅(qū)動模型unregister_chrdev
  • 下面以例子進行講解,重點看注冊函數(shù)register_chrdev:

    char_device.c: #include <linux/kernel.h> #include <linux/module.h> #include <linux/fs.h> int major =0; ssize_t chr_read (struct file * fp, char __user * buf, size_t size, loff_t * offset ) {printk(" this is read\n");return 0; } ssize_t chr_write (struct file * fp, char __user * buf, size_t size, loff_t * offset ) {printk(" this is write\n");return 0; } int chr_close (struct inode * node , struct file * file ) {printk(" this is close\n");return 0; } int chr_open (struct inode * node , struct file * file) {printk(" this is open\n");return 0; } struct file_operations fp={.read =chr_read, .write =chr_write,.release =chr_close,.open =chr_open, }; static int __init chardev_init(void) {major = register_chrdev(0, "ming", &fp);printk("this is module init,major =%d\n",major);return 0; } static void __exit chardev_cleanup(void) {unregister_chrdev(major,"ming");printk("this is module exit\n"); } module_init(chardev_init); module_exit(chardev_cleanup); MODULE_LICENSE("GPL");

    關于測試函數(shù)同雜項設備的misc_app.c和Makefile,在此不重復寫了,下面看現(xiàn)象

    (二)雜項和早期經(jīng)典的區(qū)別

    • 1、雜項設備的主設備號固定位10,,早期經(jīng)典設備的主設備號是0-255除10外
    • 2、雜項設備的一個設備對應一個次設備號,而早期經(jīng)典的模型中,一旦申請成功,則該主設備號下的所有次設備號均對應一個設備,次設備號的范圍為0-255

    本文章僅供學習交流用禁止用作商業(yè)用途,文中內(nèi)容來水枂編輯,如需轉(zhuǎn)載請告知,謝謝合作

    微信公眾號:zhjj0729

    微博:文藝to青年

    總結

    以上是生活随笔為你收集整理的(五)Linux之设备驱动模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 婷婷tv| 最新自拍偷拍 | 神马久久午夜 | 成人免费性生活视频 | 九九看片 | 欧美午夜精品理论片a级按摩 | 欧美成人r级一区二区三区 中文无码一区二区三区在线观看 | av色成人 | 精品午夜一区二区 | 开心激情亚洲 | 女人私密又肥又大 | 99精品视频一区二区三区 | 台湾150部性三级 | 成人a区| 香蕉久久夜色精品升级完成 | 九九精品免费视频 | 欧美综合自拍 | 高清一区二区视频 | 91蝌蚪91九色 | 日韩欧av | 综合网在线观看 | 免费视频成人 | 亚洲人一区二区三区 | 婷婷毛片| 国产又粗又大又硬 | xxxxxx日本 | 国产69精品麻豆 | 成人六区| 91网页入口 | 在线综合视频 | av色片 | 山村淫强伦寡妇 | 啪啪网免费| 天天综合网天天综合色 | 色导航| 天天爽天天搞 | 日本黄色性视频 | 91久久精 | 欧美日韩国内 | 乱码一区二区三区 | 女人做爰全过程免费观看美女 | 日本欧美www | 一区二区美女 | 亚洲一区二区三区91 | xxxx69国产| 99热这里只有精品2 91免费版黄 | av导航网站 | 天天爽天天色 | 99re免费视频精品全部 | 亚洲成人av免费观看 | 亚洲免费毛片 | www欧美| 久草免费在线观看视频 | 伊人99热| 欧洲av一区 | 精品久久网 | 激情插插| 日韩在线免费视频观看 | 免费黄视频网站 | 久久精品国产电影 | 波多野结衣电影在线播放 | 丝袜熟女一区二区 | 69精品久久久久久久 | 日本三级网站在线观看 | 婷婷久久久久久 | 欧美乱妇狂野欧美在线视频 | 亚洲www视频| 一级α片免费看刺激高潮视频 | 日韩爱爱网站 | 国产成人一区二区在线 | 亚洲区成人 | 少妇高潮毛片色欲ava片 | 国产一区二区精品久久 | 亚洲精品日韩在线观看 | 713电影免费播放国语 | 婷婷色综合网 | 神马午夜视频 | 香蕉91视频 | 污片免费在线观看 | 91av一区二区三区 | 欧美xxxⅹ性欧美大片 | 中文字幕欧美色图 | 诱惑の诱惑筱田优在线播放 | 一区二区三区视频 | 色图在线观看 | 久久久久久久蜜桃 | 日韩无 | 在办公室被c到呻吟的动态图 | 免费视频爱爱太爽 | 国产一在线观看 | 国产精品又黄又爽又色无遮挡 | 一本一道久久a久久精品综合 | 亚洲图片自拍偷拍 | 在线观看麻豆 | 国产一级片免费视频 | 欧美黄色精品 | 中国一级特黄录像播放 | 催眠调教艳妇成肉便小说 | 日本大乳奶做爰 |