字符驅動編寫(字符驅動程序)

    本文主要介紹字符驅動編程(字符驅動程序),下面一起看看字符驅動編程(字符驅動程序)相關資訊。
    在上一篇文章中,我記錄了字符設備的發展。來讀寫內存數據,但是有一個問題。設備的創建依賴于手動mknod。無論改進與否,設備的自動創建都可以通過直接加載驅動程序來完成。這里增加了class_create的創建,實現驅動的加載,設備創建,同步觸發。對于基于平臺的設備,這樣的創建也是可以接受的。代碼附錄如下:
    include linux/module . hinc lude linux/types . hinc lude linux/fs . hinc lude linux/errno . hinc lude linux/mm . hinc lude linux/sched . hinc lude linux/init . hinc lude linux/cdev . hinc lude linux/uaccess . hinc lude linux/slab . hdefine globamem _ size 0x 1000 define mem _ clear 0x 1 define global mem _ major 0 define ins mod _ create _ devstatic int global mem _ major = global mem靜態結構類* gmem _ class
    /* globalmem設備結構*/structglobalmem _ dev { structcdev cdev;無符號字符mem[globamem _ size];};
    struct global mem _ dev global mem _ devp;/文件打開函數*/int global mem _ open(struct inode * inode,struct file filp){//filp-private _ data = global mem _ devp;返回0;}/文件釋放函數*/int global mem _ release(struct inode * inode,struct file * filp){ return 0;}
    /* ioctl設備控制函數*/staticlongglobalmem _ ioctl(struct file * filp,unsigned int cmd,unsigned long arg) {//stru)ct global mem _ dev dev = filp-private _ data;/獲取設備結構指針*/
    switch(cmd){ case mem _ clear:mem set(dev-mem,0,globamem _ size);printk(kern _ info globalmem被設置為零);打破;default : return-einval;}返回0;}
    /* read function */static size _ t global mem _ read(struct file * filp,char _ _ user * buf,size _ t size,loft _ t * ppos) {
    無符號長p = * pposunsigned int count = sizeint ret = 0;struct global mem _ dev * dev = filp-private _ data;/*獲取設備結構指針*/ if (p = globamem_size)返回0;if(count globamem _ size-p)count = globamem _ size-p;/*內核空間-用戶空間*/if (copy _ to _ user (buf,(void *) (dev-memp),count)){ ret = efault;} else { * ppos = countret =計數;printk(kern _ info 從%lu讀取%u字節\ n ,計數,p);ret返回;} static ssize _ t global mem _ write(struct file * filp,const char __user *buf,size_t size,loff_t *ppos){
    無符號長p = * pposunsigned int count = sizeint ret = 0;struct global mem _ dev * dev = filp-private _ data;/*獲取設備結構指針*/ if (p = globamem_size)返回0;如果(計數globamem _ size-p)count = globamem _ size-p;/*用戶空間-內核空間*/if(copy _ from _ user((void *)(dev-memp),buf,count)){ ret = e fault;} else { * ppos = countret =計數;printk(kern _ info 從%lu寫入%u字節\ n ,計數,p);ret返回;} static loff _ t global mem _ ll seek(struct file * filp,loff_t offset,int orig){
    int ret = 0;struct global mem _ dev * dev = filp-private _ data;/*獲取設備結構指針*/ret ret;}/*文件操作結構*/static construct file _ operationglobalmem _ fops = {。owner = this _ module,。llseek = globalmem _ llseek,。read = globalmem _ read,。write = globalmem_write,。unlocked_ioctl = globalmem_ioctl,。open = globalmem_open,。release = globalmem_release,};
    /*初始化并注冊cdev */staticvoid全局mem _ setup _ cdev (struct全局mem _ dev * dev,int index) {interr,devno = mkdev(全局mem _ major,index);cdev_init(dev-cdev,global mem _ fops);dev-cdev . owner = this _ module;err = cdev_add(dev-cdev,devno,1);if(err)printk(kern _ notice 添加globalmem %d時出現錯誤% d ,err,index);}
    /*設備驅動程序模塊加載函數*/int globalmem_init(void){
    我fdef ins mod _ create _ devglobalmem _ major = register _ chrdev(0, gmem ,global mem _ fops);gmem _ class = class _ create(this _ module gmem );device_create(gmem_class,null,mkdev(globalmem_major,0),null, mgem );/*/dev/led */global mem _ devp = kmalloc(sizeof(struct global mem _ dev),gfp _ kernel);如果(!globalmem_devp) {/*應用程序失敗*/printk(kern _ notice 錯誤kmalloc失敗 );}返回0;elseint結果;dev _ t devno = mkdev(global mem _ major,0);//* devno = (25020) | 0 *//* *應用設備號*/if(global mem _ major)result = register _ chrdev _ region(devno,1, 全球記憶 );else {/*動態應用設備編號*/result = alloc _ chr dev _ region(devno,0,1 全球記憶與記憶);global mem _ major = major(devno);}if(結果0)返回結果;/*動態申請設備結構的內存*/global mem _ devp = kmalloc(sizeof(structglobalmem _ dev),gfp _ kernel);如果(!globalmem_devp) {/*應用程序失敗*/result =-eno mem;goto fail _ malloc}memset (globalmem_devp,0,sizeof(struct global mem _ dev));global mem _ setup _ cdev(global mem _ devp,0);返回0;fail _ malloc: unregister _ chrdev _ region(devno,1);返回result
    endif}
    /*模塊卸載函數*/void globalmem_exit(void){
    ifdef ins mod _ create _ dev unregister _ chrdev(global mem _ major, gmem );device_destroy(gmem_class,mkdev(globalmem_major,0));class _ destroy(gmem _ class);elsecdev _ del(global mem _ devp-cdev);/*注銷cdev */kfree(global mem _ devp);/*釋放設備結構的內存*/unregister _ chrdev _ region(mkdev(global mem _ major,0),1);/*發布設備號*/endif}
    模塊作者( 傅立葉和傅立葉變換);模塊許可證( 雙bsd/gpl );
    module_param(globalmem_major,int,s _ i rugo);
    module_init(全局內存_初始化);模塊_出口(全局內存_出口);
    標簽:
    設備結構
    了解更多字符驅動編程(字符驅動程序)相關內容請關注本站點。

    硬盤最大容量是多大,硬盤最大是多少G
    辦公電腦性價比排行2021(日常辦公電腦性價比高的)
    蘋果手機怎么改字體的大小(蘋果手機怎樣修改字體大小)
    光遇安卓跟蘋果可以加好友嗎(光遇安卓和蘋果能加好友嗎)
    電腦yy怎么開游戲直播視頻教程(電腦yy怎么開直播視頻)
    字符驅動編寫(字符驅動程序)
    qq懸浮窗魅藍怎么設置,qq懸浮窗如何設置
    vb中的mod(vb中mod的用法)
    windows7右鍵菜單清理(win7鼠標右鍵新建菜單清理)
    聯想電腦怎么分盤win11,我新買一臺聯想筆記本電腦怎么分盤啊
    征服s8的對講怎么使用,怎么用三星s8的耳機說話
    哪一款移動硬盤好用又實惠
    oppoa92s參數詳細參數(oppoa92s參數zol)
    硒鼓跟碳粉盒是一個東西嗎怎么用(硒鼓跟碳粉盒是一個東西嗎圖片)
    oppor7呼吸燈怎么調顏色
    戴爾待機黑屏喚不醒,電腦休眠后無法喚醒 黑屏
    酷開電視怎么下載應用(酷開電視怎么下載應用商店)
    lnk是什么文件格式(ink文件是什么意思)
    宮格位推送是什么意思(什么叫宮格位)
    魅族來電鈴聲怎么設置,魅族18pro怎么設置鈴聲
    主站蜘蛛池模板: 精品一区二区三区免费| 视频在线一区二区| 一区二区三区视频| 男人的天堂亚洲一区二区三区| 亚洲免费一区二区| 亚洲日本中文字幕一区二区三区| 夜夜添无码一区二区三区| 国产一区二区三区在线电影| 海角国精产品一区一区三区糖心| 亚洲AV无码一区东京热| 国产无套精品一区二区| 精品乱子伦一区二区三区高清免费播放| 国产成人精品日本亚洲专一区| 精品乱人伦一区二区三区| 国产伦精品一区二区三区视频金莲| 国产福利无码一区在线| 亚洲午夜精品一区二区麻豆| 日韩免费一区二区三区在线| 乱子伦一区二区三区| 性色AV一区二区三区| 91午夜精品亚洲一区二区三区| 性色av一区二区三区夜夜嗨| 一区高清大胆人体| 久久人妻av一区二区软件| 久久久久人妻精品一区蜜桃| 久久久综合亚洲色一区二区三区| 中文字幕精品一区二区三区视频| 日韩少妇无码一区二区三区| 国产精品成人一区二区| 日韩人妻无码一区二区三区久久99 | 免费视频精品一区二区三区| 熟妇人妻系列av无码一区二区| 亚洲一区二区三区偷拍女厕 | 少妇无码一区二区三区免费| 高清一区二区三区免费视频| 亚洲一区在线观看视频| 亚洲AV无码一区二区乱子仑| 天堂va在线高清一区| 精品不卡一区中文字幕 | 国产拳头交一区二区| 久久婷婷色综合一区二区|