찾다
시스템 튜토리얼리눅스Linux 문자 장치 드라이버 프레임워크: 원리 및 방법

Linux 문자 장치 드라이버 프레임워크: 원리 및 방법

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

문자 장치는 키보드, 마우스, 직렬 포트 등과 같이 데이터를 바이트 단위로 전송하는 Linux 시스템의 일반적인 장치 유형입니다. 문자 장치 드라이버는 Linux 드라이버 개발의 가장 기본적인 유형이며 장치 번호, 장치 파일, 파일 작업 구조 및 cdev 구조와 같은 개념을 포함합니다. 이 기사에서는 장치 번호 등록 및 등록 취소, 장치 파일 생성 및 삭제, cdev 구조 초기화 및 해제, 파일 작업 기능 구현 및 등록 등을 포함하여 Linux 문자 장치 드라이버 프레임워크의 원리와 방법을 소개합니다. 사용법과 주의사항을 설명하기 위한 예시입니다.

Linux 문자 장치 드라이버 프레임워크: 원리 및 방법

드라이버 모델

리눅스에서는 모든 것이 파일이므로 장치 파일로서 그 작동 방식 인터페이스가 struct file_operations에 캡슐화되어 있습니다. 드라이버를 작성할 때 해당 드라이버를 사용할 수 있도록 해당 인터페이스를 구현해야 합니다. 커널." 등록 + 콜백 메커니즘은 드라이버를 작성하는 데 사용됩니다. 소위 등록 콜백이라는 간단한 이해는 장치 파일을 열 때 실제로 VFS를 통해 해당 inode를 찾고, 다음과 같은 경우 inode에서 등록을 실행한다는 것입니다. 앞서 디바이스 파일을 생성해두었습니다. open 함수는 다른 함수와 동일하므로, 우리가 작성하는 드라이버가 애플리케이션에서 정상적으로 동작하기 위해서는 먼저 해당 메소드를 구현한 후 해당 메소드를 생성해야 합니다. 장치 파일.

으아악

한 마디로, 장치 번호에 대해 정적 애플리케이션을 사용하는 경우 가장 큰 문제는 알려진 장치 번호와 충돌하지 않는다는 것입니다. 커널은 이미 **"Documentation/devices.txt"** 문서에 어떤 주요 장치 번호가 있는지 기록해 두었습니다. 이를 통해 알 수 있듯이 2^12개의 주요 장치 번호 중 사용할 수 있는 범위는 240-255 및 261-2^12-1입니다. 이는 동적으로 적용할 때 이유도 설명할 수 있습니다. 장치 번호는 대개 250입니다. 또한 이 파일을 통해 "주요 장치 번호는 장치의 유형을 나타냅니다"라는 것도 알 수 있지만 문자/블록 장치 자체는 여러 범주로 나눌 수 있으므로 커널은 각 범주에 주요 장치 번호를 할당합니다.
Linux 문자 장치 드라이버 프레임워크: 원리 및 방법

읽기 및 쓰기 구현

Linux의 각 프로세스에는 자체적인 독립적인 프로세스 공간이 있습니다. 커널 데이터가 사용자 프로세스에 매핑되더라도 데이터의 PID는 자동으로 사용자 프로세스의 PID로 변환됩니다. 데이터는 커널 공간과 사용자 공간에서 직접 복사할 수 없으며 특별한 데이터 복사 기능/maros가 필요합니다.

으아악

이 두 함수는 커널 공간의 데이터를 함수를 콜백하는 사용자 프로세스의 사용자 프로세스 공간에 복사할 수 있습니다. 이 두 함수를 사용하면 커널 공간과 커널 공간 간의 데이터 복사를 실현할 수 있습니다. 사용자 공간.

으아악

ioctl 구현

ioctl은 사용자 수준 제어 장치를 위해 Linux에서 특별히 설계된 시스템 호출 인터페이스입니다. 이 인터페이스는 사용자가 명령을 통해 달성할 수 있도록 하는 기능을 ioctl을 통해 구현할 수 있습니다. 해당 함수 포인터는 long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);이며, 여기서 명령과 매개변수는 드라이버에 의해 완전히 지정됩니다. 일반적으로 명령은 애플리케이션 계층과 드라이버 계층이 동일한 통신 프로토콜을 준수하는지 확인하기 위해 헤더 파일에 기록됩니다. 그림에 표시됨) ) 명령

