亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Linux服務器 > 正文

linux 驅動編寫之虛擬字符設備的編寫實例詳解

2024-09-05 23:03:32
字體:
來源:轉載
供稿:網友

 linux/201728.html">linux/195490.html">linux 驅動編寫

前言:

 昨天我們說了一些簡單模塊編寫方法,但是終歸沒有涉及到設備的編寫內容,今天我們就可以了解一下相關方面的內容,并且用一個實例來說明在Linux上面設備是如何編寫的。雖然我不是專門做linux驅動的,卻也經常收到一些朋友們的來信。在信件中,很多做驅動的朋友對自己的工作不是很滿意,認為自己的工作就是把代碼拷貝來拷貝去,或者說是改來改去,沒有什么技術含量。有這種想法的朋友不在少數,我想這主要還是因為他們對自己的工作缺少了解導致。如果有可能,我們可以問問自己這樣幾個問題:

    (1)我真的搞懂設備的開發驅動流程了嗎?我是否可以從0開始,編寫一個獨立的驅動代碼呢?
    (2)我真的了解設備的初始化、關閉、運行的流程嗎?
    (3)當前的設備驅動流程是否合理,有沒有可以改進的地方?
    (4)對于內核開發中涉及的api調用,我自己是否真正了解、是否明白它們在使用上有什么區別?
    (5)如果我要驅動的設備只是在一個前后臺系統中運行,在沒有框架幫助的情況下,我是否有信心把它啟動和運行起來?

    當然,上面的內容只是我個人的想法,也不一定都正確。但是,知其然,更要知其所以然,熟悉了當前開發流程的優缺點才能真正掌握和了解驅動開發的本質。這聽上去有些玄乎,其實也很簡單,就是要有一種刨根問底、不斷改進的精神,這樣才能做好自己的工作。因為我們是在pc linux上學習驅動的,因此暫時沒有真實的外接設備可以使用,但是這絲毫不影響我們學習的熱情。通過定時器、進程,我們可以仿真出真實設備的各種需求,所以對于系統來說,它是無所謂真設備、假設備的,基本的處理流程對它來說都是一樣的。只要大家一步一步做下去,肯定可以了解linux驅動設備的開發工程的。

    下面,為了說明問題,我們可以編寫一段簡單的char設備驅動代碼,文件名為char.c,

#include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/cdev.h>  static struct cdev chr_dev; static dev_t ndev;  static int chr_open(struct inode* nd, struct file* filp) {   int major ;   int minor;      major = MAJOR(nd->i_rdev);   minor = MINOR(nd->i_rdev);      printk("chr_open, major = %d, minor = %d/n", major, minor);   return 0; }  static ssize_t chr_read(struct file* filp, char __user* u, size_t sz, loff_t* off) {   printk("chr_read process!/n");   return 0; }  struct file_operations chr_ops = {   .owner = THIS_MODULE,   .open = chr_open,   .read = chr_read };  static int demo_init(void) {   int ret;      cdev_init(&chr_dev, &chr_ops);   ret = alloc_chrdev_region(&ndev, 0, 1, "chr_dev");   if(ret < 0 )   {     return ret;   }      printk("demo_init(): major = %d, minor = %d/n", MAJOR(ndev), MINOR(ndev));   ret = cdev_add(&chr_dev, ndev, 1);   if(ret < 0)   {     return ret;   }      return 0; }  static void demo_exit(void) {   printk("demo_exit process!/n");   cdev_del(&chr_dev);   unregister_chrdev_region(ndev, 1); }  module_init(demo_init); module_exit(demo_exit);  MODULE_LICENSE("GPL"); MODULE_AUTHOR("feixiaoxing@163.com"); MODULE_DESCRIPTION("A simple device example!"); 

    在module_init中的函數是模塊加載時處理的函數,而模塊卸載的函數則是在module_exit中。每一個設備都要對應一個基本的設備數據,當然為了使得這個設備注冊在整個系統當中,我們還需要分配一個設備節點,alloc_chrdev_region就完成這樣一個功能。等到cdev_add的時候,整個設備注冊的過程就全部完成了,就是這么簡單。當然為了編寫這個文件,我們還需要編寫一個Makefile文件,

