मॉड्यूल लोड करने में असमर्थ: प्रतीक mod_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कहा गया है:

प्रतीक के संस्करण के बारे में असहमत मॉड्यूल_ऑलआउट

  • uname -r रिटर्न '3.8.0-38-जेनेरिक' और कर्नेल स्रोत भी 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

क्या हो रहा है?


कुछ स्पष्ट टिप्पणियां। सबसे पहले गिरी स्रोत है वास्तव में उबंटू गिरी के रूप में ही? आप उबंटू गिरी स्रोत इसी का उपयोग करना चाहिए वास्तव में अपने कर्नेल में। अपस्ट्रीम शायद काम नहीं करेगा, क्योंकि वितरण उनके गुठली पैच। दूसरा, afaik आप कर्नेल हेडर के खिलाफ संकलित कर सकते हैं, आपको कर्नेल स्रोत की आवश्यकता नहीं है। हेडर भी एक बाइनरी पैकेज के रूप में उपलब्ध होना चाहिए। आप डेबियन कर्नेल हैंडबुक भी देख सकते हैं, जिसमें डेबियन पर गुठली आदि के बारे में शिक्षाप्रद सामग्री है, जो उबंटू पर भी लागू होती है।
फहीम मीठा

जवाबों:


13

लिनक्स कर्नेल में डेटा संरचनाएं होती हैं, जिसका लेआउट न केवल संस्करण से संस्करण तक भिन्न होता है, बल्कि संकलन विकल्पों पर भी निर्भर करता है। परिणामस्वरूप, जब आप कर्नेल मॉड्यूल संकलित करते हैं, तो आपको कर्नेल स्रोत से न केवल हेडर फ़ाइलों की आवश्यकता होती है, बल्कि कुछ हेडर फ़ाइल भी होती हैं जो कर्नेल संकलन के दौरान उत्पन्न होती हैं। केवल कर्नेल स्रोत को अनपैक करना पर्याप्त नहीं है।

के साथ निर्मित गुठली के साथ CONFIG_MODVERSIONS, संस्करण संख्या भिन्न हो सकती है, लेकिन डेटा संरचनाओं का लेआउट समान होना चाहिए। यह विकल्प उबंटू गुठली में सक्रिय है। इस विकल्प के साथ, हेडर के अलावा, मॉड्यूल को उचित Module.symversफ़ाइल के खिलाफ संकलित करने की आवश्यकता है । उबंटू, अधिकांश वितरणों की तरह, इस फ़ाइल में भी संकलन के परिणामस्वरूप कर्नेल हेडर के समान पैकेज शामिल है। उबंटू कर्नेल हेडर पैकेज को कहते हैं , जैसे ।linux-headers-VERSION-VARIANTlinux-headers-3.8.0-38-generic

बिना बनाए गए गुठली के साथ CONFIG_MODVERSIONS(जो आपके कर्नेल को संकलित करने पर मामला हो सकता है), मॉड्यूल लोड करते समय चेक एक साधारण संस्करण की जांच है। आप अनपैक किए गए कर्नेल स्रोत को ले सकते हैं, .configजो आपके चलने वाले कर्नेल के संकलन के दौरान उपयोग किया गया था, और चलाएं make modules_prepare। यह पुष्टि करने के लिए कि आप किसी भी पैच को कर्नेल पर बनाए गए हैं, बाइनरी संगतता को प्रभावित नहीं करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.