찾다
시스템 튜토리얼리눅스Linux 커널의 두 가지 특수 장치 드라이버 프레임워크: 기타 하위 시스템 및 3+2+1 장치 인식 드라이버 프레임워크

Linux 커널의 두 가지 특수 장치 드라이버 프레임워크: 기타 하위 시스템 및 3+2+1 장치 인식 드라이버 프레임워크

Feb 12, 2024 pm 06:21 PM
linux리눅스 튜토리얼리눅스 시스템리눅스 명령쉘 스크립트overflow임베디드리눅스리눅스 시작하기리눅스 학습

기타 하위 시스템은 Linux 커널의 간단하고 유연한 장치 드라이버 프레임워크로, 문자 장치, 가상 장치, 하이브리드 장치 등과 같이 다른 하위 시스템에 속하지 않는 일부 장치 드라이버를 구현하는 데 사용할 수 있습니다. 기타 하위 시스템의 장점은 간단하고 사용하기 쉽다는 것입니다. 많은 코드를 작성할 필요가 없으며 몇 가지 기본 작동 기능만 구현하면 됩니다. 그러나 기타 하위 시스템에는 여러 장치 인스턴스, 장치 트리 및 핫 스와핑을 지원할 수 없다는 등 몇 가지 단점도 있습니다. 이러한 문제를 해결하기 위해 이 기사에서는 새로운 장치 드라이버 프레임워크인 3+2+1 장치 인식 드라이버 프레임워크를 소개합니다. 이 프레임워크는 기타 하위 시스템과 플랫폼 하위 시스템의 조합을 기반으로 하며 더 많은 기능과 기능을 달성할 수 있습니다.

Linux 커널의 두 가지 특수 장치 드라이버 프레임워크: 기타 하위 시스템 및 3+2+1 장치 인식 드라이버 프레임워크

기타 사용법

리눅스에는 크게 캐릭터 디바이스, 네트워크 디바이스, 블록 디바이스 세 가지가 있는데, 각 디바이스는 여러 카테고리로 세분화되어 있는데, 예를 들어 캐릭터 디바이스는 미리 여러 ​​카테고리로 구분되어 있고, 이 카테고리에서 사용하는 주요 디바이스가 표시되어 있습니다. 파일에는 장치 번호가 있지만 그럼에도 불구하고 수천만 개의 하드웨어가 있으며 항상 그물을 통해 빠져 나가는 물고기가 있습니다. 분류하기 어려운 이러한 문자 장치에 대해 Linux는 "혼합"장치를 사용하여 일률적으로 설명합니다. 10번, 이 장치 번호를 사용하여 장치를 구별하세요. 이러한 장치에는 주로 난수 생성기, LCD, 클럭 생성기 등이 포함됩니다. 또한 cdev를 다시 캡슐화하는 많은 하위 시스템과 마찬가지로 misc도 자동으로 장치 파일을 생성하므로 cdev 인터페이스를 작성할 때마다 class_create() 및 device_create()를 사용할 필요가 없습니다.

커널에서 제공되는 기타 객체:

으아악

우리는

fops 인터페이스를 캐릭터 장치처럼 구현하고 minor를 제공하기만 하면 됩니다. 마이너가 매크로 MISC_DYNAMIC_MINOR(실제로는 255)를 사용하는 경우 커널은 자동으로 마이너 장치 번호와 기타 커널을 할당합니다. 마이너 장치 번호는 **"include/linux/miscdevice.h"**를 참조하세요. 모든 것이 준비되면 다음 API를 사용하여 커널에 등록/로그아웃하세요 으아악

misc의 분석

기타 사용이 쉽나요? 그러나 Sparrow는 작고 잘 갖춰져 있음에도 불구하고, 그 안에 구현된 계층적 아이디어를 쉽게 파악할 수 있는 것은 바로 misc의 간소화된 구조 때문입니다. 그들 사이의 명확한 구분은 다음과 같습니다. 레이어 아이디어는 Linux 드라이버의 두 기둥 중 하나입니다(다른 하나는 분리입니다).

디자인 아이디어를 통해 배우고 드라이버의 품질을 향상시킬 수 있습니다. 다음으로 기타의 내부 메커니즘을 간략하게 분석합니다.

misc_init

Linux의 하위 시스템인 기타 하위 시스템은 Linux 시작 프로세스 중에 준비 작업을 완료합니다. 여기에는 주로

데이터 구조 초기화, 해당 클래스 생성, cdev 객체 생성, 초기화 및 커널에 등록 등이 포함됩니다. . 이러한 기초를 바탕으로 기타의 다양한 이점을 활용하여 프로그래밍할 수 있습니다. 으아악

