Linux 운영 체제를 배울 때 다음과 같은 질문을 받은 적이 있습니까? 컴퓨터가 왜 다른 USB 장치를 인식하고 사용할 수 있습니까? Linux 시스템은 왜 마우스를 키보드로 사용하지 않습니까? Linux 시스템에서 USB 장치의 식별 및 로딩 프로세스에 대해 논의하겠습니다.
USB 장치를 컴퓨터에 연결하면 Linux 커널이 해당 드라이버를 자동으로 감지하고 로드하여 장치가 제대로 작동할 수 있도록 합니다. 다음으로 Linux 시스템에서 USB 장치의 식별 및 로딩 프로세스를 살펴보겠습니다.
USB 컨트롤러는 USB 버스의 장치를 제어하는 데 사용되는 하드웨어 장치입니다. USB 장치를 연결하면 USB 컨트롤러가 전압 변화를 감지하고 인터럽트 신호를 보냅니다. 이 인터럽트 신호는 프로세서의 USB 컨트롤러 인터럽트 라인으로 전송되어 Linux 커널에 새 USB 장치가 연결되었음을 알려줍니다.
커널은 USB 컨트롤러로부터 인터럽트 신호를 받으면 USB 하위 시스템의 usbcore
模块,该模块负责检测新的USB设备并加载相应的驱动程序。usbcore
모듈을 호출하여 먼저 장치 설명자를 감지합니다. 이 설명자에는 장치의 제조업체 ID, 제품 ID, 카테고리 코드 및 기타 정보가 포함됩니다.
일치하는 드라이버가 이미 존재하는 경우 usbcore
모듈이 이 드라이버를 로드합니다. 일치하는 드라이버가 없으면 대부분의 USB 장치를 지원할 수 있는 범용 드라이버를 로드하려고 시도합니다.
올바른 드라이버가 로드되면 USB 하위 시스템에 등록되어 처리할 수 있는 장치를 알려줍니다. 이 단계에는 일반적으로 USB 장치(예: 저장 장치, 입력 장치 등)의 클래스를 커널에 등록하는 작업이 포함됩니다.
이 프로세스에는 새 USB 장치 드라이버를 커널에 등록하고 장치의 제조업체 ID, 제품 ID 및 기타 정보를 드라이버에 지정하는 작업이 포함됩니다. 드라이버가 성공적으로 등록되면 USB 하위 시스템이 장치를 올바른 드라이버와 일치시킬 수 있습니다.
다음으로 USB 하위 시스템은 장치에 대한 장치 노드를 생성합니다. 장치 노드는 사용자 공간 프로그램이 장치와 통신할 수 있도록 하는 /dev
디렉터리의 특수 파일입니다. 장치 노드의 이름은 일반적으로 장치의 제조업체 ID, 제품 ID, 일련 번호 및 기타 정보를 기반으로 커널에 의해 동적으로 생성됩니다.
장치 노드 생성은 시스템의 장치 플러그인 및 분리 이벤트를 모니터링하고 해당 장치 노드를 자동으로 생성하거나 삭제하는 udev
daemon 프로세스를 통해 수행됩니다. 장치 노드가 생성되면 커널은 장치에 대한 액세스 권한을 사용자 공간 프로그램에 할당할 수 있습니다.
드라이버에게 새 장치가 연결되었다는 알림을 받은 후 장치를 초기화합니다. 초기화에는 장치의 전송 속도 설정, 메모리 버퍼 할당 등이 포함될 수 있습니다. 장치 초기화가 완료된 후 드라이버는 장치가 준비되었음을 USB 하위 시스템에 보고합니다.
마지막으로 사용자 공간 프로그램은 장치 노드를 열고 장치와 통신할 수 있습니다. 장치 노드의 권한은 일반적으로 루트 사용자 또는 관련 그룹의 사용자에게만 액세스를 허용하도록 설정됩니다. 사용자 공간 프로그램은 시스템 호출(예: read
和write
)을 사용하여 장치에 명령을 보내고 데이터를 받을 수 있습니다.
이 과정을 통해 Linux 시스템은 자동으로 장치를 식별하고 해당 드라이버를 로드하여 장치가 정상적으로 작동할 수 있도록 합니다. 이것이 바로 USB 장치를 연결할 때 장치를 직접 사용하기 위해 드라이버를 수동으로 설치하거나 다른 작업을 수행할 필요가 없는 이유이기도 합니다.
USB 장치를 연결하면 Linux 시스템이 자동으로 위 단계를 수행하여 자동으로 장치를 식별하고 해당 드라이버를 로드하여 장치가 정상적으로 작동할 수 있도록 합니다. 코드 수준에서 프로세스를 분석해 보겠습니다.
아래에서는 몇 가지 샘플 코드를 통해 Linux 시스템에서 USB 장치의 식별 및 로딩 과정을 설명하겠습니다. 이 샘플 코드는 단지 원리를 설명하기 위한 것일 뿐 실제 코드는 더 복잡합니다.
USB 장치가 시스템에 연결되면 인터럽트 신호가 생성되며, 이는 프로세서의 USB 컨트롤러 인터럽트 라인에 의해 캡처되고 커널의 USB 하위 시스템에 의해 처리됩니다. 다음은 USB 장치 플러그인 및 분리 이벤트를 감지하는 방법을 보여주는 샘플 코드입니다.
으아악이 코드는 USB 장치에 액세스하는 데 사용되는 C 언어 라이브러리인 libusb 라이브러리를 사용합니다. USB 하위 시스템을 초기화하고 USB 버스를 검색하기 위한 API는 물론 USB 장치에 액세스하기 위한 API도 제공합니다.
장치가 연결된 것으로 감지되면 USB 하위 시스템은 적절한 드라이버를 로드하려고 시도합니다. 다음은 USB 저장 장치(예: USB 플래시 드라이브) 지원을 담당하는 샘플 드라이버 코드입니다.
으아악이 코드는 USB 저장 장치에 대한 플러그인 및 분리 이벤트를 처리할 수 있는 간단한 드라이버를 보여줍니다. 드라이버를 로드할 때 커널은 로드된 드라이버 목록에서 장치와 일치하는 드라이버를 검색합니다.
일치하는 드라이버가 발견되면 커널은 해당 드라이버를 사용하여 장치를 관리합니다. 일치하는 드라이버가 없으면 커널은 드라이버를 로드하지 않습니다.
장치와 일치하는 드라이버가 발견되면 드라이버가 로드되어 시작되고 장치 초기화를 시도하며 커널에 등록됩니다. 다음은 USB 저장 장치를 초기화하고 이를 커널에 등록하는 방법을 보여주는 샘플 코드입니다.
으아악위 샘플 코드는 커널의 usb_get_descriptor()
函数来获取设备描述符,并使用printk()
함수를 사용하여 장치 정보를 커널 로그에 기록합니다.
드라이버가 장치 초기화 함수를 호출하여 커널에 등록할 때, 장치 초기화 및 등록 과정은 장치마다 다르기 때문에 여기서는 이 코드 부분을 생략합니다.
一旦设备已经被注册到内核,用户空间程序就可以通过设备节点来访问设备。在Linux系统中,设备节点是一种特殊的文件,可以通过标准文件I/O函数来访问。下面是一个示例代码,演示如何打开并读取USB存储设备:
#include #include #include int main() { // 打开设备节点 int fd = open("/dev/sdb", O_RDONLY); if (fd printf("Failed to open device\n"); return 1; } // 读取设备数据 char buf[1024]; ssize_t n = read(fd, buf, sizeof(buf)); if (n printf("Failed to read device\n"); close(fd); return 1; } // 关闭设备节点 close(fd); return 0; }
这段代码使用了标准的文件I/O函数来访问设备节点。在这个例子中,设备节点的路径是/dev/sdb
,这是一个典型的USB存储设备节点。接下来,程序将设备节点作为文件打开,并使用read()
函数从设备中读取数据。一旦完成数据的读取,程序将关闭设备节点并退出。
Linux系统识别USB设备的过程可以分为四个步骤:设备连接、驱动匹配、设备注册和设备访问。当用户将USB设备插入计算机时,内核将通过USB总线来检测设备的插入事件,并尝试查找与设备匹配的驱动程序。一旦找到了匹配的驱动程序,驱动程序将被加载并启动,它将尝试对设备进行初始化,并将其注册到内核。一旦设备已经被注册到内核,用户空间程序就可以通过设备节点来访问设备。
在Linux系统中,驱动程序是非常重要的组成部分,它们负责管理和控制系统中的各种设备。对于USB设备而言,内核提供了一个通用的USB驱动框架,它可以自动检测和加载驱动程序,并为用户提供了一个简单而强大的USB设备访问接口。通过深入理解USB驱动程序的工作原理,我们可以更好地理解Linux系统中设备管理的内部机制,这对于开发和调试设备驱动程序非常有帮助。
위 내용은 Linux는 내가 연결된 USB 장치를 어떻게 식별합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!