Sự khác biệt giữa trình điều khiển kernel và mô-đun kernel là gì?


67

Khi tôi thực hiện lspci -ktrên Kubfox của mình với kernel chung 3.2.0-29, tôi có thể thấy một cái gì đó như thế này:

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

Có một trình điều khiển hạt nhân nvidiavà mô-đun hạt nhân nvidia_current, nouveau, nvidiafb.

Bây giờ tôi tự hỏi điều gì có thể là sự khác biệt giữa trình điều khiển Kernel và mô-đun Kernel?

Câu trả lời:


78

Một mô-đun hạt nhân là một chút mã được biên dịch có thể được chèn vào kernel trong thời gian chạy, chẳng hạn như với insmodhoặc modprobe.

Trình điều khiển là một chút mã chạy trong kernel để nói chuyện với một số thiết bị phần cứng. Nó "lái" phần cứng. Hầu hết mọi phần cứng trong máy tính của bạn đều có trình điều khiển được liên kết. Một phần lớn của hạt nhân đang chạy là mã trình điều khiển.²

Trình điều khiển có thể được xây dựng tĩnh vào tệp kernel trên đĩa.³ Trình điều khiển cũng có thể được xây dựng dưới dạng mô-đun hạt nhân để có thể được tải động sau này. (Và sau đó có thể được dỡ xuống.)

Thực hành tiêu chuẩn là xây dựng trình điều khiển như các mô-đun hạt nhân nếu có thể, thay vì liên kết chúng một cách tĩnh với hạt nhân, vì điều đó mang lại sự linh hoạt hơn. Có những lý do tốt để không, tuy nhiên:

  • Đôi khi một trình điều khiển nhất định là hoàn toàn cần thiết để giúp hệ thống khởi động. Điều đó không xảy ra thường xuyên như bạn có thể tưởng tượng, do tính năng initrd .

  • Trình điều khiển được xây dựng tĩnh có thể chính xác là những gì bạn muốn trong một hệ thống có phạm vi tĩnh, chẳng hạn như hệ thống nhúng . Điều đó có nghĩa là, nếu bạn biết trước chính xác trình điều khiển nào sẽ luôn cần thiết và điều này sẽ không bao giờ thay đổi, bạn có lý do chính đáng để không bận tâm với các mô-đun hạt nhân động.

  • Nếu bạn xây dựng kernel của mình một cách tĩnh và vô hiệu hóa tính năng tải mô-đun động của Linux, bạn sẽ ngăn việc sửa đổi mã hạt nhân trong thời gian chạy. Điều này cung cấp bảo mật và sự ổn định bổ sung với chi phí linh hoạt.

Không phải tất cả các mô-đun hạt nhân là trình điều khiển. Ví dụ, một tính năng tương đối gần đây trong nhân Linux là bạn có thể tải một trình lập lịch xử lý khác . Một ví dụ khác là các loại phần cứng phức tạp hơn thường có nhiều lớp chung nằm giữa trình điều khiển phần cứng cấp thấp và vùng người dùng, chẳng hạn như trình điều khiển USB HID , thực hiện một yếu tố cụ thể của ngăn xếp USB , độc lập với phần cứng bên dưới.


Ngoài ra:

  1. Một ngoại lệ cho tuyên bố rộng này là chip CPU, không có "trình điều khiển" mỗi se . Máy tính của bạn cũng có thể chứa phần cứng mà bạn không có trình điều khiển.

  2. Phần còn lại của các mã trong một hạt nhân hệ điều hành cung cấp dịch vụ chung chung như quản lý bộ nhớ , IPC , lịch , vv Những dịch vụ chủ yếu có thể phục vụ Userland các ứng dụng, như với các ví dụ liên kết trước đó, hoặc họ có thể được dịch vụ nội bộ được sử dụng bởi trình điều khiển hoặc trong nội bộ khác hạ tầng hạt nhân.

  3. Một trong /boot, được tải vào RAM tại thời điểm khởi động bởi bộ tải khởi động sớm trong quá trình khởi động .