misc_init() –293–>시스템 시작 중에 기타 하위 시스템이 초기화됩니다
–273–>시스템 구성에 따라 /proc 인터페이스를 제공해야 할 수도 있습니다
–275–>/sysfs에 misc라는 이름의 클래스를 만듭니다
–281–>정적 주요 장치 번호(10)와 캡슐화된 메소드 세트 misc_fops를 사용하여,register_chrdev()는 내부적으로 cdev 개체를 생성하고 이 두 매개 변수를 사용하여 이를 초기화하고 커널에 등록합니다. for all 무차별 장치의 장치 번호입니다. cdev 객체와 장치 번호 간의 관계는 cdev_map을 참조하세요.
–158–>misc의 cdev 객체에서 사용되는 fops. 호출 프로세스는 일반 문자 장치 chrdev_open()->misc_open()과 동일합니다.

misc_register

接下来,老规矩,我们从”XXX_register”开始分析,在Linux内核中,这些”XXX_register”往往就是一个设备对象注册到内核的接口,是研究当相应对象注册进去之后内核动作的最佳入口。

178 int misc_register(struct miscdevice * misc)
179 {  
180         dev_t dev;
187         if (misc->minor == MISC_DYNAMIC_MINOR) {
188                 int i = find_first_zero_bit(misc_minors, DYNAMIC_MINORS);
193                 misc->minor = DYNAMIC_MINORS - i - 1;
194                 set_bit(i, misc_minors);
195         } 
206         dev = MKDEV(MISC_MAJOR, misc->minor);
208         misc->this_device = device_create(misc_class, misc->parent, dev,
209                                           misc, "%s", misc->name);
210         if (IS_ERR(misc->this_device)) {
211                 int i = DYNAMIC_MINORS - misc->minor - 1;
212                 if (i = 0)
213                         clear_bit(i, misc_minors);
214                 err = PTR_ERR(misc->this_device);
216         }
222         list_add(&misc->list, &misc_list);
226 }

misc_register()
–187–> 如果指定的minor是动态分配,那么进入相关语句块。
–188–> 使dev用位图遍历API-find_first_zero_bit找到最小未用的设备号。
–193–> 得到分配好的次设备号。
–208–> (根据设备号)创建设备文件,使用的是misc_init中创建的misc_class,至此就可以实现misc设备文件的自动创建。就相当与我们在纯粹的cdev驱动中使用class_create()+device_create()创建设备文件。一个设备文件和一个设备号相联系,而misc的所有的设备号都和misc_init创建的cdev对象相联系,所以打开的任何一个misc设备文件首先回调的就是(chrdev_open()->)misc_open()。
–222–> 关键,将这个新分配的misc加入到misc链表中,用于管理所有的misc设备,便于misc_open()提取具体设备的fops。

misc_open

构建的misc子系统,将设备添加到了该子系统中,接下来我们来看一下应用层程序是如何打开一个misc设备的。由于misc也是一种字符设备,所以其提供的接口也是位于/dev中。但是正如misc的定义,其中的设备五花八门却共用同一个主设备号,这就意味着最终被chrdev_open回调的misc_open一定要具备根据被打开的不同文件为file结构准备不同的操作方法这一能力,即在驱动中实现对子设备的识别,或者称之为”多态”。

112 static int misc_open(struct inode * inode, struct file * file)
113 {
114         int minor = iminor(inode);
115         struct miscdevice *c;
116         int err = -ENODEV;
117         const struct file_operations *new_fops = NULL;
121         list_for_each_entry(c, &misc_list, list) {
122                 if (c->minor == minor) {
123                         new_fops = fops_get(c->fops);           
124                         break;
125                 }
126         }
144         replace_fops(file, new_fops);
145         if (file->f_op->open) {
146                 file->private_data = c;
147                 err = file->f_op->open(inode,file);
148         }
152 }

misc_open()
–121–>遍历misc设备链表,根据被打开的设备的次设备号找到设备对象。
–123–>存储这个设备对象的操作方法集unique_fops。
–144–>将misc设备具体的操作方法集unique_fops替换到filp中的f_op中,这个位置原来是misc的cdev对象的fops,filp带着这个unique_fops从open()返回,就实现了不同的设备对应不同的操作方法,即面向对象的”多态”

3+2+1多设备识别驱动模型

