在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內(nèi)不再提示

Linux中字符設備的創(chuàng)建過程

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

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

pYYBAGQdGPeAEphCAAIVKKrvrQU647.jpg

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

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

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

poYBAGQdGPiAFiC_AAFyNy40Lho416.jpg

字符設備一般會創(chuàng)建一個數(shù)據(jù)結(jié)構(gòu),里邊包含了cdev結(jié)構(gòu)、設備數(shù)據(jù)和其他數(shù)據(jù),可以根據(jù)自己實際需求添加。然后創(chuàng)建該結(jié)構(gòu)的指針。

pYYBAGQdGPmABYuMAABJ-JurPcQ055.jpg

分配完設備號,接下來給字符設備數(shù)據(jù)結(jié)構(gòu)分配存儲空間。

poYBAGQdGPqAIqyyAABzDy8zu6A740.jpg

創(chuàng)建設備類

pYYBAGQdGPuAUFHUAABZFW4AR10984.jpg

初始化字符設備、添加字符設備到內(nèi)核和創(chuàng)建設備。

poYBAGQdGPyAa77hAABxK-TFH8Y713.jpg

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

poYBAGQdGP2AUrKEAAB6LZNtqcw826.jpg

結(jié)構(gòu)的定義在頭文件fs.h中,這個結(jié)構(gòu)有很多內(nèi)容,不過常用的就那么幾個。

poYBAGQdGQCASKgpAAXFAPrGEqU681.jpg

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

pYYBAGQdGQCAaDTMAABor8ETizs643.jpg

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

poYBAGQdGQGAbTTrAABy9jkLiP4478.jpg

下面要完成的工作就是實現(xiàn)file_operations結(jié)構(gòu)中的函數(shù)。對于簡單的字符設備,最常見的操作是open、read、write、ioctl、release等。

open函數(shù)這里只是簡單的獲取了一下字符數(shù)據(jù)結(jié)構(gòu)體的指針。container_of函數(shù)很有意思,可以根據(jù)結(jié)構(gòu)成員的地址找到結(jié)構(gòu)體數(shù)據(jù)的地址。

pYYBAGQdGQGAGgqhAAC8u-7JoT0675.jpg

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

poYBAGQdGQOARNECAAGRZZEe8_8363.jpg

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

ioctl函數(shù)實現(xiàn)一些設備獨有操作的函數(shù),i2c設備和spi設備就大量使用了ioctl。

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

具體的實例可以參看Linux源碼中i2c-dev.c中i2c設備驅(qū)動的實現(xiàn)。

pYYBAGQdGQOAZK_8AAJwEz3ZWhw242.jpg

必要的頭文件:

poYBAGQdGQSAPSGwAABuBnhf9Wc076.jpg

編譯模塊并插入到內(nèi)核后,在/dev目錄下會創(chuàng)建對應的設備文件。

pYYBAGQdGQWAMNHSAAGaHO608lY551.jpg

在/sys/class下會創(chuàng)建對應的設備類目錄。

pYYBAGQdGQeARzc4AADE6YVpEmA508.jpg

ok,以上就是簡單的創(chuàng)建字符設備的過程,通過字符設備可以實現(xiàn)內(nèi)核與用戶空間的數(shù)據(jù)交換。學習字符設備的創(chuàng)建也是學習linux驅(qū)動開發(fā)的第一步。

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

    關(guān)注

    13

    文章

    4320

    瀏覽量

    85911
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11312

    瀏覽量

    209739
  • 設備
    +關(guān)注

    關(guān)注

    2

    文章

    4517

    瀏覽量

    70693
  • 字符
    +關(guān)注

    關(guān)注

    0

    文章

    233

    瀏覽量

    25222
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4333

    瀏覽量

    62705
