Modül yüklenemedi: symbol_layout sembol modülünün sürümü hakkında anlaşamıyor


12

Aşağıdaki bu öğretici benim ilk sürücü yazmak için.

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

Sürücü kodu:

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

Marka oluşturma sırasında hata yok. Ama kullandığımda insmod ofd.koyükleyemiyorum. İçinde dmesgdiyor:

symbol_layout sembolünün sürümü hakkında katılmıyorum

  • uname -r '3.8.0-38-generic' değerini ve çekirdek kaynağını da 3.8 döndürür.
  • modprobe -f ofd.ko ayrıca başarısız

Ayrıca:

#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

Ne oluyor?


Bazı bariz yorumlar. Birincisi çekirdek kaynağı Ubuntu çekirdeği ile tamamen aynı mı? Tam olarak çekirdeğinize karşılık gelen Ubuntu çekirdek kaynağını kullanıyor olmalısınız . Dağıtımlar çekirdeklerini yamaladığı için yukarı akış muhtemelen işe yaramaz. İkincisi, afaik çekirdek başlıklarına karşı derleyebilirsiniz, çekirdek kaynağına ihtiyacınız yoktur. Başlıklar ayrıca bir ikili paket olarak mevcut olmalıdır. Ayrıca Ubuntu için de geçerli olan Debian'da çekirdekler hakkında öğretici şeyler içeren Debian Çekirdek El Kitabına bir göz atmak isteyebilirsiniz .
Faheem Mitha

Yanıtlar:


13

Linux çekirdeği, düzeni yalnızca sürümden sürüme değil, aynı zamanda derleme seçeneklerine bağlı olarak değişen veri yapıları içerir. Sonuç olarak, bir çekirdek modülünü derlediğinizde, yalnızca çekirdek kaynağındaki başlık dosyalarına değil, aynı zamanda çekirdek derlemesi sırasında oluşturulan bazı başlık dosyalarına da sahip olmanız gerekir. Sadece çekirdek kaynağını açmak yeterli değildir.

İle oluşturulmuş çekirdeklerde CONFIG_MODVERSIONSsürüm numarası farklı olabilir, ancak veri yapılarının düzeni aynı olmalıdır. Bu seçenek Ubuntu çekirdeklerinde etkinleştirilir. Bu seçenekle, başlıklara ek olarak modüllerin uygun Module.symversdosyaya göre derlenmesi gerekir . Ubuntu, çoğu dağıtım gibi, bu dosyayı derlemeden kaynaklanan çekirdek başlıklarıyla aynı pakette içerir. Ubuntu çekirdek başlık paketi denir , ör .linux-headers-VERSION-VARIANTlinux-headers-3.8.0-38-generic

CONFIG_MODVERSIONSÇekirdekler olmadan oluşturulmuş çekirdeklerle (kendi çekirdeğinizi derlediyseniz durum böyle olabilir), bir modül yüklenirken yapılan kontrol basit bir sürüm kontrolüdür. Paketi açılmamış çekirdek kaynağını alabilir, .configçalışan çekirdeğinizin derlenmesi sırasında kullanılanı kopyalayabilir ve çalıştırabilirsiniz make modules_prepare. Çekirdeğe yaptığınız herhangi bir yamanın ikili uyumluluğu etkilemediğini doğrulamak sizin üzerindedir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.