设备类型    序列号     方向      数据尺寸
8bit        8bit    2bit    13/14bit

设备类型字段为一个幻数,可以是0~0xff之间的数,内核中的”ioctl-number.txt“给出了一个推荐的和已经被使用的幻数(但是已经好久没人维护了),新设备驱动定义幻数的时候要避免与其冲突。
序列号字段表示当前命令是整个ioctl命令中的第几个,从1开始计数。
方向字段为2bit,表示数据的传输方向,可能的值是:**_IOC_NONE_IOC_READ_IOC_WRITE_IOC_READ|_IOC_WRITE**。
数据尺寸字段表示涉及的用户数据的大小,这个成员的宽度依赖于体系结构,通常是13或14位。

内核还定义了**_IO()_IOR()_IOW()_IOWR()**这4个宏来辅助生成这种格式的命令。这几个宏的作用是根据传入的type(设备类型字段),nr(序列号字段)和size(数据长度字段)和方向字段移位组合生成命令码。

内核中还预定义了一些I/O控制命令,如果某设备驱动中包含了与预定义命令一样的命令码,这些命令会被当做预定义命令被内核处理而不是被设备驱动处理,有如下4种:

  • FIOCLEX:即file ioctl close on exec 对文件设置专用的标志,通知内核当exec()系统带哦用发生时自动关闭打开的文件
  • FIONCLEX:即file ioctl not close on exec,清除由FIOCLEX设置的标志
  • FIOQSIZE:获得一个文件或目录的大小,当用于设备文件时,返回一个ENOTTY错误
  • FIONBIO:即file ioctl non-blocking I/O 这个调用修改flip->f_flags中的O_NONBLOCK标志

实例

//mycmd.h
...
#include 
#define CMDT 'A'
#define KARG_SIZE 36
struct karg{
    int kval;
    char kbuf[KARG_SIZE];
};
#define CMD_OFF _IO(CMDT,0)
#define CMD_ON  _IO(CMDT,1)
#define CMD_R  
 _IOR(CMDT,2,struct karg)
#define CMD_W   _IOW(CMDT,3,struct karg)
...
//chrdev.c
static long demo_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
    static struct karg karg = {
        .kval = 0,
        .kbuf = {0},
    };
    struct karg *usr_arg;

    switch(cmd){
    case CMD_ON:
        /* 开灯 */
        break;
    case CMD_OFF:
        /* 关灯 */
        break;
    case CMD_R:
        if(_IOC_SIZE(cmd) != sizeof(karg)){
            return -EINVAL;
        }
        usr_arg = (struct karg *)arg;
        if(copy_to_user(usr_arg, &karg, sizeof(karg))){
            return -EAGAIN;
        }
        break;
    case CMD_W:     
        if(_IOC_SIZE(cmd) != sizeof(karg)){
            return -EINVAL;
        }
        usr_arg = (struct karg *)arg;
        if(copy_from_user(&karg, usr_arg, sizeof(karg))){
            return -EAGAIN;
        }
        break;
    default:
        ;
    };
    return 0;
}

创建设备文件

插入的设备模块,我们就可以使用cat /proc/devices命令查看当前系统注册的设备,但是我们还没有创建相应的设备文件,用户也就不能通过文件访问这个设备。设备文件的inode应该是包含了这个设备的设备号,操作方法集指针等信息,这样我们就可以通过设备文件找到相应的inode进而访问设备。创建设备文件的方法有两种,手动创建自动创建手动创建设备文件就是使用mknod /dev/xxx 设备类型 主设备号 次设备号的命令创建,所以首先需要使用cat /proc/devices查看设备的主设备号并通过源码找到设备的次设备号,需要注意的是,理论上设备文件可以放置在任何文件加夹,但是放到**”/dev”才符合Linux的设备管理机制,这里面的devtmpfs是专门设计用来管理设备文件的文件系统。设备文件创建好之后就会和创建时指定的设备绑定,即使设备已经被卸载了,如要删除设备文件,只需要像删除普通文件一样rm**即可。理论上模块名(lsmod),设备名(/proc/devices),设备文件名(/dev)并没有什么关系,完全可以不一样,但是原则上还是建议将三者进行统一,便于管理。

