Không thể tải mô-đun: Không đồng ý về phiên bản của biểu tượng module_layout


12

Thực hiện theo hướng dẫn này để viết trình điều khiển đầu tiên của tôi.

Makefile là:

# Makefile – makefile of our first driver

# if KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq (${KERNELRELEASE},)
    obj-m := ofd.o
# Otherwise we were called directly from the command line.
# Invoke the kernel build system.
else
    KERNEL_SOURCE := /usr/src/linux 3.8
    PWD := $(shell pwd)
default:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules

clean:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean
endif

Và mã trình điều khiển là:

* ofd.c – Our First Driver code */
#include <linux/module.h>
#include <linux/version.h>
#include <linux/kernel.h>

static int __init ofd_init(void) /* Constructor */
{
    printk(KERN_INFO "Namaskar: ofd registered");
    return 0;
}

static void __exit ofd_exit(void) /* Destructor */
{
    printk(KERN_INFO "Alvida: ofd unregistered");
}

module_init(ofd_init);
module_exit(ofd_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Anil Kumar Pugalia <email_at_sarika-pugs_dot_com>");
MODULE_DESCRIPTION("Our First Driver");

Không có lỗi trong quá trình thực hiện. Nhưng khi tôi sử dụng insmod ofd.kotôi không thể tải nó. Trong dmesgđó nói:

không đồng ý về phiên bản của biểu tượng module_layout

  • uname -r trả về '3.8.0-38-generic' và nguồn kernel cũng 3.8.
  • modprobe -f ofd.ko cũng thất bại

Cũng thế:

#56~precise1-Ubuntu SMP Thu Mar 13 16:23:47 UTC 2014
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.4 LTS
Release:    12.04
Codename:   precise

Chuyện gì đang xảy ra vậy?


Một số ý kiến ​​rõ ràng. Đầu tiên là mã nguồn kernel chính xác giống như các kernel Ubuntu? Bạn nên sử dụng nguồn kernel Ubuntu tương ứng chính xác với kernel của bạn. Thượng nguồn có thể sẽ không hoạt động, vì các bản phân phối vá nhân của họ. Thứ hai, afaik bạn có thể biên dịch theo các tiêu đề kernel, bạn không cần nguồn kernel. Các tiêu đề cũng nên có sẵn như là một gói nhị phân. Bạn cũng có thể muốn xem Cẩm nang hạt nhân Debian , có các công cụ hướng dẫn về hạt nhân, v.v. trên Debian, cũng áp dụng cho Ubuntu.
Faheem Mitha

Câu trả lời:


13

Nhân Linux chứa các cấu trúc dữ liệu có bố cục thay đổi không chỉ từ phiên bản này sang phiên bản khác mà còn tùy thuộc vào các tùy chọn biên dịch. Kết quả là, khi bạn biên dịch một mô-đun hạt nhân, bạn cần phải có không chỉ các tệp tiêu đề từ nguồn kernel, mà còn một số tệp tiêu đề được tạo trong quá trình biên dịch kernel. Chỉ giải nén nguồn kernel là không đủ.

Với các hạt nhân được xây dựng cùng với CONFIG_MODVERSIONS, số phiên bản có thể khác nhau, nhưng bố cục của các cấu trúc dữ liệu phải giống nhau. Tùy chọn này được kích hoạt trong các hạt nhân Ubuntu. Với tùy chọn này, ngoài các tiêu đề, các mô-đun cần được biên dịch theo Module.symverstệp thích hợp . Ubuntu, giống như hầu hết các bản phân phối, bao gồm tệp này trong cùng một gói với các tiêu đề kernel do quá trình biên dịch. Gói tiêu đề kernel Ubuntu được gọi , vd .linux-headers-VERSION-VARIANTlinux-headers-3.8.0-38-generic

Với các hạt nhân được xây dựng mà không có CONFIG_MODVERSIONS(có thể là trường hợp nếu bạn biên dịch kernel của riêng bạn), kiểm tra khi tải mô-đun là kiểm tra phiên bản đơn giản. Bạn có thể lấy nguồn kernel đã giải nén, sao chép nguồn .configđã được sử dụng trong quá trình biên dịch kernel đang chạy và chạy make modules_prepare. Trách nhiệm của bạn là xác minh rằng bất kỳ bản vá nào bạn đã tạo cho kernel không ảnh hưởng đến khả năng tương thích nhị phân.

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.