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.ko
saya tidak dapat memuatnya. Di dmesg
dalamnya 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?
linux
compiling
kernel-modules
pengguna2799508
sumber
sumber
Jawaban:
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 denganModule.symvers
file 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-VARIANT
linux-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.config
yang digunakan selama kompilasi dari kernel yang Anda jalankan, dan menjalankanmake modules_prepare
. Tanggung jawab ada pada Anda untuk memverifikasi bahwa setiap tambalan yang Anda buat pada kernel tidak memengaruhi kompatibilitas biner.sumber