除了使用蹩脚的手动创建设备节点的方式,我们还可以在设备源码中使用相应的措施使设备一旦被加载就自动创建设备文件,自动创建设备文件需要我们在编译内核的时候或制作根文件系统的时候就好相应的配置:

Device Drivers --->
        Generic Driver Options --->
            [*]Maintain a devtmpfs filesystem to mount at /dev
            [*] Automount devtmpfs at /dev,after the kernel mounted the rootfs

OR
制作根文件系统的启动脚本写入

mount -t sysfs none sysfs /sys
mdev -s //udev也行

有了这些准备,只需要导出相应的设备信息到**”/sys”**就可以按照我们的要求自动创建设备文件。内核给我们提供了相关的API

class_create(owner,name);
struct device *device_create_vargs(struct class *cls, struct device 
*parent,dev_t devt, void *drvdata,const char *fmt, va_list vargs);

void class_destroy(struct class *cls);   
void device_destroy(struct class *cls, dev_t devt);

有了这几个函数,我们就可以在设备的**xxx_init()xxx_exit()**中分别填写以下的代码就可以实现自动的创建删除设备文件

    /* 在/sys中导出设备类信息 */
    cls = class_create(THIS_MODULE,DEV_NAME);

    /* 在cls指向的类中创建一组(个)设备文件 */
    for(i= minor;i"%s%d",DEV_NAME,i);
    }  
    /* 在cls指向的类中删除一组(个)设备文件 */
    for(i= minor;i

通过本文,我们了解了Linux字符设备驱动框架的原理和方法,它们可以用来实现对字符设备的驱动和控制。我们应该根据实际需求选择合适的方法,并遵循一些基本原则,如使用静态或动态分配的设备号,使用标准或自定义的设备文件名,使用正确或简化的cdev初始化方式等。字符设备驱动框架是Linux驱动开发中最重要的一部分,它可以实现对字符设备的读写操作,也可以提升驱动程序的可移植性和可维护性。希望本文能够对你有所帮助和启发。

위 내용은 Linux 문자 장치 드라이버 프레임워크: 원리 및 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 良许Linux教程网에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
Linux 소프트웨어의 미래 : Flatpak 및 Snap은 기본 데스크탑 앱을 대체합니까?Linux 소프트웨어의 미래 : Flatpak 및 Snap은 기본 데스크탑 앱을 대체합니까?Apr 25, 2025 am 09:10 AM

수년 동안 Linux 소프트웨어 배포는 Deb 및 RPM과 같은 기본 형식에 의존하여 각 배포의 생태계에 깊이 뿌리 내 렸습니다. 그러나 Flatpak과 Snap이 등장하여 응용 프로그램 포장에 대한 보편적 인 접근 방식을 약속했습니다. 이 기사는 시험합니다

Linux와 Windows가 장치 드라이버를 처리하는 방법의 차이점은 무엇입니까?Linux와 Windows가 장치 드라이버를 처리하는 방법의 차이점은 무엇입니까?Apr 25, 2025 am 12:13 AM

장치 드라이버를 처리 할 때 Linux와 Windows의 차이점은 주로 운전자 관리 및 개발 환경의 유연성에 반영됩니다. 1. Linux는 모듈 식 설계를 채택하며 드라이버를 동적으로로드하고 제거 할 수 있습니다. 개발자는 커널 메커니즘을 심층적으로 이해해야합니다. 2. Windows는 Microsoft Ecosystem에 의존하며 운전자는 WDK를 통해 개발하고 서명 및 인증을 받아야합니다. 개발은 비교적 복잡하지만 시스템의 안정성과 보안을 보장합니다.

Linux 및 Windows의 보안 모델을 비교하고 대조하십시오.Linux 및 Windows의 보안 모델을 비교하고 대조하십시오.Apr 24, 2025 am 12:03 AM

Linux와 Windows의 보안 모델에는 각각 고유 한 장점이 있습니다. Linux는 유연성 및 사용자 정의 가능성을 제공하여 사용자 권한, 파일 시스템 권한 및 Selinux/Apparmor를 통해 보안을 가능하게합니다. Windows는 사용자 친화성에 중점을두고 WindowsDefender, UAC, 방화벽 및 Bitlocker에 의존하여 보안을 보장합니다.

하드웨어 호환성은 Linux와 Windows간에 어떻게 다릅니 까?하드웨어 호환성은 Linux와 Windows간에 어떻게 다릅니 까?Apr 23, 2025 am 12:15 AM

Linux와 Windows는 하드웨어 호환성이 다릅니다. Windows는 광범위한 드라이버 지원이 있으며 Linux는 커뮤니티 및 공급 업체에 따라 다릅니다. Linux 호환성 문제를 해결하려면 RTL8188EU 드라이버 리포지토리 복제, 컴파일 및 설치와 같은 드라이버를 수동으로 컴파일 할 수 있습니다. Windows 사용자는 성능을 최적화하기 위해 드라이버를 관리해야합니다.

Linux와 Windows 간의 가상화 지원의 차이점은 무엇입니까?Linux와 Windows 간의 가상화 지원의 차이점은 무엇입니까?Apr 22, 2025 pm 06:09 PM

가상화 지원에서 Linux와 Windows의 주요 차이점은 다음과 같습니다. 1) Linux는 KVM과 Xen을 제공하며, 높은 커스터마이징 환경에 적합한 뛰어난 성능과 유연성을 제공합니다. 2) Windows는 친숙한 인터페이스를 통해 Hyper-V를 통한 가상화를 지원하며 Microsoft 소프트웨어에 의존하는 기업에 적합한 Microsoft Ecosystem과 밀접하게 통합됩니다.

