lspci -k
3.2.0-29 일반 커널을 사용하여 Kubuntu에서 실행 하면 다음과 같은 내용을 볼 수 있습니다.
01:00.0 VGA compatible controller: NVIDIA Corporation G86 [Quadro NVS 290] (rev a1)
Subsystem: NVIDIA Corporation Device 0492
Kernel driver in use: nvidia
Kernel modules: nvidia_current, nouveau, nvidiafb
nvidia
커널 드라이버 와 커널 모듈이 있습니다 nvidia_current
,, nouveau
.nvidiafb
이제 커널 드라이버와 커널 모듈의 차이점이 무엇인지 알고 싶습니다.
답변1
커널 모듈은 런타임에 커널에 삽입할 수 있는 컴파일된 코드 조각입니다.insmod
또는modprobe
.
드라이버는 일부 하드웨어 장치와 통신하기 위해 커널에서 실행되는 코드 조각입니다. 하드웨어를 "구동"합니다. 컴퓨터의 대부분의 하드웨어에는 관련 드라이버가 있습니다. 실행 중인 커널의 대부분은 드라이버 코드입니다. ²
드라이버는 디스크의 커널 파일에 정적으로 구축될 수 있습니다. 드라이버는 나중에 동적으로 로드할 수 있도록 커널 모듈로 구축할 수도 있습니다. (그런 다음 제거될 수 있습니다.)
표준 관행은 드라이버를 커널에 정적으로 연결하는 대신 가능할 때마다 드라이버를 커널 모듈로 구축하는 것입니다. 이렇게 하면 더 큰 유연성이 제공됩니다. 그러나 이렇게 하지 않는 데에는 다음과 같은 이유가 있습니다.
때로는 시스템 부팅을 돕기 위해 특정 드라이버가 꼭 필요한 경우도 있습니다. 이런 일은 생각만큼 자주 발생하지 않습니다. 왜냐하면초기화 프로그램특징.
정적으로 구축된 드라이버는 정적으로 범위가 지정된 시스템에서 정확히 원하는 것일 수 있습니다.임베디드 시스템. 즉, 어떤 드라이버가 항상 필요하고 변경되지 않는지 정확히 알고 있다면 동적 커널 모듈을 사용하지 않아도 됩니다.
커널을 정적으로 빌드하고 Linux의 동적 모듈 로딩 기능을 비활성화하면 커널 코드의 런타임 수정을 방지할 수 있습니다. 이는 유연성을 희생하면서 추가적인 보안과 안정성을 제공합니다.
모든 커널 모듈이 드라이버는 아닙니다. 예를 들어 Linux 커널의 비교적 새로운 기능은 다음과 같습니다.다양한 프로세스 스케줄러 로드. 또 다른 예는 더 복잡한 유형의 하드웨어가 하위 수준 하드웨어 드라이버와 사용자 공간 사이에 여러 개의 공통 계층을 갖는 경우가 많다는 것입니다.USB HID 드라이버, 이는USB 스택의 특정 요소, 기본 하드웨어와 무관합니다.
내레이터:
답변2
출력에 대한 특정 질문 에 대답하기 위해 lspci
"커널 드라이버" 줄은 현재 카드에 바인딩된 드라이버(이 경우 독점 nvidia
드라이버)를 나타냅니다. "커널 모듈" 행에는 모든 드라이버가 나열됩니다.것으로 알려진이 카드를 바인딩할 수 있습니다. 여기서 독점 드라이버는 다른 이름으로 표시됩니다. 아마도 lspci
드라이버와 해당 파일 이름을 드라이버 자체에 인코딩된 이름과 비교하여 조회하는 방식 때문일 것입니다.
답변3
커널 모듈은 장치 드라이버가 아닐 수도 있습니다.
"커널 드라이버"는 잘 정의된 용어는 아니지만 한번 사용해 보겠습니다.
이는 하드웨어를 구동하지 않는 커널 모듈이므로 "장치 드라이버"로 합리적으로 간주될 수 없습니다.
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
static int myinit(void)
{
printk(KERN_INFO "hello init\n");
return 0;
}
static void myexit(void)
{
printk(KERN_INFO "hello exit\n");
}
module_init(myinit)
module_exit(myexit)
일단 구축되면 다음과 함께 사용할 수 있습니다.
insmod hello.ko
hello init
로 인쇄됩니다 dmesg
.
그러나 커널 디버깅/성능 정보를 공개하는 모듈과 같이 장치 드라이버는 아니지만 실제로 유용한 일부 커널 모듈이 있습니다.
장치 드라이버는 일반적으로 커널 모듈이기도 합니다.
"장치 드라이버" 예제는 구동하려면 하드웨어가 필요하고 하드웨어 설명은 복잡하기 때문에 생성하기가 다소 어렵습니다.
그러나 QEMU 또는 기타 에뮬레이터를 사용하면 실제 하드웨어 또는 단순화된 하드웨어의 소프트웨어 모델을 구축할 수 있으며, 이는 하드웨어와 통신하는 방법을 배우는 좋은 방법입니다. 다음은 최소 PCI 장치 드라이버의 간단한 예입니다.https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module/pci.c
그런 다음 x86에서 하드웨어와의 대화는 다음과 같이 요약됩니다.
in
및out
지침(예:https://stackoverflow.com/questions/3215878/what-are-in-out-instructions-in-x86-used-for/33444273#33444273- CPU에 핸들러를 등록하여 인터럽트를 처리합니다.
이러한 작업은 일반적으로 아래 설명과 같이 사용자 공간에서 수행할 수 없습니다.사용자 공간과 커널 공간의 차이점은 무엇입니까?그러나 몇 가지 예외가 있습니다.https://stackoverflow.com/questions/7986260/linux-interrupt-handling-in-user-space.
그런 다음 커널은 이러한 하드웨어 상호 작용을 더 쉽게 만들고 이식성을 높이기 위해 더 높은 수준의 API를 제공합니다.
request_irq
인터럽트 처리ioreadX
및 IO 메모리 매핑- PCI 및 USB와 같은 널리 사용되는 프로토콜을 위한 상위 수준 인터페이스
답변4
내 대답은 Jim의 대답과 같을 것이다. 커널 드라이버는 하드웨어를 구동하도록 설계된 프로그램(커널 모듈)입니다. lspci 출력은 nvidia가 loaded
장치용 모듈이기 때문에 커널 드라이버임을 나타냅니다. 이와 함께 다른 커널 모듈도 사용할 수 있습니다.
드라이버를 나열하고 제거하는 Linux 명령은 각각 lsmod
및 입니다 rmmod
. 이는 모듈을 나열하고 모듈을 제거하는 것을 의미합니다.