1
Các mô-đun có thể là hệ thống tập tin, giao thức mạng, chức năng tường lửa, và nhiều hơn nữa. Một số phần cứng (ví dụ: thẻ WiFi) yêu cầu một nhóm mô-đun, một số cung cấp cơ sở hạ tầng chung trong khi các phần cứng khác tự xử lý phần cứng.
vonbrand

1
Đây là một phác thảo chung tốt, nhưng tôi có chính xác câu hỏi tương tự như OP, sau đó đã xem qua câu trả lời này và vẫn không biết tại sao "trình điều khiển đang sử dụng" khác với "mô-đun". Ngược lại, câu trả lời của @Jim Paris là chính xác. Từ man lspci: "-k Hiển thị trình điều khiển hạt nhân xử lý từng thiết bị và cả các mô-đun hạt nhân có khả năng xử lý nó." Bạn có thể đọc như sau: "Hiển thị trình điều khiển hiện / thực sự xử lý thiết bị và tất cả các mô-đun có thể / có nghĩa là để xử lý thiết bị".
Binarus

Nếu bạn biết windows: Một mô-đun rất giống với DLL. Trên unix, một mô-đun tương tự như một đối tượng chia sẻ, nhưng một mô-đun chỉ dành cho kernel. Một mô-đun liên kết động có thể chứa trình điều khiển. Một hạt nhân có thể chứa trình điều khiển liên kết tĩnh. Một mô-đun khác với một DLL (hoặc .so) vì hạt nhân có các yêu cầu cụ thể về cách mọi thứ được tải động.
robocat

18

Để trả lời câu hỏi cụ thể của bạn về lspciđầu ra, dòng "trình điều khiển hạt nhân" đề cập đến trình điều khiển nào hiện đang bị ràng buộc với thẻ, trong trường hợp này là nvidiatrình điều khiển độc quyền . Dòng "mô-đun hạt nhân" liệt kê tất cả các trình điều khiển được biết là có khả năng liên kết với thẻ này. Ở đây, trình điều khiển độc quyền hiển thị cho nó một tên khác, có thể là do cách lspcitìm thấy trình điều khiển và tên tệp của nó so với tên được mã hóa vào chính trình điều khiển.


Cảm ơn - điều đó đã giúp. Nếu tôi chỉ ban hành man lspci- nó nói chính xác những gì bạn đã viết.
Binarus

5

Theo hướng dẫn tốt đẹp này :

... Một loại mô-đun là trình điều khiển thiết bị, cho phép nhân truy cập phần cứng được kết nối với hệ thống.

Vì vậy, nếu chúng ta cố gắng vẽ một cây, chúng ta sẽ có "Trình điều khiển thiết bị" kế thừa từ Mô-đun (mở rộng) và có các đặc điểm cụ thể hơn, giữa chúng ta tìm thấy "truy cập vào phần cứng" ...


Điều này chỉ đúng một phần. Trình điều khiển là một đối tượng của một lớp trong hệ thống phân cấp (vâng, thiết kế bên trong của Linux, như hầu hết các hệ điều hành hiện tại, đều hướng đối tượng). Nhưng trình điều khiển cho biết có thể là một mô-đun (có thể tải khi chạy) hoặc được biên dịch vào kernel. Không có sự khác biệt (hoặc rất ít) giữa các lựa chọn thay thế, mã khôn ngoan.
vonbrand

4

Một mô-đun hạt nhân có thể không phải là một trình điều khiển thiết bị.

"Trình điều khiển hạt nhân" không phải là một thuật ngữ được xác định rõ ràng, nhưng hãy thử xem.

Đây là mô-đun hạt nhân không điều khiển bất kỳ phần cứng nào và do đó không thể được coi là "trình điều khiển thiết bị" một cách hợp lý:

#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)

Sau khi xây dựng, bạn có thể sử dụng nó với:

insmod hello.ko

và nó in hello initra dmesg.

Tuy nhiên, có các mô-đun hạt nhân không phải là trình điều khiển thiết bị, nhưng thực sự hữu ích, ví dụ, các mô-đun phơi bày thông tin gỡ lỗi / hiệu năng của hạt nhân.

