色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

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

電子設(shè)計 ? 來源:電子設(shè)計 ? 作者:電子設(shè)計 ? 2020-12-24 18:12 ? 次閱讀

一、Linux設(shè)備分類

Linux系統(tǒng)為了管理方便,將設(shè)備分成三種基本類型:

字符設(shè)備塊設(shè)備網(wǎng)絡(luò)設(shè)備字符設(shè)備:

字符(char)設(shè)備是個能夠像字節(jié)流(類似文件)一樣被訪問的設(shè)備,由字符設(shè)備驅(qū)動程序來實現(xiàn)這種特性。字符設(shè)備驅(qū)動程序通常至少要實現(xiàn)open、close、read和write的系統(tǒng)調(diào)用。

字符終端(/dev/console)和串口(/dev/ttyS0以及類似設(shè)備)就是兩個字符設(shè)備,它們能很好的說明“流”這種抽象概念。

字符設(shè)備可以通過文件節(jié)點來訪問,比如/dev/tty1和/dev/lp0等。這些設(shè)備文件和普通文件之間的唯一差別在于對普通文件的訪問可以前后移動訪問位置,而大多數(shù)字符設(shè)備是一個只能順序訪問的數(shù)據(jù)通道。然而,也存在具有數(shù)據(jù)區(qū)特性的字符設(shè)備,訪問它們時可前后移動訪問位置。例如framebuffer就是這樣的一個設(shè)備,app可以用mmap或lseek訪問抓取的整個圖像。

在/dev下執(zhí)行l(wèi)s -l ,可以看到很多創(chuàng)建好的設(shè)備節(jié)點:

字符設(shè)備文件(類型為c),設(shè)備文件是沒有文件大小的,取而代之的是兩個號碼:主設(shè)備號5 +次設(shè)備號1 。

塊設(shè)備:

和字符設(shè)備類似,塊設(shè)備也是通過/dev目錄下的文件系統(tǒng)節(jié)點來訪問。塊設(shè)備(例如磁盤)上能夠容納filesystem。在大多數(shù)的Unix系統(tǒng)中,進行I/O操作時塊設(shè)備每次只能傳輸一個或多個完整的塊,而每塊包含512字節(jié)(或2的更高次冪字節(jié)的數(shù)據(jù))。

Linux可以讓app像字符設(shè)備一樣地讀寫塊設(shè)備,允許一次傳遞任意多字節(jié)的數(shù)據(jù)。因此,塊設(shè)備和字符設(shè)備的區(qū)別僅僅在于內(nèi)核內(nèi)部管理數(shù)據(jù)的方式,也就是內(nèi)核及驅(qū)動程序之間的軟件接口,而這些不同對用戶來講是透明的。在內(nèi)核中,和字符驅(qū)動程序相比,塊驅(qū)動程序具有完全不同的接口。

塊設(shè)備文件(類型為b):

網(wǎng)絡(luò)設(shè)備:

任何網(wǎng)絡(luò)事物都需要經(jīng)過一個網(wǎng)絡(luò)接口形成,網(wǎng)絡(luò)接口是一個能夠和其他主機交換數(shù)據(jù)的設(shè)備。接口通常是一個硬件設(shè)備,但也可能是個純軟件設(shè)備,比如回環(huán)(loopback)接口。

網(wǎng)絡(luò)接口由內(nèi)核中的網(wǎng)絡(luò)子系統(tǒng)驅(qū)動,負責發(fā)送和接收數(shù)據(jù)包。許多網(wǎng)絡(luò)連接(尤其是使用TCP協(xié)議的連接)是面向流的,但網(wǎng)絡(luò)設(shè)備卻圍繞數(shù)據(jù)包的傳送和接收而設(shè)計。網(wǎng)絡(luò)驅(qū)動程序不需要知道各個連接的相關(guān)信息,它只要處理數(shù)據(jù)包即可。

由于不是面向流的設(shè)備,因此將網(wǎng)絡(luò)接口映射到filesystem中的節(jié)點(比如/dev/tty1)比較困難。

Unix訪問網(wǎng)絡(luò)接口的方法仍然是給它們分配一個唯一的名字(比如eth0),但這個名字在filesystem中不存在對應(yīng)的節(jié)點。內(nèi)核和網(wǎng)絡(luò)設(shè)備驅(qū)動程序間的通信,完全不同于內(nèi)核和字符以及塊驅(qū)動程序之間的通信,內(nèi)核調(diào)用一套和數(shù)據(jù)包相關(guān)的函數(shù)socket,也叫套接字。

