Tidak dapat memuat modul: Tidak setuju tentang versi simbol module_layout

12

Mengikuti tutorial ini untuk menulis driver pertama saya.

Makefile adalah:

# 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

Dan kode drivernya adalah:

* 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");

Tidak ada kesalahan saat melakukan. Tetapi ketika saya menggunakan insmod ofd.kosaya tidak dapat memuatnya. Di dmesgdalamnya tertulis:

tidak setuju tentang versi module_layout simbol

  • uname -r mengembalikan '3.8.0-38-generic' dan sumber kernel juga 3.8.
  • modprobe -f ofd.ko juga gagal

Juga:

#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

Apa yang terjadi?

pengguna2799508
sumber
Beberapa komentar yang jelas. Pertama, apakah sumber kernel persis sama dengan kernel Ubuntu? Anda harus menggunakan sumber kernel Ubuntu yang sesuai persis dengan kernel Anda. Hulu mungkin tidak akan berfungsi, karena distribusi menambal kernel mereka. Kedua, afaik Anda dapat mengkompilasi terhadap header kernel, Anda tidak perlu sumber kernel. Header juga harus tersedia sebagai paket biner. Anda mungkin juga ingin melihat Buku Pegangan Kernel Debian , yang memiliki hal-hal instruktif tentang kernel dll. Di Debian, yang juga berlaku untuk Ubuntu.
Faheem Mitha

Jawaban:

13

Kernel Linux berisi struktur data yang tata letaknya bervariasi tidak hanya dari versi ke versi tetapi juga tergantung pada opsi kompilasi. Sebagai akibatnya, ketika Anda mengkompilasi modul kernel, Anda harus memiliki tidak hanya file header dari sumber kernel, tetapi juga beberapa file header yang dihasilkan selama kompilasi kernel. Membongkar sumber kernel saja tidak cukup.

Dengan kernel yang dibangun dengan CONFIG_MODVERSIONS, nomor versi dapat berbeda, tetapi tata letak struktur data harus sama. Opsi ini diaktifkan di kernel Ubuntu. Dengan opsi ini, selain header, modul harus dikompilasi dengan Module.symversfile yang tepat . Ubuntu, seperti kebanyakan distribusi, menyertakan file ini dalam paket yang sama dengan header kernel yang dihasilkan dari kompilasi. Paket header kernel Ubuntu disebut , mis .linux-headers-VERSION-VARIANTlinux-headers-3.8.0-38-generic

Dengan kernel yang dibangun tanpa CONFIG_MODVERSIONS(yang mungkin merupakan kasus jika Anda mengkompilasi kernel Anda sendiri), pemeriksaan saat memuat modul adalah pemeriksaan versi sederhana. Anda dapat mengambil sumber kernel yang tidak dibongkar, menyalin .configyang digunakan selama kompilasi dari kernel yang Anda jalankan, dan menjalankan make modules_prepare. Tanggung jawab ada pada Anda untuk memverifikasi bahwa setiap tambalan yang Anda buat pada kernel tidak memengaruhi kompatibilitas biner.

Gilles 'SANGAT berhenti menjadi jahat'
sumber