ifneq ($(KERNELRELEASE),) obj-m := char.o  else PWD := $(shell pwd) KVER := $(shell uname -r) KDIR := /lib/modules/$(KVER)/build all:   $(MAKE) -C $(KDIR) M=$(PWD) modules clean:   rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions modules.* Module.* endif 

    這個Makefile文件和我們之前編寫的makefile基本上沒有區別,唯一的區別就是文件名稱改成了char.o,僅此而已。為了編寫模塊,我們直接輸入make即可。這時候,char.ko文件就可以生成了。然后,模塊需要被注冊在系統當中,insmod char.ko是少不了的。如果此時,我們還不確信是否模塊已經加入到系統當中,完全可以通過輸入lsmod | grep char進行查找和驗證。為了創建設備節點,我們需要知道設備為我們創建的major、minor數值是多少,所以dmesg | tail 查找一下數值。在我hp的機器上,這兩個數值分別是249和0,所以下面可以利用它們直接創建設備節點了,輸入mknod /dev/chr_dev c 249 0即可,此時可以輸入ls /dev/chr_dev驗證一下。那么,按照這種方法,真的可以訪問這個虛擬設備了嗎,我們可以編寫一段簡單的代碼驗證一下,

#include <stdio.h> #include <fcntl.h> #include <unistd.h>  #define CHAR_DEV_NAME "/dev/chr_dev"  int main() {   int ret;   int fd;   char buf[32];    fd = open(CHAR_DEV_NAME, O_RDONLY | O_NDELAY);   if(fd < 0)   {     printf("open failed!/n");     return -1;   }      read(fd, buf, 32);   close(fd);      return 0; } 

    代碼的內容非常簡單,就是利用CHAR_DEV_NAME直接打開設備,讀寫設備。當然。首先還是需要對這個文件進行編譯,文件名為test.c,輸入gcc test.c -o test,其次就是運行這個文件,直接輸入./test即可。如果沒有問題的話,那么說明我們的代碼是ok的,但是我們還是沒有看到任何內容。沒關系,我們還是通過dmesg這個命令查看內核中是否存在相關的打印內容,直接輸入dmesg | tail即可。此時如果沒有意外的話,我們就可以看到之前在chr_open和chr_read中留下的printk打印,這說明我們的代碼完全是ok的。

    上面的代碼只是一段小例子,真實的內容要比這復雜一下。不過既然我們都已經入門了,那么后面的內容其實也沒有什么好怕的了。最后有兩個事情補充一下:(1)如果大家在創建節點后想刪除設備節點,直接rm -rf /dev/chr_dev即可;(2)上面這段代碼的原型來自于《深入linux設備驅動程序內核機制》這本書,稍作修改,如果大家對內核機制的內容感興趣,可以參考這本書的內容。

 感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线观看亚洲视频| 黄网站色欧美视频| 久久精品国产成人| 日韩av123| 亚洲的天堂在线中文字幕| 国产欧美精品一区二区| 久久91亚洲精品中文字幕| 国内精久久久久久久久久人| 成人性生交大片免费看视频直播| 国产精品久久久久久久久久东京| 久热精品视频在线观看一区| 欧美自拍视频在线观看| 日韩在线免费视频| 欧洲成人在线视频| 午夜精品一区二区三区视频免费看| 91精品视频观看| 中文字幕免费精品一区高清| 亚洲一区中文字幕在线观看| 久久精品久久久久久| 成人黄色大片在线免费观看| 国产精品91久久久| 日本欧美爱爱爱| 黑人巨大精品欧美一区二区一视频| 中文字幕久热精品在线视频| 亚洲国产成人在线视频| 亚洲欧美日韩中文在线制服| 日韩精品在线免费| 国产精品久久二区| 最近更新的2019中文字幕| 日韩欧美国产激情| 亚洲黄页视频免费观看| 国产精品十八以下禁看| 97久久超碰福利国产精品…| 国产精品一区二区久久| 欧美日韩精品中文字幕| 日本久久久久亚洲中字幕| 国产在线观看91精品一区| 日韩av电影国产| 色视频www在线播放国产成人| 在线电影av不卡网址| 性欧美xxxx视频在线观看| 最近的2019中文字幕免费一页| 中文字幕亚洲二区| 欧美日韩免费在线观看| 欧美高清在线播放| 欧美又大又粗又长| 日韩欧美亚洲成人| 欧美午夜性色大片在线观看| 国产欧美久久一区二区| 日韩www在线| 高清视频欧美一级| 欧美一区二区视频97| 色青青草原桃花久久综合| 午夜精品视频网站| 午夜精品久久久久久久男人的天堂| 2018中文字幕一区二区三区| 国产精品日韩久久久久| 国产精品一区专区欧美日韩| 日韩av在线网页| 青青草原一区二区| 国产精品美女免费看| 欧美国产日韩视频| 国语对白做受69| 国产成人精品日本亚洲专区61| 成人精品视频在线| 日韩精品中文字幕久久臀| 国产午夜精品全部视频在线播放| 久久中国妇女中文字幕| 日韩高清电影好看的电视剧电影| 亚洲视频精品在线| 日韩国产精品亚洲а∨天堂免| 亚洲精品国产福利| 日韩欧美aaa| 成人av电影天堂| 成人妇女淫片aaaa视频| 欧美视频在线观看免费网址| 久久久久久国产精品美女| 性视频1819p久久| 一区国产精品视频| 国产亚洲精品久久久优势| yellow中文字幕久久| 一区二区欧美激情| 亚洲第一精品久久忘忧草社区| 九九精品在线视频| 欧美日韩国产麻豆| 伊人久久综合97精品| 精品国产31久久久久久| 日韩风俗一区 二区| 亚洲精品电影网在线观看| 亚洲欧美日本伦理| 久久成人一区二区| 久久视频国产精品免费视频在线| 亚洲国产精品人久久电影| 欧美日韩高清在线观看| 国产精品嫩草影院一区二区| 欧美高清在线视频观看不卡| 亚洲欧美精品一区二区| 久久精品91久久香蕉加勒比| 日韩欧美成人区| 在线观看久久av| 国产精品美女无圣光视频| 精品中文字幕在线观看| 日本三级韩国三级久久| 久久久成人精品| 日韩精品免费在线| 久久精品在线播放| 久久天天躁日日躁| 日本精品性网站在线观看| 97免费视频在线播放| 在线成人激情视频| 日韩av在线免费观看| 亚洲国内精品视频| 欧美另类99xxxxx| 日韩欧美一区二区三区| 亚洲人成啪啪网站| 97精品欧美一区二区三区| 91精品在线影院| 热久久99这里有精品| 91精品国产沙发| 久久久免费精品| 欧美日在线观看| 日本成人免费在线| 992tv在线成人免费观看| 亚洲综合中文字幕在线观看| 亚洲自拍小视频| 欧美乱妇40p| 91豆花精品一区| 亚洲国模精品一区| 日本免费久久高清视频| 欧美大荫蒂xxx| 国产精品色悠悠| 日韩在线观看免费高清完整版| 91视频九色网站| 日韩免费高清在线观看| 91免费看片在线| 久久久久久这里只有精品| 在线不卡国产精品| 日本亚洲欧洲色| 亚洲激情国产精品| 免费91麻豆精品国产自产在线观看| 一区二区三区无码高清视频| 久久精品国产2020观看福利| 久久影院免费观看| 亚洲免费电影一区| 国产在线精品播放| 久久电影一区二区| 久久视频在线观看免费| 91精品啪在线观看麻豆免费| 欧美在线性视频| 欧美精品成人91久久久久久久| 亚洲第一福利在线观看| 97国产真实伦对白精彩视频8| 精品综合久久久久久97| 久久在精品线影院精品国产| 亚洲最新中文字幕| 国产精品一区二区三| 欧美国产日韩在线| 亚洲精品国产精品国自产观看浪潮| 亚洲天堂成人在线| 日韩免费观看高清| 色偷偷偷亚洲综合网另类| 日韩成人中文字幕在线观看| 国产91色在线|| 92福利视频午夜1000合集在线观看|