查看網(wǎng)絡(luò)設(shè)備使用命令ifconfig:

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

在Linux的世界里面一切皆文件,所有的硬件設(shè)備操作到應(yīng)用層都會被抽象成文件的操作。我們知道如果應(yīng)用層要訪問硬件設(shè)備,它必定要調(diào)用到硬件對應(yīng)的驅(qū)動程序。Linux內(nèi)核中有那么多驅(qū)動程序,應(yīng)用層怎么才能精確的調(diào)用到底層的驅(qū)動程序呢?

在這里我們字符設(shè)備為例,來看一下應(yīng)用程序是如何和底層驅(qū)動程序關(guān)聯(lián)起來的。必須知道的基礎(chǔ)知識:

1.在Linux文件系統(tǒng)中,每個文件都用一個struct inode結(jié)構(gòu)體來描述,這個結(jié)構(gòu)體里面記錄了這個文件的所有信息,例如:文件類型,訪問權(quán)限等。

2.在Linux操作系統(tǒng)中,每個驅(qū)動程序在應(yīng)用層的/dev目錄下都會有一個設(shè)備文件和它對應(yīng),并且該文件會有對應(yīng)的主設(shè)備號和次設(shè)備號。

3.在Linux操作系統(tǒng)中,每個驅(qū)動程序都要分配一個主設(shè)備號,字符設(shè)備的設(shè)備號保存在struct cdev結(jié)構(gòu)體中。

struct cdev {
struct kobject kobj;
struct module *owner;
const struct file_operations *ops;//接口函數(shù)集合
struct list_head list;//內(nèi)核鏈表
dev_t dev; //設(shè)備號
unsigned int count;//次設(shè)備號個數(shù)
};
4.在Linux操作系統(tǒng)中,每打開一次文件,Linux操作系統(tǒng)在VFS層都會分配一個struct file結(jié)構(gòu)體來描述打開的這個文件。該結(jié)構(gòu)體用于維護文件打開權(quán)限、文件指針偏移值、私有內(nèi)存地址等信息。

注意:

常常我們認為struct inode描述的是文件的靜態(tài)信息,即這些信息很少會改變。而struct file描述的是動態(tài)信息,即在對文件的操作的時候,struct file里面的信息經(jīng)常會發(fā)生變化。典型的是struct file結(jié)構(gòu)體里面的f_pos(記錄當前文件的位移量),每次讀寫一個普通文件時f_ops的值都會發(fā)生改變。

這幾個結(jié)構(gòu)體關(guān)系如下圖所示:

通過上圖我們可以知道,如果想訪問底層設(shè)備,就必須打開對應(yīng)的設(shè)備文件。也就是在這個打開的過程中,Linux內(nèi)核將應(yīng)用層和對應(yīng)的驅(qū)動程序關(guān)聯(lián)起來。

1.當open函數(shù)打開設(shè)備文件時,可以根據(jù)設(shè)備文件對應(yīng)的struct inode結(jié)構(gòu)體描述的信息,可以知道接下來要操作的設(shè)備類型(字符設(shè)備還是塊設(shè)備)。還會分配一個struct file結(jié)構(gòu)體。

2.根據(jù)struct inode結(jié)構(gòu)體里面記錄的設(shè)備號,可以找到對應(yīng)的驅(qū)動程序。這里以字符設(shè)備為例。在Linux操作系統(tǒng)中每個字符設(shè)備有一個struct cdev結(jié)構(gòu)體。此結(jié)構(gòu)體描述了字符設(shè)備所有的信息,其中最重要一項的就是字符設(shè)備的操作函數(shù)接口。

3.找到struct cdev結(jié)構(gòu)體后,Linux內(nèi)核就會將struct cdev結(jié)構(gòu)體所在的內(nèi)存空間首地記錄在struct inode結(jié)構(gòu)體的i_cdev成員中。將struct cdev結(jié)構(gòu)體的中記錄的函數(shù)操作接口地址記錄在struct file結(jié)構(gòu)體的f_op成員中。

4.任務(wù)完成,VFS層會給應(yīng)用層返回一個文件描述符(fd)。這個fd是和struct file結(jié)構(gòu)體對應(yīng)的。接下來上層的應(yīng)用程序就可以通過fd來找到strut file,然后在由struct file找到操作字符設(shè)備的函數(shù)接口了。