Linux 시스템 관리자의 주요 작업은 무엇입니까?Linux 시스템 관리자의 주요 작업은 무엇입니까?Apr 19, 2025 am 12:23 AM

Linux 시스템 관리자의 주요 작업에는 시스템 모니터링 및 성능 조정, 사용자 관리, 소프트웨어 패키지 관리, 보안 관리 및 백업, 문제 해결 및 해상도, 성능 최적화 및 모범 사례가 포함됩니다. 1. 상단, HTOP 및 기타 도구를 사용하여 시스템 성능을 모니터링하고 조정하십시오. 2. 사용자 ADD 명령 및 기타 명령을 통해 사용자 계정 및 권한을 관리합니다. 3. APT 및 YUM을 사용하여 소프트웨어 패키지를 관리하여 시스템 업데이트 및 보안을 보장합니다. 4. 방화벽을 구성하고 로그를 모니터링하고 데이터 백업을 수행하여 시스템 보안을 보장합니다. 5. 로그 분석 및 공구 사용을 통해 문제를 해결하고 해결합니다. 6. 커널 매개 변수 및 응용 프로그램 구성을 최적화하고 모범 사례를 따라 시스템 성능 및 안정성을 향상시킵니다.

Linux를 배우기가 어렵습니까?Linux를 배우기가 어렵습니까?Apr 18, 2025 am 12:23 AM

Linux를 배우는 것은 어렵지 않습니다. 1.Linux는 UNIX를 기반으로 한 오픈 소스 운영 체제이며 서버, 임베디드 시스템 및 개인용 컴퓨터에서 널리 사용됩니다. 2. 파일 시스템 및 권한 관리 이해가 핵심입니다. 파일 시스템은 계층 적이며 권한에는 읽기, 쓰기 및 실행이 포함됩니다. 3. APT 및 DNF와 같은 패키지 관리 시스템은 소프트웨어 관리를 편리하게 만듭니다. 4. 프로세스 관리는 PS 및 최고 명령을 통해 구현됩니다. 5. MKDIR, CD, Touch 및 Nano와 같은 기본 명령에서 학습을 시작한 다음 쉘 스크립트 및 텍스트 처리와 같은 고급 사용법을 사용해보십시오. 6. 권한 문제와 같은 일반적인 오류는 Sudo 및 CHMod를 통해 해결할 수 있습니다. 7. 성능 최적화 제안에는 HTOP을 사용하여 리소스 모니터링, 불필요한 파일 청소 및 SY 사용이 포함됩니다.

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 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

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

DVWA

DVWA

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

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

메모장++7.3.1

메모장++7.3.1

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

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기