Trình điều khiển thiết bị thường là các mô-đun hạt nhân.

Một ví dụ về một cái gì đó là "trình điều khiển thiết bị" khó tạo ra hơn một chút, vì nó yêu cầu phần cứng để lái và các mô tả phần cứng có xu hướng phức tạp.

Tuy nhiên, sử dụng QEMU hoặc các trình giả lập khác, chúng ta có thể xây dựng các mô hình phần mềm của phần cứng thực hoặc đơn giản hóa, đây là một cách tuyệt vời để tìm hiểu cách nói chuyện với phần cứng. Dưới đây là một ví dụ đơn giản về trình điều khiển thiết bị PCI tối thiểu: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module

Sau đó chúng ta thấy rằng trong x86, nói chuyện với phần cứng đi xuống:

Những hoạt động nói chung không thể được thực hiện từ vùng người dùng, như được giải thích tại: Sự khác biệt giữa không gian người dùng và không gian hạt nhân là gì? Tuy nhiên, có một số trường hợp ngoại lệ: https://stackoverflow.com/questions/7986260/linux-interrupt-handling-in-user-space .

Sau đó, hạt nhân cung cấp các API cấp cao hơn để giúp tương tác phần cứng như vậy dễ dàng hơn và dễ mang theo hơn:

  • request_irq để xử lý các ngắt
  • ioreadX và ánh xạ bộ nhớ IO
  • giao diện cấp cao hơn cho các giao thức phổ biến như PCI và USB

0

Câu trả lời của tôi sẽ đi với Jim. Trình điều khiển hạt nhân là một chương trình (mô-đun hạt nhân) được thiết kế để điều khiển một phần cứng. Đầu ra lspci cho biết nvidia là trình điều khiển hạt nhân vì nó là loadedmô-đun cho thiết bị. Cùng với nó đi kèm các mô-đun hạt nhân có sẵn khác có sẵn.

Tôi sẽ thêm rằng các lệnh trong linux để liệt kê và loại bỏ trình điều khiển được lsmodrmmodtương ứng. Mà nói mô-đun danh sách và loại bỏ mô-đun.


0

Tất cả các trình điều khiển là mô-đun. Không phải tất cả các mô-đun là trình điều khiển.

Các mô-đun có thể được chèn vào thời gian chạy. Các mô-đun / Trình điều khiển có thể được biên dịch tĩnh cùng với kernel.

Mô đun init điển hình có

module_init(init_fn);
init_fn()
{
   /* some code */
}

Các mô-đun tương tự có thể được thực hiện một trình điều khiển

module_init(init_fn);
init_fn()
{
   device_register(&device);
   /* some code */
}

8
Trình điều khiển không phải luôn luôn mô-đun, chúng có thể được bao gồm trong hình ảnh hạt nhân chính.
Gilles 'SO- ngừng trở nên xấu xa'

3
@Prabagaran: "Tất cả các Trình điều khiển là các mô-đun. Tất cả các mô-đun không phải là trình điều khiển." Điều này là mâu thuẫn. Theo thuật ngữ toán học, những gì bạn đang nói là D -> M và M ->! D. Điều này cho phép D và! D.
Francesco Turco

2
Tôi nghĩ anh ấy có nghĩa là "Tất cả các trình điều khiển là mô-đun. Không phải tất cả các mô-đun là trình điều khiển".
Renan

4
@Renan: Điều đó sẽ đúng, nhưng nếu bạn nhìn vào lịch sử chỉnh sửa cho câu trả lời này, ai đó đã cố gắng sửa lỗi và tác giả đã hoàn nguyên nó. Thông thường tôi sẽ chỉ chỉnh sửa để sửa lỗi và tiếp tục, nhưng trong trường hợp này tôi đã -1 vì nó chỉ sai và gây nhầm lẫn vấn đề.
Caleb

Theo tôi nhớ (đã không bị lừa trong một thời gian) có một số trình điều khiển không thể được xây dựng dưới dạng các mô-đun có thể tải. Tôi dường như nhớ những người khác chỉ có thể được xử lý như các mô-đun.
vonbrand
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.