三、字符驅(qū)動相關(guān)函數(shù)分析*

* cdev_init() - initialize a cdev structure
* @cdev: the structure to initialize
* @fops: the file_operations for this device

* Initializes @cdev, remembering @fops, making it ready to add to the
* system with cdev_add().

void cdev_init(struct cdev *cdev, const struct file_operations *fops)
功能:
初始化cdev結(jié)構(gòu)體
參數(shù)
@cdev cdev結(jié)構(gòu)體地址
@fops 操作字符設(shè)備的函數(shù)接口地址
返回值:


* register_chrdev_region() - register a range of device numbers
* @from: the first in the desired range of device numbers; must include
* the major number.
* @count: the number of consecutive device numbers required
* @name: the name of the device or driver.

* Return value is zero on success, a negative error code on failure.

int register_chrdev_region(dev_t from, unsigned count, const char *name)
功能:
注冊一個范圍()的設(shè)備號
參數(shù):
@from 設(shè)備號
@count 注冊的設(shè)備個數(shù)
@name 設(shè)備的名字
返回值:
成功返回0,失敗返回錯誤碼(負數(shù))

* cdev_add() - add a char device to the system
* @p: the cdev structure for the device
* @dev: the first device number for which this device is responsible
* @count: the number of consecutive minor numbers corresponding to this
* device

* cdev_add() adds the device represented by @p to the system, making it
* live immediately. A negative error code is returned on failure.

int cdev_add(struct cdev *p, dev_t dev, unsigned count)
功能:
添加一個字符設(shè)備到操作系統(tǒng)
參數(shù):
@p cdev結(jié)構(gòu)體地址
@dev 設(shè)備號
@count 次設(shè)備號個數(shù)
返回值:
成功返回0,失敗返回錯誤碼(負數(shù))

* cdev_del() - remove a cdev from the system
* @p: the cdev structure to be removed

* cdev_del() removes @p from the system, possibly freeing the structure
* itself.

void cdev_del(struct cdev *p)
功能:
從系統(tǒng)中刪除一個字符設(shè)備
參數(shù):
@p cdev結(jié)構(gòu)體地址
返回值:

static inline int register_chrdev(unsigned int major, const char *name,
const struct file_operations *fops)
功能:
注冊或者分配設(shè)備號,并注冊fops到cdev結(jié)構(gòu)體,
如果major>0,功能為注冊該主設(shè)備號,
如果major=0,功能為動態(tài)分配主設(shè)備號。
參數(shù):
@m(xù)ajor : 主設(shè)備號
@name : 設(shè)備名稱,執(zhí)行 cat /proc/devices顯示的名稱
@fops : 文件系統(tǒng)的接口指針
返回值
如果major>0 成功返回0,失敗返回負的錯誤碼
如果major=0 成功返回主設(shè)備號,失敗返回負的錯誤碼

該函數(shù)實現(xiàn)了對cdev的初始化和注冊的封裝,所以調(diào)用該函數(shù)之后就不需要自己操作cdev了。

相對的注銷函數(shù)為unregister_chrdev

static inline void unregister_chrdev(unsigned int major, const char *name)

審核編輯:符乾江


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

    關(guān)注

    87

    文章

    11310

    瀏覽量

    209597
  • 應(yīng)用層
    +關(guān)注

    關(guān)注

    0

    文章

    46

    瀏覽量

    11509
  • Struct
    +關(guān)注

    關(guān)注

    0

    文章

    31

    瀏覽量

    10878
