ไม่สามารถโหลดโมดูล: ไม่เห็นด้วยเกี่ยวกับรุ่นของสัญลักษณ์ module_layout


12

ทำตามบทช่วยสอนนี้เพื่อเขียนไดรเวอร์แรกของฉัน

Makefile คือ:

# 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

และรหัสไดรเวอร์คือ:

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

ไม่มีข้อผิดพลาดระหว่างการทำ แต่เมื่อฉันใช้insmod ofd.koฉันไม่สามารถโหลดได้ ในdmesgนั้นพูดว่า:

ไม่เห็นด้วยเกี่ยวกับรุ่นของสัญลักษณ์ module_layout

  • uname -r ส่งคืน '3.8.0-38-generic' และที่มาของเคอร์เนล 3.8
  • modprobe -f ofd.ko ยังล้มเหลว

นอกจากนี้:

#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

เกิดอะไรขึ้น?


ความเห็นที่ชัดเจนบางอย่าง สิ่งแรกคือแหล่งเคอร์เนลเหมือนกับเคอร์เนล Ubuntu หรือไม่ คุณควรจะใช้แหล่งเคอร์เนลอูบุนตูที่สอดคล้องกันว่าจะเคอร์เนลของคุณ อัปสตรีมอาจไม่ทำงานเนื่องจากการกระจายแก้ไขเมล็ดของพวกเขา ประการที่สอง afaik คุณสามารถคอมไพล์กับส่วนหัวเคอร์เนลคุณไม่จำเป็นต้องใช้เคอร์เนลแหล่งที่มา ส่วนหัวควรพร้อมใช้งานเป็นแพ็คเกจไบนารี คุณอาจต้องการดูคู่มือ Debian Kernel Handbookซึ่งมีข้อมูลเกี่ยวกับเมล็ดและอื่น ๆ บน Debian ซึ่งใช้กับ Ubuntu ด้วย
Faheem Mitha

คำตอบ:


13

เคอร์เนล Linux ประกอบด้วยโครงสร้างข้อมูลที่มีเค้าโครงแตกต่างกันไปตามรุ่น แต่ยังขึ้นอยู่กับตัวเลือกการรวบรวม ดังนั้นเมื่อคุณรวบรวมโมดูลเคอร์เนลคุณไม่จำเป็นต้องมีไฟล์ส่วนหัวจากแหล่งเคอร์เนลเท่านั้น แต่ยังรวมถึงไฟล์ส่วนหัวบางไฟล์ที่สร้างขึ้นระหว่างการรวบรวมเคอร์เนล การคลายซอร์สเคอร์เนลไม่เพียงพอ

ด้วยเคอร์เนลที่สร้างด้วยCONFIG_MODVERSIONSหมายเลขเวอร์ชันอาจแตกต่างกัน แต่โครงร่างของโครงสร้างข้อมูลจะต้องเหมือนกัน ตัวเลือกนี้เปิดใช้งานในเมล็ดอูบุนตู ด้วยตัวเลือกนี้นอกเหนือจากส่วนหัวโมดูลจะต้องรวบรวมกับModule.symversไฟล์ที่เหมาะสม อูบุนตูเหมือนกับการแจกจ่ายส่วนใหญ่รวมไฟล์นี้ไว้ในแพ็คเกจเดียวกันกับส่วนหัวของเคอร์เนลที่เกิดจากการคอมไพล์ แพคเกจส่วนหัวอูบุนตูเคอร์เนลที่เรียกว่าเช่นlinux-headers-VERSION-VARIANTlinux-headers-3.8.0-38-generic

ด้วยเมล็ดที่ถูกสร้างขึ้นโดยไม่มีCONFIG_MODVERSIONS(ซึ่งอาจเป็นกรณีที่คุณรวบรวมเคอร์เนลของคุณเอง) การตรวจสอบเมื่อโหลดโมดูลเป็นการตรวจสอบรุ่นที่ง่าย คุณสามารถใช้แหล่งเคอร์เนลแตกคัดลอกที่ใช้ในระหว่างการรวบรวมเมล็ดทำงานของคุณและการทำงาน.config make modules_prepareความรับผิดชอบอยู่ที่คุณเพื่อตรวจสอบว่าแพทช์ใด ๆ ที่คุณทำกับเคอร์เนลไม่ส่งผลกระทบต่อความเข้ากันได้ของไบนารี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.