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

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

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

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

CHANBAEK ? 來(lái)源:頭條號(hào)科G棧 ? 作者:頭條號(hào)科G棧 ? 2023-03-24 11:29 ? 次閱讀

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

pYYBAGQdGPeAEphCAAIVKKrvrQU647.jpg

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

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

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

poYBAGQdGPiAFiC_AAFyNy40Lho416.jpg

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

pYYBAGQdGPmABYuMAABJ-JurPcQ055.jpg

分配完設(shè)備號(hào),接下來(lái)給字符設(shè)備數(shù)據(jù)結(jié)構(gòu)分配存儲(chǔ)空間。

poYBAGQdGPqAIqyyAABzDy8zu6A740.jpg

創(chuàng)建設(shè)備類

pYYBAGQdGPuAUFHUAABZFW4AR10984.jpg

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

poYBAGQdGPyAa77hAABxK-TFH8Y713.jpg

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

poYBAGQdGP2AUrKEAAB6LZNtqcw826.jpg

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

poYBAGQdGQCASKgpAAXFAPrGEqU681.jpg

如果沒(méi)遇到問(wèn)題,到這里字符設(shè)備就創(chuàng)建成功了。如果失敗,就會(huì)goto到錯(cuò)誤處理的地方,這里用goto是因?yàn)槭『笠亚懊婵赡苌暾?qǐng)的資源釋放掉,而且有順序,這里一定要注意。

pYYBAGQdGQCAaDTMAABor8ETizs643.jpg

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

poYBAGQdGQGAbTTrAABy9jkLiP4478.jpg

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

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

pYYBAGQdGQGAGgqhAAC8u-7JoT0675.jpg

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

poYBAGQdGQOARNECAAGRZZEe8_8363.jpg

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

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

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

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

pYYBAGQdGQOAZK_8AAJwEz3ZWhw242.jpg

必要的頭文件:

poYBAGQdGQSAPSGwAABuBnhf9Wc076.jpg

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

pYYBAGQdGQWAMNHSAAGaHO608lY551.jpg

在/sys/class下會(huì)創(chuàng)建對(duì)應(yīng)的設(shè)備類目錄。

pYYBAGQdGQeARzc4AADE6YVpEmA508.jpg

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

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

    關(guān)注

    13

    文章

    4123

    瀏覽量

    85276
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207912
  • 設(shè)備
    +關(guān)注

    關(guān)注

    2

    文章

    4347

    瀏覽量

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

    關(guān)注

    0

    文章

    230

    瀏覽量

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

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61969
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux驅(qū)動(dòng)開(kāi)發(fā):字符設(shè)備驅(qū)動(dòng)開(kāi)發(fā)理論

    大部分學(xué)習(xí)者的最終目的就是學(xué)習(xí) Linux驅(qū)動(dòng)開(kāi)發(fā),Linux的外設(shè)驅(qū)動(dòng)可以分為:字符設(shè)備驅(qū)動(dòng)、塊設(shè)備
    發(fā)表于 10-26 09:53 ?979次閱讀

    Linux字符設(shè)備驅(qū)動(dòng)開(kāi)發(fā)框架介紹

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

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

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

    字符設(shè)備驅(qū)動(dòng)——申請(qǐng)、創(chuàng)建、應(yīng)用.

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

    雜項(xiàng)設(shè)備字符設(shè)備的區(qū)別是什么

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

    嵌入式Linux字符設(shè)備驅(qū)動(dòng)的設(shè)計(jì)與應(yīng)用

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

    嵌入式Linux字符設(shè)備驅(qū)動(dòng)的設(shè)計(jì)與應(yīng)用

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

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

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

    基于PXA255開(kāi)發(fā)板外圍字符設(shè)備的嵌入式Linux字符設(shè)備驅(qū)動(dòng)設(shè)計(jì)與應(yīng)用

    隨著嵌入式系統(tǒng)的發(fā)展,嵌入式 Linux以其穩(wěn)定性和開(kāi)放源代碼的優(yōu)點(diǎn)在嵌入式系統(tǒng)的開(kāi)發(fā)得到廣泛應(yīng)用。越來(lái)越多的軟硬件廠商使用嵌入式 Linux來(lái)開(kāi)發(fā)自己的產(chǎn)品,對(duì)基于嵌入式 Linux
    發(fā)表于 08-21 10:19 ?1140次閱讀
    基于PXA255開(kāi)發(fā)板外圍<b class='flag-5'>字符</b><b class='flag-5'>設(shè)備</b>的嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>字符</b><b class='flag-5'>設(shè)備</b>驅(qū)動(dòng)設(shè)計(jì)與應(yīng)用

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

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

    你了解過(guò)Linux字符設(shè)備驅(qū)動(dòng)框架?

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

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

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

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

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

    如何在Linux系統(tǒng)下自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)

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

    Linux字符設(shè)備驅(qū)動(dòng)開(kāi)發(fā)方式

    Linux字符設(shè)備驅(qū)動(dòng)開(kāi)發(fā)模板中介紹了舊版本的驅(qū)動(dòng)開(kāi)發(fā)模板,其需要手動(dòng)分配設(shè)備號(hào)后,再進(jìn)行注冊(cè),驅(qū)動(dòng)加載成功后還需要手動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn),比較麻
    的頭像 發(fā)表于 04-14 12:02 ?770次閱讀
    <b class='flag-5'>Linux</b>新<b class='flag-5'>字符</b><b class='flag-5'>設(shè)備</b>驅(qū)動(dòng)開(kāi)發(fā)方式