通过上述对misc机制的分析,我们不难总结出一个支持设备识别的3+2+1驱动模型(3个函数+2个数据结构+1个封装):

  1. 初始化整个驱动组的**xxx_init()**,通常用模块加载函数或总线的probe函数实现;
  2. 用于注册一个子驱动的**xxx_register()**,需要EXPORT到符号表;
  3. 能够根据传入的inode识别具体的设备并将其操作方法集放到filp中的**xxx_open()**。

+

  1. 用于存储每一个驱动对象的通用链表或数组+priv_data
  2. 用于存储子设备号的位图。

+

  1. 将所有的不同的设备用一个统一的结构进行封装

至此,我们就可以写一写这个3+2+1驱动模型的模板。

1个封装

struct multidevice{
    struct list_head head;
    int minor;
    struct file_operations* fops;
    void *priv;     //私有数据,供read/write等接口识别的信息,以及其他数据都放这里
};

2个数据结构

struct list_head multi_dev_list;
unsigned int minors_map;   //根据设备号数目的不同选数据类型or数组

3个函数

int major,baseminor = 0,max_dev = sizeof(minors_map)*8;
#define DEV_NAME "multi_device"
struct class *cls;
xxx_open(struct inode *inode,struct file *file){
    int minor = iminor(inode);
         struct multidevice *dp;
         const struct file_operations *new_fops = NULL;
                  list_for_each_entry(dp, &multi_dev_list, head) {
                     if (dp->minor == minor) {
                         new_fops = fops_get(dp->fops);           
                         break;
                 }
         }
         replace_fops(file, new_fops);
         if (file->f_op->open) {
                 file->private_data = dp
                 file->f_op->open(inode,file);
         }
}

xxx_init(void){
    dev_t devno,
    INIT_LIST_HEAD(&multi_dev_list);
    init_map(&minors_map);
    struct cdev *multi_cdev = cdev_alloc();
    cdev_init(multi_cdev, multi_fops);
    alloc_chrdev_region(&devno, baseminor, count,DEV_NAME);
    major = MAJOR(devno);
    cdev_add(multi_cdev , devno, count);
    cls = class_create(THIS_MODULE, DEV_NAME);
}
/*---------------下面是给待加驱动用的----------------------*/
xxx_register(struct *multidevice dev){
            dev_t dev;
         if (dev->minor == MISC_DYNAMIC_MINOR) {
                 int i = find_first_zero_bit(minors_map, DYNAMIC_MINORS);
                 dev->minor = DYNAMIC_MINORS - i - 1;
                 set_bit(i, minors_map);
         } 
         dev_t pri_devno = MKDEV(major, dev->minor);
         device_create(multi_class, NULL, pri_devno, "%s", misc->name);
         list_add(dev->head, &multi_dev_list);
}
EXPORT_SYMBOL(xxx_register)

通过本文,我们了解了misc子系统和3+2+1设备识别驱动框架的原理和方法,它们可以用来实现一些特殊的设备驱动,如识别设备,虚拟设备,混合设备等。我们应该根据实际需求选择合适的框架,并遵循一些基本原则,如使用正确的注册和注销函数,使用正确的文件操作结构体,使用正确的设备树节点等。misc子系统和3+2+1设备识别驱动框架是Linux内核中两个有用而灵活的设备驱动框架,它们可以提升设备驱动的兼容性和可扩展性,也可以提升开发者的效率和质量。希望本文能够对你有所帮助和启发。

위 내용은 Linux 커널의 두 가지 특수 장치 드라이버 프레임워크: 기타 하위 시스템 및 3+2+1 장치 인식 드라이버 프레임워크의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 良许Linux教程网에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
Linux 운영이란 무엇입니까?Linux 운영이란 무엇입니까?Apr 13, 2025 am 12:20 AM

Linux 운영 체제의 핵심은 명령 줄 인터페이스이며 명령 줄을 통해 다양한 작업을 수행 할 수 있습니다. 1. 파일 및 디렉토리 작업 LS, CD, MKDIR, RM 및 기타 명령을 사용하여 파일 및 디렉토리를 관리합니다. 2. 사용자 및 권한 관리는 UserAdd, Passwd, CHMOD 및 기타 명령을 통해 시스템 보안 및 리소스 할당을 보장합니다. 3. 프로세스 관리는 PS, Kill 및 기타 명령을 사용하여 시스템 프로세스를 모니터링하고 제어합니다. 4. 네트워크 운영에는 Ping, Ifconfig, SSH 및 기타 명령이 포함되어 있으며 네트워크 연결을 구성하고 관리합니다. 5. 시스템 모니터링 및 유지 관리 Top, DF, Du와 같은 명령을 사용하여 시스템의 작동 상태 및 리소스 사용을 이해합니다.

