2012-02-29 13 views
10

मैं "हैलो वर्ल्ड" कर्नेल मॉड्यूल, यूबंटू 11.04, कर्नेल 3.2.6, जीसीसी 4.5.2 और फेडोरा 16, कर्नेल पर मिली समस्याओं का संकलन करने की कोशिश कर रहा हूं 3.2.7, जीसीसी 4.6.7।मॉड्यूल संकलन: asm/linkage.h फ़ाइल नहीं मिली

कोड:

gcc -D__KERNEL__ -I /usr/src/linux/include/ -DMODULE -Wall -O2 -c hello.c -o hello.o 

त्रुटि:

In file included from /usr/src/linux/include/linux/kernel.h:13:0, from /usr/src/linux/include/linux/cache.h:4, from /usr/src/linux/include/linux/time.h:7, from /usr/src/linux/include/linux/stat.h:60, from /usr/src/linux/include/linux/module.h:10, from hello.c:1: /usr/src/linux/include/linux/linkage.h:5:25: fatal error: asm/linkage.h: file not found

तो मैं में पाया/usr/src linux/शामिल/कोई फ़ोल्डर का नाम है/

#include <linux/module.h> 
#include <linux/init.h> 
MODULE_LICENSE("GPL"); 

static int __init hello_init (void) 
{ 
printk("Hello module init\n"); 
return 0; 
} 
static void __exit hello_exit (void) 
{ 
printk("Hello module exit\n"); 
} 
module_init(hello_init); 
module_exit(hello_exit); 

साथ संकलित 'asm' लेकिन 'asm-generic'; तो मैं 'एएसएम-सामान्य' के लिए एक नरम कड़ी 'एएसएम' बनाया है, और agail संकलित:

इस समय त्रुटि थी:

In file included from /usr/src/linux/include/linux/preempt.h:9:0, from /usr/src/linux/include/linux/spinlock.h:50, from /usr/src/linux/include/linux/seqlock.h:29, from /usr/src/linux/include/linux/time.h:8, from /usr/src/linux/include/linux/stat.h:60, from /usr/src/linux/include/linux/module.h:10, from hello.c:1: /usr/src/linux/include/linux/thread_info.h:53:29: fatal error: asm/thread_info.h: file not found

तो मुझे एहसास हुआ कि मैं गलत था, लेकिन क्यों? T_T

उत्तर

7
obj-m += hello.o 

all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

clean: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

निर्माण करने के लिए मॉड्यूल kbuild documentation

देखने और अपने संकलक मंगलाचरण beetween अंतर को देखने के लिए आप

cat /lib/modules/$(shell uname -r)/build/Makefile 

और संकलन एक निर्गम

1

asm आपके द्वारा संकलित वास्तविक आर्किटेक्चर का एक लिंक होना चाहिए, asm-generic पर नहीं।
आप एक सामान्य कर्नेल मॉड्यूल संकलित नहीं कर सकते हैं, जो एक सामान्य वास्तुकला पर काम करेगा। आपको इसे उस विशेष आर्किटेक्चर के लिए संकलित करना होगा जिसका आप उपयोग करने जा रहे हैं।

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

+0

करके निकाल सकते हैं मैं ubuntu, फेडोरा के साथ 3 मशीनों पर गिरी src फ़ोल्डर (3.2+) की जाँच है जोड़ सकते हैं और कर सकते हैं gentoo, उनमें से सभी फ़ोल्डर 'asm' नहीं है। तो मुझे लगता है कि यह कोई त्रुटि नहीं हो सकती है .. –

+2

मैंने जो रेडहाट चेक किया है, उसमें '/ usr/src/kernels /.../ शामिल/asm'' asm-x86_64' का लिंक है। – ugoren

2
obj-m += hello.o 

all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

clean: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

यहां हैलोलो.c आपकी कर्नेल स्रोत फ़ाइल है। बस अपने hello.ko मॉड्यूल बनाने के लिए उपयोग करें।

+3

मुझे पता है कि यह काम कर सकता है, लेकिन यह मेरे रास्ते में क्यों काम नहीं करता है? "gcc -D__KERNEL__ -I/usr/src/linux/शामिल/-DMODULE -Wall -O2 -c hello.c -o hello.o" –

-1

मॉड्यूल का विश्लेषण कर सकता है एक उचित तरीका है: asm/linkage.h फ़ाइल नहीं मिली

इसका मतलब है कि यह विशेष फ़ाइल निर्दिष्ट डीआईआर में नहीं मिली थी, जो कि जब हम उपयोग करते हैं- I विकल्प के साथ निर्दिष्ट किया जाता है।

हम या तो एएसएम जेनेरिक से जोड़ सकते हैं, अगर सभी शीर्षलेख एएसएम जेनेरिक में मौजूद हैं, या हम उपयोगिता का उपयोग कर सकते हैं।

बिल्डिंग कर्नेल मॉड्यूल के निर्माण में उपयोगिता को प्राथमिकता दी जाती है।

कामकाजी डीआईआर में 'मेकफ़ाइल' बनाएं।

-सी विकल्प की
obj-m += hello.o 
all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 
clean: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

उपयोग makefiles पढ़ने या कुछ और करने से पहले निर्दिष्ट DIR लिए बदल जाएगा।

तो इस त्रुटि से बचने के लिए, DIR /lib/modules/$(shell uname -r)/build

साथ -सी विकल्प का उपयोग यह आपके प्रोग्राम द्वारा आवश्यक फ़ाइलों को खोजने के लिए सक्षम हो जाएगा, तो आप hello.ko फ़ाइल मिल जाएगा।

आप इस से

sudo insmod hello.ko 

मॉड्यूल कर्नेल इसी तरह आप

sudo rmmod hello 
संबंधित मुद्दे