>  기사  >  운영 및 유지보수  >  Linux 문자 장치는 어디에 배치되어 있나요?

Linux 문자 장치는 어디에 배치되어 있나요?

青灯夜游
青灯夜游원래의
2023-04-07 16:29:571743검색

Linux 문자 장치는 "/dev" 디렉터리에 위치합니다. 문자 장치는 바이트 단위로만 읽고 쓸 수 있는 장치를 말합니다. 일반적으로 각 문자 장치 또는 블록 장치는 "/dev" 디렉터리의 장치 파일에 해당하며, 각 장치 파일에는 다음과 같은 기본/장치가 있어야 합니다. 동일한 부 장치 번호와 주요 장치 번호는 유사한 장치이며 동일한 드라이버를 사용합니다.

Linux 문자 장치는 어디에 배치되어 있나요?

이 튜토리얼의 운영 환경: linux7.3 시스템, Dell G3 컴퓨터.

1. Linux 장치 드라이버 분류

Linux 시스템은 장치를 문자 장치, 블록 장치 및 네트워크 장치의 세 가지 범주로 나눕니다. 이 세 가지 범주 중 문자 장치는 상대적으로 간단하고 응용 프로그램 문자 장치는 다음과 같습니다. 본 강의에서는 주로 캐릭터 디바이스를 소개하며, 블록 디바이스와 네트워크 디바이스에 관심이 있는 분들은 관련 자료를 참고하여 자세히 알아볼 수 있습니다.

Linux 문자 장치는 어디에 배치되어 있나요?


2. 캐릭터 디바이스란?

문자 장치는 바이트 단위로만 읽고 쓸 수 있는 장치를 말합니다. 장치 내의 특정 데이터는 무작위로 읽을 수 없으며 데이터를 순서대로 읽어야 합니다. 문자 장치는 스트림 지향 장치입니다. 일반적인 문자 장치에는 마우스, 키보드, 직렬 포트, 콘솔 및 LED가 포함됩니다.

Linux 문자 장치는 어디에 배치되어 있나요?

일반적으로 각 문자 장치 또는 블록 장치는 /dev 디렉터리의 장치 파일에 해당하며, 각 장치 파일에는 메이저/마이너 장치 번호가 있어야 합니다. 동일한 메이저 장치 번호를 가진 장치는 유사한 장치입니다. .동일한 드라이버를 사용하십시오.

Linux 사용자 수준 프로그램은 드라이버를 사용하여 장치 파일을 통해 문자 장치를 작동하거나 장치를 차단합니다.

cat /proc/devices

명령을 통해 현재 로드된 장치 드라이버의 주요 장치 번호를 볼 수 있습니다.

Linux 문자 장치는 어디에 배치되어 있나요?

/dev 디렉토리에서

ls -l

명령을 실행하면 모든 장치 파일의 메이저 및 마이너 장치 번호를 볼 수 있습니다.

Linux 문자 장치는 어디에 배치되어 있나요?

공용 장치 파일을 다음과 같이 설명합니다.

/dev/hd[a-t]:IDE设备

/dev/sd[a-z]:SCSI设备

/dev/fd[0-7]:标准软驱

/dev/md[0-31]:软raid设备

/dev/loop[0-7]:本地回环设备

/dev/mem:内存

/dev/null:无限数据接收设备,相当于黑洞

/dev/zero:无限零资源

/dev/tty[0-63]:虚拟终端

/dev/ttyS[0-3]:串口

/dev/lp[0-3]:并口

/dev/console:控制台

/dev/fb[0-31]:framebuffer

/dev/cdrom => /dev/hdc

/dev/modem => /dev/ttyS[0-9]

/dev/pilot => /dev/ttyS[0-9]

3. 장치 파일을 생성하시겠습니까?

장치 파일을 생성하는 방법에는 두 가지가 있습니다. 하나는 프로그래밍에서 이 함수를 호출하는 것이고, 다른 하나는 명령의 첫 번째 매개 변수를 사용하는 것입니다. 장치 파일 이름에서 두 번째 매개 변수는 장치 유형입니다. 예를 들어 c는 문자 장치를 나타내고 세 번째와 네 번째 매개 변수는 장치 파일의 주요 장치 번호와 부 장치 번호(예: 231 및 0)입니다. 주요 장치 번호와 보조 장치 번호의 조합에 따라 동일한 장치의 여러 유형의 주요 장치 번호는 동일하지만 보조 장치 번호는 다릅니다. 다른 부 장치 번호. 장치 번호는 장치 파일을 드라이버와 연결할 수 있습니다.

mknod 파일 이름 유형 major min

  • filename: 생성할 장치 파일 이름,
  • type: 장치 유형, c는 문자 장치를 나타내고, b는 블록 장치를 나타냅니다.
  • 마이너: 마이너 장치 번호;

4. 문자 장치를 설명하는 방법은 무엇입니까? Linux 커널은 문자 장치를 표현하기 위해 구조체 cdev 구조를 추상화합니다. cdev는 에 정의되어 있습니다. 가장 중요한 것은 문자 장치를 구현하기 위한 작업 집합인 file_Operations 구조입니다.
struct cdev {
        struct kobject kobj;   //  内嵌内核对象
        struct module *owner;  //该字符设备所在的内核模块
        const struct file_operations *ops; //文件操作结构体
        struct list_head list;  //已注册字符设备链表
        dev_t dev; //由主、次设备号构成的设备号
        unsigned int count;//同一主设备号的次设备号的个数
};

