######1。概要######
デバイス モデルでは、バス、デバイス、デバイス ドライバーなどはすべて実際のものに対応しており、すべてのロジックがこれらのエンティティを中心に配置されているため、比較的理解しやすいです。ただし、この記事で説明するクラスは、デバイスの共通性を抽象化するために仮想化されているため、多少異なります。
たとえば、同じような年齢で同じような知識を習得する必要がある人が集まって勉強する場合、クラスを形成します。このクラスには独自の名前 (「295」など) を付けることができますが、それを構成する生徒 (デバイス) がなければ意味がありません。また、授業の存在の最大の意義は何でしょうか?どのコースも講師が丁寧に指導します!教師が話す必要があるのは 1 回だけであるため、クラスの生徒全員がそれを聞くことができます。生徒全員が自宅で勉強している場合、この方法で生徒を指導するために生徒ごとに教師が雇われることになります。内容はほとんど同じなので、非常にもったいないです。
デバイス モデルのクラスは同様の機能を提供します。たとえば、一部の同様のデバイス (学生) は、ユーザー空間に同様のインターフェイス (コース) を提供する必要があります。各デバイス ドライバーを 1 回実装する必要がある場合、カーネル内に大量の冗長コードが発生し、非常に無駄になります。したがって、クラスは「使用方法を知っている限り、実装を手伝いましょう。」と言いました。
2. データ構造の説明
2.1 構造体クラス
struct クラスはクラスの抽象化であり、その定義は次のとおりです:リーリー #「
」
実際、構造体クラスと構造体バスは非常に似ており、次のように説明されます:構造は次のように定義されます:name (クラスの名前) は、「/sys/class/」ディレクトリに反映されます。 クラスのデフォルト属性である class_atrrs は、クラスがカーネルに登録されるときに、対応する属性ファイルを「/sys/class/xxx_class」の下に自動的に作成します。
dev_attrs、このクラスの各デバイスの属性は、デバイスがカーネルに登録されるときに、デバイスの sysfs ディレクトリに対応する属性ファイルを自動的に作成します。
dev_bin_attrs は、dev_attrs と同様、単なるバイナリ型の属性です。
dev_kobj は、このクラス配下のデバイスの /sys/dev/ 配下のディレクトリを示します。現在、一般的に char と block の 2 種類があり、dev_kobj が NULL の場合、デフォルトで char が選択されます。
dev_uevent、このクラスのデバイスが変更されると、クラスの uevent コールバック関数が呼び出されます。
class_release、リリース自体に使用されるコールバック関数。
dev_release。リリース クラス内のデバイスのコールバック関数として使用されます。 device_release インターフェイスでは、デバイス、デバイス タイプ、およびデバイスが配置されているクラスをチェックして、リリース インターフェイスが登録されているかどうかを確認し、登録されている場合は、対応するリリース インターフェイスを呼び出してデバイス ポインターを解放します。
p は、「Linux デバイス モデル (6)_Bus」の構造体バス構造と同じであるため、説明を省略します。
」 #2.2 構造体クラスインターフェイスstruct class_interface は、クラスの下でデバイスが追加または削除されたときに、クラス ドライバーが事前に設定されたコールバック関数 (add_dev および Remove_dev) を呼び出すことを可能にする構造体です。それで、彼らに電話してどうするのですか?必要な操作 (デバイス名の変更など) を行うことができ、それは特定のクラス ドライバーによって実装されます。
1: /* include/linux/device.h, line 434 */
2: struct class_interface {
3: struct list_head node;
4: struct class *class;
5:
6: int (*add_dev) (struct device *, struct class_interface *);
7: void (*remove_dev) (struct device *, struct class_interface *);
8: };
3. 功能及内部逻辑解析
3.1 class的功能
看完上面的东西,蜗蜗依旧糊里糊涂的,class到底提供了什么功能?怎么使用呢?让我们先看一下现有Linux系统中有关class的状况(这里以input class为例):
“
root@android:/ # ls /sys/class/input/ -l
lrwxrwxrwx root root 2014-04-23 03:39 event0 -> ../../devices/platform/i2c-gpio.17/i2c-17/17-0066/max77693-muic/input/input0/event0
lrwxrwxrwx root root 2014-04-23 03:39 event1 -> ../../devices/platform/gpio-keys.0/input/input1/event1
lrwxrwxrwx root root 2014-04-23 03:39 event10 -> ../../devices/virtual/input/input10/event10
lrwxrwxrwx root root 2014-04-23 03:39 event2 -> ../../devices/platform/s3c2440-i2c.3/i2c-3/3-0048/input/input2/event2
…
lrwxrwxrwx root root 2014-04-23 03:39 event8 -> ../../devices/platform/soc-audio/sound/card0/input8/event8
lrwxrwxrwx root root 2014-04-23 03:39 event9 -> ../../devices/platform/i2c-gpio.8/i2c-8/8-0020/input/input9/event9
lrwxrwxrwx root root 2014-04-23 03:39 input0 -> ../../devices/platform/i2c-gpio.17/i2c-17/17-0066/max77693-muic/input/input0
…
lrwxrwxrwx root root 2014-04-23 03:39 mice -> ../../devices/virtual/input/miceroot@android:/ # ls /sys/devices/platform/s3c2440-i2c.3/i2c-3/3-0048/input/input2/event2/ -l
-r–r–r– root root 4096 2014-04-23 04:08 dev
lrwxrwxrwx root root 2014-04-23 04:08 device -> ../../input2
drwxr-xr-x root root 2014-04-23 04:08 power
lrwxrwxrwx root root 2014-04-23 04:08 subsystem -> ../../../../../../../../class/input
-rw-r–r– root root 4096 2014-04-23 04:08 ueventroot@android:/ # ls /sys/devices/virtual/input/mice/ -l
-r–r–r– root root 4096 2014-04-23 03:57 dev
drwxr-xr-x root root 2014-04-23 03:57 power
lrwxrwxrwx root root 2014-04-23 03:57 subsystem -> ../../../../class/input
-rw-r–r– root root 4096 2014-04-23 03:57 uevent”
看上面的例子,发现input class也没做什么实实在在的事儿,它(input class)的功能,仅仅是:
- 在/sys/class/目录下,创建一个本class的目录(input)
- 在本目录下,创建每一个属于该class的设备的符号链接(如,把“sys/devices/platform/s3c2440-i2c.3/i2c-3/3-0048/input/input2/event2”设备链接到”/sys/class/input/event2”),这样就可以在本class目录下,访问该设备的所有特性(即attribute)
- 另外,device在sysfs的目录下,也会创建一个subsystem的符号链接,链接到本class的目录
算了,我们还是先分析一下Class的核心逻辑都做了哪些事情,至于class到底有什么用处,可以在后续具体的子系统里面(如input子系统),更为细致的探讨。
3.2 class的注册
“
class的注册,是由__class_register接口(它的实现位于”drivers/base/class.c, line 609″)实现的,它的处理逻辑和bus的注册类似,主要包括:
- クラス構造内で struct subsys_private 型ポインター (cp) 用のスペースを割り当て、その中のフィールド (cp->subsys.kobj.kset、cp->subsys.kobj.ktype など) を初期化します。
- kset_register を呼び出してクラスを登録します (「Linux デバイス モデル (6)_Bus」の説明を思い出してください。クラスはサブシステムであるため、クラスの登録も登録サブシステムです)。処理が完了すると、/sys/class/ディレクトリ
にクラス(サブシステム)に対応したディレクトリが作成されます。- add_class_attrs インターフェイスを呼び出して、クラス構造内の class_attrs ポインターが指す属性をカーネルに追加します。実行後、これらの属性に対応するファイルが /sys/class/xxx_class/ ディレクトリ
# に表示されます。#''
3.3 デバイス登録時のクラス関連のアクション
「Linux デバイス モデル (5)_デバイスとデバイス ドライバー」では、struct device と struct device_driver という 2 つのデータ構造について説明しました。struct device 構造には、struct クラス ポインターが含まれます (クラスを側面から説明しています)。これはデバイスのコレクションであり、クラスさえもデバイスのドライバーになることができます)。クラス ドライバーがクラスをカーネルに登録するときは、独自のクラス ポインターをクラスにポイントして、そのクラスのデバイスを使用する必要があり、残りの部分はデバイスの登録時にカーネルが処理します。このセクションでは、デバイスを登録するときのクラス関連のアクションについて説明します。
#「実際のところ、この記事を終えた後でも、Wowo はカーネル内でクラスがどのように使用されるかをまだ理解していません。その後のサブシステム (入力サブシステム、RTC サブシステムなど) の分析では、クラスの使用例が多数登場します。その時が来て、振り返って要約すると、非常に明確になります。」 デバイスの登録は、最終的に device_add インターフェイス (drivers/base/core.c) によって実装されます。このインターフェイスのクラス関連アクションには次のものが含まれます:
device_add_class_symlinks インターフェイスを呼び出して、セクション 3.1 で説明されているさまざまなシンボリック リンクを作成します。つまり、クラスに対応するディレクトリにデバイスを指すシンボリック リンクを作成し、デバイスのディレクトリにサブシステムを指すサブシステムという名前のシンボリック リンクを作成します。対応するクラスディレクトリ
- device_add_attrs を呼び出して、クラスで指定された属性を追加します (class->dev_attrs)
- クラスに対応する add_dev コールバック関数がある場合は、そのコールバック関数を呼び出します。
- #''
4 結論
以上がLinuxデバイスモデルの詳細説明(7)_Classの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