收藏 人收藏

    評論

    相關(guān)推薦

    Linux驅(qū)動開發(fā):字符設備驅(qū)動開發(fā)理論

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

    Linux字符設備驅(qū)動開發(fā)框架介紹

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

    Linux驅(qū)動創(chuàng)建procfs接口的方法

    上篇介紹了Linux驅(qū)動sysfs接口的創(chuàng)建,今天介紹procfs接口的創(chuàng)建
    發(fā)表于 05-31 16:48 ?758次閱讀
    <b class='flag-5'>Linux</b>驅(qū)動<b class='flag-5'>中</b><b class='flag-5'>創(chuàng)建</b>procfs接口的方法

    字符設備驅(qū)動——申請、創(chuàng)建、應用.

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

    雜項設備字符設備的區(qū)別是什么

    文章目錄Linux三大設備驅(qū)動字符設備設備網(wǎng)絡設備雜項設備
    發(fā)表于 12-24 07:42

    嵌入式Linux字符設備驅(qū)動的設計與應用

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

    嵌入式Linux字符設備驅(qū)動的設計與應用

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

    基于linux系統(tǒng)的字符設備驅(qū)動研究與設計_王森

    基于linux系統(tǒng)的字符設備驅(qū)動研究與設計_王森
    發(fā)表于 03-18 09:23 ?1次下載

    基于PXA255開發(fā)板外圍字符設備的嵌入式Linux字符設備驅(qū)動設計與應用

    隨著嵌入式系統(tǒng)的發(fā)展,嵌入式 Linux以其穩(wěn)定性和開放源代碼的優(yōu)點在嵌入式系統(tǒng)的開發(fā)得到廣泛應用。越來越多的軟硬件廠商使用嵌入式 Linux來開發(fā)自己的產(chǎn)品,對基于嵌入式 Linux
    發(fā)表于 08-21 10:19 ?1192次閱讀
    基于PXA255開發(fā)板外圍<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>驅(qū)動設計與應用

    linux字符設備驅(qū)動的關(guān)鍵:自動創(chuàng)建設備及其節(jié)點

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

    你了解過Linux字符設備驅(qū)動框架?

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

    一文帶你掌握Linux字符設備架構(gòu)

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

    Linux字符設備架構(gòu)是如何實現(xiàn)的

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

    如何在Linux系統(tǒng)下自動創(chuàng)建設備節(jié)點

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

    Linux字符設備驅(qū)動開發(fā)方式

    Linux字符設備驅(qū)動開發(fā)模板中介紹了舊版本的驅(qū)動開發(fā)模板,其需要手動分配設備號后,再進行注冊,驅(qū)動加載成功后還需要手動創(chuàng)建設備節(jié)點,比較麻
    的頭像 發(fā)表于 04-14 12:02 ?878次閱讀
    <b class='flag-5'>Linux</b>新<b class='flag-5'>字符</b><b class='flag-5'>設備</b>驅(qū)動開發(fā)方式
    主站蜘蛛池模板: 欧美成人免费观看bbb| 4455亚洲| 免费国产成人午夜私人影视| 日日操操干干| 狠狠操天天操夜夜操| 国产成人夜间影院在线观看| 51视频在线观看免费国产| 亚洲欧美卡通 动漫 丝袜| 欧美69xx性欧美| 午夜湿影院| 永久网站色视频在线观看免费| 99热久| 网全大全黄| 欧美四级在线| 国产无圣光高清一区二区| 97久久天天综合色天天综合色hd| 午夜香蕉视频| 国产美女视频爽爽爽| 亚洲综合激情另类专区 | 国产三级自拍视频| 最近高清在线视频观看免费| 天天操夜夜欢| 在线免费看视频| 久久婷婷激情| 四虎影院美女| 久久亚洲视频| 午夜影院免费观看| 国产高清一级在线观看| 亚洲女同一区二区| 香港日本三级在线播放| 美女视频黄.免费网址| 最新激情网站| 国产小视频在线观看免费| 亚洲乱码一二三四区| 亚洲成人三级电影| 毛片大全在线| 天天综合色天天综合网| 五月激情网站| 在线毛片网站| 久久在精品线影院精品国产| 午夜视频一区|