<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      三、字符設備驅動(基于北京迅為電子)

      一、概述

      字符設備的驅動包括設備號、字符設備結構體、自動創建設備節點、fops結構體

      二、知識點

      1. 設備號:一個32bit的數據,高12bit表示主設備號,低20bit表示次設備號
      2. 宏定義:MAJOR(dev),MINOR(dev),MKDEV(ma,mi)
      3. 分配設備號:register_chrdev_region、alloc_chrdev_region前者靜態分配設備號,后者動態分配設備號
      4. cat /proc/devices 查看已經分配的設備號
      5. 分配設備號
      register_chrdev_region(dev_t, unsigned, const char*);      // 起始設備號、數量、名稱
      alloc_chrdev_region(dev_t*, unsigned, unsigned, const char*);  // 保存申請到的設備號、起始次設備號、數量、名稱
      unregister_chrdev_region(dev_t, unsigned);                // 要釋放的設備號、要釋放的設備號的數量
      
      1. 注冊一個字符設備
      struct cdev {
      	struct kobject kobj;                    // 父對象
      	struct module *owner;                   // 所有者
      	const struct file_operations *ops;      // fops
      	struct list_head list;                  // 鏈表頭
      	dev_t dev;                              // 設備號
      	unsigned int count;                     // 數量
      } __randomize_layout;
      void cdev_init(struct cdev *, const struct file_operations *);        // 初始化cdev結構體并關聯fops
      int cdev_add(struct cdev *, dev_t, unsigned);        // 關聯設備號和數量,并注冊cdev
      void cdev_del(struct cdev *);                        // 注銷cdev    
      
      1. 文件操作函數結構體
      struct file_operations ;
      應用層的open、read、write、close、ioctl函數均有驅動層的相應函數對應,這些函數指針都放在file_operation結構體中
      
      1. 創建設備節點
      手動創建設備節點 mknod /dev/xxx c 250 0
      struct class *cls = class_create(owner, name);
      void class_destroy(struct class *cls);
      device_create(struct class *cls, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...);
      void device_destroy(struct class *cls, dev_t devt);
      
      1. 用戶空間和內核空間
        通過系統調用、軟中斷、硬件中斷,進程由用戶空間陷入內核空間。兩個空間拷貝數據的API:copy_from_usercopy_to_user
      2. file結構體的私有數據,一般驅動空間中會由一個自定義的結構體,這樣在open時設置file的private_data為該結構體實例對象的指針,在后續的read/write函數中通過訪問file的private_data就可以得到有用數據
      3. container_of(type, struct, name); 通過結構體成員的地址得到結構體的地址
      4. 錯誤處理:使用goto完成不同階段的錯誤處理退出,使用IS_ERR判斷指針是否有效,通過PTR_TO_ERR將錯誤指針返回錯誤

      三、雜項設備

      1. 雜項設備是無法歸類的一系列設備,主設備號都是10,用來避免主設備號的浪費
      2. 雜項設備不需要手動設置設備節點,實現相應的miscdevice結構體,填充name、minor和fops即可(minor使用MISC_DYNAMIC_MINOR表示動態申請次設備號)
      3. 實現miscdevice結構體之后,調用misc_register就可以注冊一個雜項設備并自動生成設備節點
      4. 調用misc_unregister注銷雜項設備

      四、字符設備的驅動框架

      1. 定義cdev結構體
      2. 動態分配一個設備號alloc_chrdev_region
      3. 初始化cdev結構體并添加到系統中cdev_init cdev_add
      4. 設置自動創建設備節點class_create device_create
      5. cdev_init時需要傳入fops,因此需要實現fops的幾個函數,open、read、write等等
      6. 出口函數中需要反過來一步一步地注銷
      posted @ 2025-11-04 23:24  gramming  閱讀(2)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 中文字幕久久国产精品| 蜜臀av一区二区三区日韩| 图片区小说区av区| 亚洲综合一区二区国产精品| 日本一道高清一区二区三区| 日本狂喷奶水在线播放212| 天堂在线精品亚洲综合网| 亚洲AV日韩AV永久无码下载| 安吉县| 无码人妻出轨黑人中文字幕| 亚洲偷自拍另类一区二区| 久久精品日日躁夜夜躁| 国内精品无码一区二区三区| 日韩精品一区二区三区中文无码 | 亚洲一区二区三级av| 人妻系列无码专区免费| 18岁日韩内射颜射午夜久久成人| 国产一区| 2019亚洲午夜无码天堂| 丁香五月亚洲综合在线| 国产成人黄色自拍小视频| 黄色三级亚洲男人的天堂| 国产乱子影视频上线免费观看| 伊人久久大香线蕉av五月天| 激情在线一区二区三区视频| 蜜臀av黑人亚洲精品| 亚洲综合一区无码精品| 国产亚洲中文字幕久久网| 无码精品一区二区三区在线| 亚洲Av综合日韩精品久久久| 国产不卡精品视频男人的天堂 | 精品国产一区二区三区四区阿崩 | 成人国产精品一区二区不卡| 中文字幕在线视频不卡一区二区| 国产在线观看免费观看| 亚洲第一综合天堂另类专| 性色欲情网站| 人妻少妇偷人精品免费看| 激情综合色综合啪啪开心| 国产真人性做爰久久网站| 黄色舔女人逼一区二区三区|