1. 개요
장치 모델에서 버스, 장치, 장치 드라이버 등은 모두 실제 사물에 해당하고 모든 논리가 이러한 엔터티를 중심으로 돌아가기 때문에 상대적으로 이해하기 쉽습니다. 다만, 본 글에서 설명하는 클래스는 가상 클래스이므로 장치의 공통성을 추상화하기 위해 다소 차이가 있다.
예를 들어, 비슷한 나이대에 비슷한 지식이 필요한 사람들이 모여서 공부한다면, 그들은 반을 형성합니다. 이 클래스는 고유한 이름(예: "295")을 가질 수 있지만 이를 구성하는 학생(장치)이 없으면 의미가 없습니다. 또한, 클래스의 존재의 가장 큰 의미는 무엇입니까? 모든 강좌는 선생님이 진행합니다! 교사는 한 번만 말하면 되기 때문에 수업에 참여하는 학생들은 그 내용을 들을 수 있습니다. 모든 학생이 집에서 공부한다면 각 학생마다 교사를 고용하여 이런 식으로 가르칠 것입니다. 대부분의 내용이 동일해서 엄청난 낭비입니다.
장치 모델의 클래스는 유사한 기능을 제공합니다. 예를 들어 일부 유사한 장치(학생)는 사용자 공간에 유사한 인터페이스(강의)를 제공해야 합니다. 각 장치 드라이버를 한 번만 구현해야 한다면 커널에 많은 양의 중복 코드가 발생하게 되어 엄청난 낭비가 됩니다. 그래서 Class는 "사용 방법을 알고 있는 한 구현을 도와드리겠습니다."라고 말했습니다.
기기 모델의 클래스 기능입니다. 커널 설명과 결합하면 클래스는 낮은 수준의 구현 세부 정보(include/linux/device.h line326)를 추상화하는 장치의 상위 수준 보기이므로 이해하기 쉽습니다.
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의 두 가지 유형이 있습니다. dev_kobj가 NULL이면 기본적으로 char가 선택됩니다.
dev_uevent, 이 클래스 아래의 장치가 변경되면 해당 클래스의 uevent 콜백 함수가 호출됩니다.
class_release, 릴리스 자체에 사용되는 콜백 함수입니다.
dev_release, 릴리스 클래스 내의 장치에 대한 콜백 함수로 사용됩니다. device_release 인터페이스에서는 릴리스 인터페이스가 등록되어 있는지 확인하기 위해 Device, Device Type 및 Device가 위치한 클래스를 검사합니다. 등록된 경우 해당 릴리스 인터페이스를 호출하여 장치 포인터를 해제합니다.
p, "Linux Device Model (6)_Bus"의 버스 구조체 구조와 동일하므로 다시 설명하지 않겠습니다.
”
2.2 구조체 클래스_인터페이스
struct class_interface는 클래스 아래에 장치가 추가되거나 제거될 때 클래스 드라이버가 미리 설정된 콜백 함수(add_dev 및 제거_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 Device Model (6)_Bus"의 설명을 기억하세요. 클래스는 하위 시스템이므로 클래스 등록도 등록 하위 시스템입니다). 프로세스가 완료되면 /sys/class/ 디렉터리에 클래스(서브시스템)에 해당하는 디렉터리가 생성됩니다
- add_class_attrs 인터페이스를 호출하여 클래스 구조의 class_attrs 포인터가 가리키는 속성을 커널에 추가합니다. 실행 후에는 /sys/class/xxx_class/ 디렉터리
에서 이러한 속성에 해당하는 파일을 볼 수 있습니다.”
3.3 기기 등록 중 수업 관련 작업
"Linux 장치 모델(5)_device 및 장치 드라이버"에서 우리는 struct device와 struct device_driver라는 두 가지 데이터 구조에 대해 이야기했습니다. struct 장치 구조에는 구조체 클래스 포인터가 포함됩니다(이것은 클래스가 장치 A라는 측면에서 보여줍니다). 심지어 클래스의 컬렉션은 장치의 드라이버가 될 수도 있습니다). 클래스 드라이버가 커널에 클래스를 등록할 때 클래스에 대한 자체 클래스 포인터를 가리켜 클래스의 장치를 사용해야 합니다. 커널은 장치를 등록할 때 나머지를 처리합니다.
이 섹션에서는 장치 등록 시 수업 관련 작업에 대해 설명합니다.
“
장치 등록은 궁극적으로 device_add 인터페이스(drivers/base/core.c)에 의해 구현됩니다. 이 인터페이스의 클래스 관련 작업은 다음과 같습니다.
- device_add_class_symlinks 인터페이스를 호출하여 섹션 3.1에 설명된 다양한 심볼릭 링크를 생성합니다. 즉, 해당 클래스의 디렉터리에서 장치를 가리키는 심볼릭 링크를 생성하고, 해당 클래스를 가리키는 subsystem이라는 심볼릭 링크를 생성합니다. 해당 수업 디렉토리
- 클래스에 지정된 속성을 추가하려면 device_add_attrs를 호출하세요(class->dev_attrs)
- 해당 클래스에 해당하는 add_dev 콜백 함수가 있으면 콜백 함수를 호출하세요
”
4. 결론
사실 이 글이 끝난 후에도 Wowo는 커널에서 클래스가 어떻게 사용되는지 아직 파악하지 못했습니다. 그러나 이는 중요하지 않습니다. 하위 시스템(예: 입력 하위 시스템, RTC 하위 시스템 등)에 대한 후속 분석에서는 클래스의 많은 사용 사례를 볼 수 있습니다. 때가 되면 우리가 되돌아보고 요약하면 매우 분명해질 것입니다.
위 내용은 Linux 장치 모델에 대한 자세한 설명(7)_클래스의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

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

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

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

在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 Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경