Linux 별칭을 사용하여 사용자 정의 명령 바로 가기로 생산성을 높이십시오Linux 별칭을 사용하여 사용자 정의 명령 바로 가기로 생산성을 높이십시오Apr 12, 2025 am 11:43 AM

소개 Linux는 유연성과 효율성으로 인해 개발자, 시스템 관리자 및 전원 사용자가 선호하는 강력한 운영 체제입니다. 그러나 길고 복잡한 명령을 자주 사용하는 것은 지루하고 응급실이 될 수 있습니다.

Linux는 실제로 좋은 것은 무엇입니까?Linux는 실제로 좋은 것은 무엇입니까?Apr 12, 2025 am 12:20 AM

Linux는 서버, 개발 환경 및 임베디드 시스템에 적합합니다. 1. 서버 운영 체제로서 Linux는 안정적이고 효율적이며 종종 고 대전성 애플리케이션을 배포하는 데 사용됩니다. 2. 개발 환경으로서 Linux는 효율적인 명령 줄 도구 및 패키지 관리 시스템을 제공하여 개발 효율성을 향상시킵니다. 3. 임베디드 시스템에서 Linux는 가볍고 사용자 정의 가능하며 자원이 제한된 환경에 적합합니다.

Linux에서 윤리적 해킹을 마스터하기위한 필수 도구 및 프레임 워크Linux에서 윤리적 해킹을 마스터하기위한 필수 도구 및 프레임 워크Apr 11, 2025 am 09:11 AM

소개 : Linux 기반의 윤리적 해킹으로 디지털 프론티어 보안 점점 더 상호 연결된 세상에서 사이버 보안이 가장 중요합니다. 윤리적 해킹 및 침투 테스트는 취약점을 적극적으로 식별하고 완화하는 데 필수적입니다.

Linux 기본 사항을 배우는 방법?Linux 기본 사항을 배우는 방법?Apr 10, 2025 am 09:32 AM

기본 Linux 학습 방법은 다음과 같습니다. 1. 파일 시스템 및 명령 줄 인터페이스 이해, 2. LS, CD, MKDIR, 3. 파일 생성 및 편집과 같은 파일 작업 배우기, 4. 파이프 라인 및 GREP 명령과 같은 고급 사용법, 5. 연습 및 탐색을 통해 지속적으로 기술을 향상시킵니다.

Linux를 가장 많이 사용하는 것은 무엇입니까?Linux를 가장 많이 사용하는 것은 무엇입니까?Apr 09, 2025 am 12:02 AM

Linux는 서버, 임베디드 시스템 및 데스크탑 환경에서 널리 사용됩니다. 1) 서버 필드에서 Linux는 안정성 및 보안으로 인해 웹 사이트, 데이터베이스 및 응용 프로그램을 호스팅하기에 이상적인 선택이되었습니다. 2) 임베디드 시스템에서 Linux는 높은 사용자 정의 및 효율성으로 인기가 있습니다. 3) 데스크탑 환경에서 Linux는 다양한 사용자의 요구를 충족시키기 위해 다양한 데스크탑 환경을 제공합니다.

리눅스의 단점은 무엇입니까?리눅스의 단점은 무엇입니까?Apr 08, 2025 am 12:01 AM

Linux의 단점에는 사용자 경험, 소프트웨어 호환성, 하드웨어 지원 및 학습 곡선이 포함됩니다. 1. 사용자 경험은 Windows 또는 MacOS만큼 친절하지 않으며 명령 줄 인터페이스에 의존합니다. 2. 소프트웨어 호환성은 다른 시스템만큼 좋지 않으며 많은 상용 소프트웨어의 기본 버전이 부족합니다. 3. 하드웨어 지원은 Windows만큼 포괄적이지 않으며 드라이버를 수동으로 컴파일 할 수 있습니다. 4. 학습 곡선은 가파르고 명령 줄 운영을 마스터하는 데 시간과 인내가 필요합니다.

Linux는 배우기가 어렵습니까?Linux는 배우기가 어렵습니까?Apr 07, 2025 am 12:01 AM

LinuxisNothardTolearn, ButtheDifficulturedsonyourbackground 및 Ggoals.forthosewithoSexperience, 특히 Command-linefamiliarity, BeginnersMayFaceAsTeeperLearneLearneCURVEBUTCANMANAGEWITHPROPERSORCES.LINUX'SOURCENATURY, BAS

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SublimeText3 영어 버전

SublimeText3 영어 버전

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

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기