Linux는 드라이버 기능에 액세스하기 위해 file_Operations 구조를 사용합니다. 이 구조의 각 멤버 이름은 시스템 호출에 해당합니다.
struct file_operations {
       struct module *owner;
       loff_t (*llseek) (struct file *, loff_t, int);
       ssize_t (*read) (struct file *, char *, size_t, loff_t *);
       ssize_t (*write) (struct file *, const char *, size_t, loff_t *);
       int (*readdir) (struct file *, void *, filldir_t);
       unsigned int (*poll) (struct file *, struct poll_table_struct *);
       int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
       int (*mmap) (struct file *, struct vm_area_struct *);
       int (*open) (struct inode *, struct file *);
       int (*flush) (struct file *);
       int (*release) (struct inode *, struct file *);
       int (*fsync) (struct file *, struct dentry *, int datasync);
       int (*fasync) (int, struct file *, int);
       int (*lock) (struct file *, int, struct file_lock *);
       ssize_t (*readv) (struct file *, const struct iovec *, unsigned long,loff_t *);
       ssize_t (*writev) (struct file *, const struct iovec *, unsigned long,    loff_t *);
    };
사용자 프로세스가 장치 파일에 대해 읽기, 쓰기 등의 작업을 수행하면 시스템 호출은 장치 파일의 주요 장치 번호를 통해 해당 장치 드라이버를 찾은 다음 이 데이터 구조의 해당 함수 포인터를 읽은 다음 Linux 장치 드라이버 작동 방식의 기본 원리인 이 기능에 제어권을 넘겨줍니다.

5. 캐릭터 장치와 파일 시스템 간의 인터페이스

그림에서 볼 수 있듯이 맨 왼쪽의 Linux 커널에서 cdev 구조는 멤버 dev_t를 통해 문자 장치를 설명하는 데 사용되며 장치 번호(주요 장치 번호와 부 장치 번호로 구분됨)가 정의되어 있습니다. file_Operations 멤버를 통한 문자 장치의 고유성 문자 장치 드라이버가 가상 파일 시스템 VFS에 제공하는 인터페이스 함수(예: 일반적인 open(), read(), write() 등)를 정의하려면 이러한 함수는 실제로 하드웨어 장치를 작동합니다.

Linux 문자 장치는 어디에 배치되어 있나요?

이전 그림을 기반으로 이 그림을 살펴보겠습니다. 문자 장치 드라이버는 커널 모듈 형태로 커널에 로드됩니다. 먼저 모듈 로딩 함수는 정적 또는 동적 방식으로 장치 번호 를 얻습니다. ; 그런 다음 문자 장치 초기화 기능cdev와 file_Operations 사이의 연결 을 설정하고 등록 기능을 통해 시스템에 cdev를 추가하여 로딩에 따라 모듈이 언로드될 때 등록을 완료합니다. cdev를 로그아웃해야 하며 장치 번호가 해제됩니다.

사용자 프로그램에서는 커널의 드라이버에 의해 구현된 이러한 함수를 시스템 호출 open(), read(), write() 등을 통해 호출할 수 있습니다. 이런 식으로 사용자 모드와 커널 드라이버 사이의 경로가 열립니다.

6 간단한 문자 장치 드라이버 작성

Linux 문자 장치는 어디에 배치되어 있나요?

그림과 같이 문자 장치 드라이버 작성은 세 단계로 나누어집니다.

    드라이버 초기화, 호출 4단계로 나뉩니다. 관련 기능에 도달했습니다.
  1. 장치의 작동을 구현합니다. 구체적인 작동은 구현하려는 기능에 따라 다릅니다. 여기에는 기본 작동만 나열되어 있습니다.
  2. 드라이버 로그아웃, 로그아웃은 리소스를 해제하는 것입니다.
호출되는 인터페이스 함수의 기능은 다음과 같습니다.

Linux 문자 장치는 어디에 배치되어 있나요?

첫 번째 함수는 할당 함수로, cdev의 메모리에 동적으로 적용하여 구조체에 메모리 공간을 할당합니다.

두 번째 함수는 cdev의 멤버를 초기화하고 cdev와 file_Operations 간의 연결을 설정하는 초기화 함수입니다.

세 번째 함수는 cdev 장치 개체를 등록합니다. 즉, 문자 장치 테이블에 문자 장치를 추가합니다. 모두가 그렇듯이 등록은 등록할 때와 동일합니다.

네 번째 함수는 시스템에서 cdev 개체를 삭제하기 위한 드라이버 등록 취소 호출입니다.

다섯 번째 함수는 cdev 데이터 구조가 차지하는 메모리를 해제합니다.

6.1 디바이스 번호 적용 및 출시

캐릭터 디바이스나 블록 디바이스에는 메이저 디바이스 번호와 마이너 디바이스 번호가 있습니다.

주요 장치 번호는 장치 파일에 연결된 드라이버를 식별하는 데 사용되며 장치 유형을 반영합니다. 보조 장치 번호는 드라이버가 작동 중인 장치를 식별하고 동일한 유형의 장치를 구별하는 데 사용됩니다. 등록할 때 기기번호를 신청하고, 로그아웃할 때 기기번호를 해제하세요. 누구나 등록할 때 학생증이 있고, 이 학생번호는 졸업하고 퇴사할 때 공개됩니다.

Linux 문자 장치는 어디에 배치되어 있나요?

6.2 사용자 공간과 커널 공간 간의 데이터 전송

사용자 프로그램에서 read() 함수를 호출하면 실제로 커널 공간을 사용해야 합니다. 커널의 copy_to_user() 함수는 커널 공간 버퍼의 데이터를 사용자 공간 버퍼에 복사합니다. 반대로 write() 함수를 호출하면 커널은 다음과 같이 사용자 공간 데이터를 커널 버퍼에 복사합니다. copy_from_user() 함수를 호출합니다.

Linux 문자 장치는 어디에 배치되어 있나요?

관련 추천: "

Linux 비디오 튜토리얼"

위 내용은 Linux 문자 장치는 어디에 배치되어 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.