精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux中字符設備的創建過程

CHANBAEK ? 來源:頭條號科G棧 ? 作者:頭條號科G棧 ? 2023-03-24 11:29 ? 次閱讀

Linux中很多設備都是字符設備,使用ls -l查看/dev下的設備,前面帶c的都是字符設備。

pYYBAGQdGPeAEphCAAIVKKrvrQU647.jpg

字符設備的創建比較容易,而且有一套固定的模式,掌握了模式完全可以“套模板”。更多的精力應該花在業務邏輯的部分。

Linux的每個設備都有一個主設備號和次設備號,創建字符設備第一步就是給它分配設備號。如果是自己用,可以任意給定一個沒有用過的設備號,也可以讓系統自動分配。但是如果要發布給不同的人不同的機器使用,就不能隨便。推薦使用系統自動分配的方式。

下面代碼中根據有沒有給定設備號決定是指定還是自動分配設備號,dev變量里包含了主設備號和次設備號。MKDEV就是將兩個數字合成的。register_chrdev_region()函數注冊字符設備,alloc_chrdev_region()函數自動分配設備號。主設備號是關鍵,次設備號可以看成是該類設備的計數。通過MAJOR()可以得到主設備號。

poYBAGQdGPiAFiC_AAFyNy40Lho416.jpg

字符設備一般會創建一個數據結構,里邊包含了cdev結構、設備數據和其他數據,可以根據自己實際需求添加。然后創建該結構的指針。

pYYBAGQdGPmABYuMAABJ-JurPcQ055.jpg

分配完設備號,接下來給字符設備數據結構分配存儲空間。

poYBAGQdGPqAIqyyAABzDy8zu6A740.jpg

創建設備類

pYYBAGQdGPuAUFHUAABZFW4AR10984.jpg

初始化字符設備、添加字符設備到內核和創建設備。

poYBAGQdGPyAa77hAABxK-TFH8Y713.jpg

這里涉及到一個結構file_operations,這個結構里包含了文件操作函數列表,所有操作這個字符設備的動作函數地址都保存在這個結構里。

poYBAGQdGP2AUrKEAAB6LZNtqcw826.jpg

結構的定義在頭文件fs.h中,這個結構有很多內容,不過常用的就那么幾個。

poYBAGQdGQCASKgpAAXFAPrGEqU681.jpg

如果沒遇到問題,到這里字符設備就創建成功了。如果失敗,就會goto到錯誤處理的地方,這里用goto是因為失敗后要把前面可能申請的資源釋放掉,而且有順序,這里一定要注意。

pYYBAGQdGQCAaDTMAABor8ETizs643.jpg

在exit函數中要有對應的注銷或釋放資源的操作,順序跟創建時相反,后創建的先釋放,先創建的后釋放。

poYBAGQdGQGAbTTrAABy9jkLiP4478.jpg

下面要完成的工作就是實現file_operations結構中的函數。對于簡單的字符設備,最常見的操作是open、read、write、ioctl、release等。

open函數這里只是簡單的獲取了一下字符數據結構體的指針。container_of函數很有意思,可以根據結構成員的地址找到結構體數據的地址。

pYYBAGQdGQGAGgqhAAC8u-7JoT0675.jpg

read函數要實現將內核空間的數據傳到用戶空間的功能,copy_to_user()函數就是干這個的,第一個和第三個參數就是read函數的形參,中間是內核的數據。這里的count是字節個數。

poYBAGQdGQOARNECAAGRZZEe8_8363.jpg

write函數實現的功能與read相反,使用copy_from_user()和memdup_user()函數可以實現。

ioctl函數實現一些設備獨有操作的函數,i2c設備和spi設備就大量使用了ioctl。

release函數就是在設備文件關閉時需要做的操作。這里的關閉是指打開該文件的文件描述符個數為0了,如果不為0只會將計數減1而不會真正調用release函數。

具體的實例可以參看Linux源碼中i2c-dev.c中i2c設備驅動的實現。

pYYBAGQdGQOAZK_8AAJwEz3ZWhw242.jpg

必要的頭文件:

poYBAGQdGQSAPSGwAABuBnhf9Wc076.jpg

編譯模塊并插入到內核后,在/dev目錄下會創建對應的設備文件。

pYYBAGQdGQWAMNHSAAGaHO608lY551.jpg

在/sys/class下會創建對應的設備類目錄。

pYYBAGQdGQeARzc4AADE6YVpEmA508.jpg

