国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

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

2019-11-02 16:53:56
字體:
來源:轉載
供稿:網友

 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文件,

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大丰市| 黎川县| 彰化市| 简阳市| 柘荣县| 西盟| 南江县| 上林县| 宁夏| 高安市| 滦南县| 抚顺市| 漯河市| 竹山县| 叙永县| 原阳县| 惠东县| 安宁市| 遂溪县| 上饶县| 清徐县| 溧阳市| 张家川| 亳州市| 辽阳市| 湘乡市| 潞城市| 株洲市| 墨竹工卡县| 绩溪县| 崇州市| 西青区| 怀柔区| 托克托县| 惠来县| 汤原县| 克什克腾旗| 道真| 九寨沟县| 砀山县| 灵川县|