收藏 人收藏

    評論

    相關(guān)推薦

    基于risc-v架構(gòu)的芯片與linux系統(tǒng)兼容性討論

    一定的兼容性挑戰(zhàn),但并非不可克服。通過針對RISC-V架構(gòu)進行編譯和優(yōu)化Linux內(nèi)核、確保硬件接口兼容、支持平臺特性、提供適用的編譯工具鏈和二進制格式以及構(gòu)建完整的生態(tài)系統(tǒng)等措施,可以實現(xiàn)
    發(fā)表于 11-30 17:20

    Linux網(wǎng)絡(luò)協(xié)議棧的實現(xiàn)

    請求并與底層的網(wǎng)絡(luò)硬件進行交互。本文將深入探討 Linux 網(wǎng)絡(luò)協(xié)議棧的架構(gòu)實現(xiàn),涵蓋數(shù)據(jù)包處理流程、關(guān)鍵模塊、協(xié)議棧層次以及性能優(yōu)化等方面。
    的頭像 發(fā)表于 09-10 09:51 ?319次閱讀
    <b class='flag-5'>Linux</b>網(wǎng)絡(luò)協(xié)議棧的<b class='flag-5'>實現(xiàn)</b>

    labview字符串如何轉(zhuǎn)換為16進制字符

    在LabVIEW中,將字符串轉(zhuǎn)換為16進制字符串是一個常見的需求,尤其是在處理數(shù)據(jù)通信和硬件接口時。LabVIEW提供了多種方法來實現(xiàn)這一轉(zhuǎn)換,包括使用內(nèi)置函數(shù)、編寫VI(Virtual
    的頭像 發(fā)表于 09-04 15:54 ?2513次閱讀

    labview中如何實現(xiàn)字符串換行

    1. 字符串換行的基本概念 在LabVIEW中,字符串換行通常指的是在字符串中插入換行符,使得字符串在顯示或輸出時能夠自動換行。這在創(chuàng)建用戶界面或處理文本數(shù)據(jù)時非常有用。 2.
    的頭像 發(fā)表于 09-04 15:47 ?1732次閱讀

    labview中如何實現(xiàn)字符串選擇輸出

    在LabVIEW中實現(xiàn)字符串選擇輸出是一項常見的任務(wù),它涉及到字符串處理、條件判斷和用戶界面設(shè)計等多個方面。由于LabVIEW是一種圖形化編程語言,其編程方式與傳統(tǒng)的文本編程語言有所不同,因此
    的頭像 發(fā)表于 09-04 15:44 ?955次閱讀

    linux系統(tǒng)的設(shè)備驅(qū)動一般分幾類

    Linux系統(tǒng)的設(shè)備驅(qū)動是操作系統(tǒng)與硬件設(shè)備之間的橋梁,負責實現(xiàn)操作系統(tǒng)與硬件設(shè)備之間的通信和控制。Li
    的頭像 發(fā)表于 08-30 15:13 ?444次閱讀

    Linux設(shè)備驅(qū)動程序分類有哪些

    Linux設(shè)備驅(qū)動程序是操作系統(tǒng)與硬件設(shè)備之間的橋梁,負責實現(xiàn)硬件設(shè)備與操作系統(tǒng)之間的通信和控制。Lin
    的頭像 發(fā)表于 08-30 15:11 ?581次閱讀

    linux驅(qū)動程序如何加載進內(nèi)核

    Linux系統(tǒng)中,驅(qū)動程序是內(nèi)核與硬件設(shè)備之間的橋梁。它們允許內(nèi)核與硬件設(shè)備進行通信,從而實現(xiàn)對硬件設(shè)備的控制和管理。 驅(qū)動程序的編寫 驅(qū)
    的頭像 發(fā)表于 08-30 15:02 ?486次閱讀

    Linux 驅(qū)動開發(fā)與應(yīng)用開發(fā),你知道多少?

    一、Linux驅(qū)動開發(fā)與應(yīng)用開發(fā)的區(qū)別開發(fā)層次不同:Linux驅(qū)動開發(fā)主要是針對硬件設(shè)備進行編程,處于操作系統(tǒng)內(nèi)核層,直接與硬件交互,為上層應(yīng)用提供設(shè)備訪問的接口。
    的頭像 發(fā)表于 08-30 12:16 ?799次閱讀
    <b class='flag-5'>Linux</b> 驅(qū)動開發(fā)與應(yīng)用開發(fā),你知道多少?

    虹科干貨 |?多設(shè)備協(xié)同無憂:Linux環(huán)境下PCAN固定設(shè)備ID/通道分配指南

    插入順序的影響。繼往期文章介紹了Windows環(huán)境下的實現(xiàn)方法后,本文將詳細介紹如何在Linux環(huán)境中CharDev和NetDev兩種模式下,通過PCAN實現(xiàn)設(shè)備ID和通道的固定分配,
    的頭像 發(fā)表于 06-11 15:03 ?471次閱讀
    虹科干貨 |?多<b class='flag-5'>設(shè)備</b>協(xié)同無憂:<b class='flag-5'>Linux</b>環(huán)境下PCAN固定<b class='flag-5'>設(shè)備</b>ID/通道分配指南

    ArmSoM系列板卡 嵌入式Linux驅(qū)動開發(fā)實戰(zhàn)指南 之 字符設(shè)備驅(qū)動

    字符設(shè)備驅(qū)動 本章,我們將學習字符設(shè)備使用、字符設(shè)備驅(qū)動相關(guān)的概念,理解
    的頭像 發(fā)表于 04-10 09:53 ?1072次閱讀
    ArmSoM系列板卡 嵌入式<b class='flag-5'>Linux</b>驅(qū)動開發(fā)實戰(zhàn)指南 之 <b class='flag-5'>字符</b><b class='flag-5'>設(shè)備</b>驅(qū)動

    微信Linux原生版在龍架構(gòu)平臺終端成功啟動運行

    近日,在騰訊微信團隊、龍芯中科與國產(chǎn)操作系統(tǒng)廠商的共同努力下,微信Linux原生版在龍架構(gòu)平臺終端成功啟動運行,并在操作系統(tǒng)廠商應(yīng)用商店上架分發(fā),為用戶帶來全新的龍架構(gòu)平臺使用體驗。
    的頭像 發(fā)表于 03-19 16:32 ?884次閱讀
    微信<b class='flag-5'>Linux</b>原生版在龍<b class='flag-5'>架構(gòu)</b>平臺終端成功啟動運行

    arm架構(gòu)和x86架構(gòu)區(qū)別 linux是x86還是arm

    ARM架構(gòu)和x86架構(gòu)是兩種不同的計算機處理器架構(gòu),它們在體系結(jié)構(gòu)、指令集、應(yīng)用領(lǐng)域等方面有著明顯的區(qū)別。Linux操作系統(tǒng)則具有廣泛的適配性,可以運行在各種
    的頭像 發(fā)表于 01-30 13:46 ?1.9w次閱讀

    Linux內(nèi)核中信號詳解

    ? 1 信號的角色 1.1 x86/64架構(gòu)信號定義 1.2 ARM架構(gòu)信號定義 1.3 RISC-V架構(gòu)信號定義 1.4 信號的系統(tǒng)調(diào)用 1.5 信號工作原理 2 信號的響應(yīng)行為 3 POSIX
    的頭像 發(fā)表于 01-13 09:40 ?1396次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核中信號詳解

    Linux內(nèi)核內(nèi)存管理架構(gòu)解析

    內(nèi)存管理子系統(tǒng)可能是linux內(nèi)核中最為復(fù)雜的一個子系統(tǒng),其支持的功能需求眾多,如頁面映射、頁面分配、頁面回收、頁面交換、冷熱頁面、緊急頁面、頁面碎片管理、頁面緩存、頁面統(tǒng)計等,而且對性能也有很高
    的頭像 發(fā)表于 01-04 09:24 ?667次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核內(nèi)存管理<b class='flag-5'>架構(gòu)</b>解析
    主站蜘蛛池模板: 亚洲天码中字| 最近中文字幕免费高清MV视频6| 亚洲国产精品一区二区久久第| FREEHDXXXX学生妹| 久久国产欧美日韩精品免费| 忘忧草在线影院WWW日本动漫| avv天堂| 久久无码AV亚洲精品色午夜麻豆| 亚洲AV无码一区二区色情蜜芽| 丰满的寡妇hd高清在线观看| 欧美疯狂做受xxxxx喷水| 在线少女漫画| 久久re6热在线视频精品| 亚洲精品无码久久久久A片| 国产精品国产三级国产专区53| 日本高清天码一区在线播放| 99久久全国免费久久爱| 理论片87福利理论电影| 永久午夜福利视频一区在线观看| 韩国伦理三级| 亚洲精品成人AV在线观看爽翻| 国产精品丰满人妻AV麻豆| 日韩亚洲国产中文字幕欧美| WWWXXXX兽交| 噼里啪啦免费观看视频大全| beeg日本老妇人| 免费观看高清黄页网址大全| 40分钟超爽大片黄| 美女搞鸡网站| 92看看福利午夜影院| 蜜臀AV熟女人妻中文字幕| 18女下面流水不遮网站免费| 两个吃奶一个添下面视频| 中国xxxxxxxxx孕交| 久久综合伊人 magnet| 最近的2019中文字幕HD| 老师的丝袜脚| 96精品视频| 无码观看AAAAAAAA片| 国产精品久久久久久亚洲毛片 | 久久亚洲精品成人|