ok,以上就是簡單的創建字符設備的過程,通過字符設備可以實現內核與用戶空間的數據交換。學習字符設備的創建也是學習linux驅動開發的第一步。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲
    +關注

    關注

    13

    文章

    4262

    瀏覽量

    85670
  • Linux
    +關注

    關注

    87

    文章

    11227

    瀏覽量

    208924
  • 設備
    +關注

    關注

    2

    文章

    4472

    瀏覽量

    70539
  • 字符
    +關注

    關注

    0

    文章

    232

    瀏覽量

    25173
  • 函數
    +關注

    關注

    3

    文章

    4305

    瀏覽量

    62430
收藏 人收藏

    評論

    相關推薦

    Linux驅動開發:字符設備驅動開發理論

    大部分學習者的最終目的就是學習 Linux驅動開發,Linux的外設驅動可以分為:字符設備驅動、塊設備
    發表于 10-26 09:53 ?1098次閱讀

    Linux字符設備驅動開發框架介紹

    字符設備Linux驅動中最基本的一類設備驅動,字符設備就是一個一個字節,按照字節流進行讀寫操作
    發表于 04-15 11:52 ?1336次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>字符</b><b class='flag-5'>設備</b>驅動開發框架介紹

    Linux驅動創建procfs接口的方法

    上篇介紹了Linux驅動sysfs接口的創建,今天介紹procfs接口的創建
    發表于 05-31 16:48 ?717次閱讀
    <b class='flag-5'>Linux</b>驅動<b class='flag-5'>中</b><b class='flag-5'>創建</b>procfs接口的方法

    字符設備驅動——申請、創建、應用.

    、name :字符串名字,自定義//返回:// 返回一個class指針  創建一個設備文件://創建一個設備文件struct device
    發表于 10-19 17:09

    雜項設備字符設備的區別是什么

    文章目錄Linux三大設備驅動字符設備設備網絡設備雜項設備
    發表于 12-24 07:42

    嵌入式Linux字符設備驅動的設計與應用

    描述了基于嵌入式Linux字符設備驅動程序的設計方法和實現過程。以電機、數碼管、串口和mini鍵盤的驅動設計為例,詳細闡述了嵌入式linux
    發表于 02-23 15:45 ?24次下載

    嵌入式Linux字符設備驅動的設計與應用

    描述了基于嵌入式Linux字符設備驅動程序的設計方法和實現過程。以電機、數碼管、串口和mini鍵盤的驅動設計為例,詳細闡述了嵌入式linux
    發表于 07-14 17:31 ?31次下載

    基于linux系統的字符設備驅動研究與設計_王森

    基于linux系統的字符設備驅動研究與設計_王森
    發表于 03-18 09:23 ?1次下載

    基于PXA255開發板外圍字符設備的嵌入式Linux字符設備驅動設計與應用

    隨著嵌入式系統的發展,嵌入式 Linux以其穩定性和開放源代碼的優點在嵌入式系統的開發得到廣泛應用。越來越多的軟硬件廠商使用嵌入式 Linux來開發自己的產品,對基于嵌入式 Linux
    發表于 08-21 10:19 ?1178次閱讀
    基于PXA255開發板外圍<b class='flag-5'>字符</b><b class='flag-5'>設備</b>的嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>字符</b><b class='flag-5'>設備</b>驅動設計與應用

    linux字符設備驅動的關鍵:自動創建設備及其節點

    Linux內核中所有已分配的字符設備編號都記錄在一個名為 chrdevs 散列表里
    發表于 04-28 15:32 ?2350次閱讀

    你了解過Linux字符設備驅動框架?

    字符設備Linux三大設備之一(另外兩種是塊設備,網絡設備),
    發表于 05-08 14:28 ?448次閱讀

    一文帶你掌握Linux字符設備架構

    一、Linux設備分類 Linux系統為了管理方便,將設備分成三種基本類型: 字符設備
    的頭像 發表于 12-22 16:14 ?2256次閱讀
    一文帶你掌握<b class='flag-5'>Linux</b><b class='flag-5'>字符</b><b class='flag-5'>設備</b>架構

    Linux字符設備架構是如何實現的

    一、Linux設備分類Linux系統為了管理方便,將設備分成三種基本類型:字符設備
    的頭像 發表于 12-24 18:12 ?684次閱讀

    如何在Linux系統下自動創建設備節點

      Linux驅動實驗,通過使用insmod命令加載模塊后,需要通過mknod命令手動創建設備節點,這樣使用起來比較麻煩,并且不可能每個設備都這樣操作,
    的頭像 發表于 11-06 20:18 ?4382次閱讀

    Linux字符設備驅動開發方式

    Linux字符設備驅動開發模板中介紹了舊版本的驅動開發模板,其需要手動分配設備號后,再進行注冊,驅動加載成功后還需要手動創建設備節點,比較麻
    的頭像 發表于 04-14 12:02 ?843次閱讀
    <b class='flag-5'>Linux</b>新<b class='flag-5'>字符</b><b class='flag-5'>設備</b>驅動開發方式