linux设备节点是应用程序和设备驱动程序沟通的一个桥梁;设备节点被创建在“/dev”,是连接内核与用户层的枢纽,相当于硬盘的inode一样的东西,记录了硬件设备的位置和信息。设备节点使用户可以与内核进行硬件的沟通,读写设备以及其他的操作。

区别:1、open是UNIX系统调用函数,而fopen是ANSIC标准中的C语言库函数;2、open的移植性没fopen好;3、fopen只能操纵普通正规文件,而open可以操作普通文件、网络套接字等;4、open无缓冲,fopen有缓冲。

在linux中,可以利用“rpm -qa pcre”命令判断pcre是否安装;rpm命令专门用于管理各项套件,使用该命令后,若结果中出现pcre的版本信息,则表示pcre已经安装,若没有出现版本信息,则表示没有安装pcre。

端口映射又称端口转发,是指将外部主机的IP地址的端口映射到Intranet中的一台计算机,当用户访问外网IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上;可以通过使用动态或固定的公共网络IP路由ADSL宽带路由器来实现。

在linux中,eof是自定义终止符,是“END Of File”的缩写;因为是自定义的终止符,所以eof就不是固定的,可以随意的设置别名,linux中按“ctrl+d”就代表eof,eof一般会配合cat命令用于多行文本输出,指文件末尾。

linux查询mac地址的方法:1、打开系统,在桌面中点击鼠标右键,选择“打开终端”;2、在终端中,执行“ifconfig”命令,查看输出结果,在输出信息第四行中紧跟“ether”单词后的字符串就是mac地址。

手机远程linux工具有:1、JuiceSSH,是一款功能强大的安卓SSH客户端应用,可直接对linux服务进行管理;2、Termius,可以利用手机来连接Linux服务器;3、Termux,一个强大的远程终端工具;4、向日葵远程控制等等。

linux中,lsb是linux标准基础的意思,是“Linux Standards Base”的缩写,是linux标准化领域中的标准;lsb制定了应用程序与运行环境之间的二进制接口,保证了linux发行版与linux应用程序之间的良好结合。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

ホットトピック



