2012-04-12 35 views
12

Tôi đã viết một module đơn giản:lỗi biên dịch: Linux/module.h: Không có tập tin hoặc thư mục

#define __KERNEL__ 
#define MODULE 
#include <linux/kernel.h> 
#include <linux/module.h> 

int init_module(void) 
{ 
    printk("Hello, world\n"); 
    return 0; 
} 

void cleanup_module(void) 
{ 
    printk("Goodbye\n"); 
} 

và biên dịch nó bằng lệnh này:

cc -c hello.c 

nhưng tôi gặp lỗi này:

linux/module.h: No such file or directory 

bất kỳ đề xuất nào?

EDIT: tôi đã sử dụng commad này:

cc -I/usr/src/linux-headers-3.0.0-17-generic/include -c hello.c 

và nó đi trước một bước, bây giờ tôi nhận được lỗi này:

In file included from /usr/src/linux-headers-3.0.0-17-generic/include/linux/kernel.h:13:0, 
       from hello.c:3: 
/usr/src/linux-headers-3.0.0-17-generic/include/linux/linkage.h:5:25: fatal error: asm/linkage.h: No such file or directory 
compilation terminated. 
+0

tiêu đề yes..I've kernel đã cài –

Trả lời

8

Điều đầu tiên bạn cần kernel sources. Nhiều người nhầm lẫn tiêu đề không gian người dùng và tiêu đề không gian hạt nhân vì nhiều người trong số họ có cấu trúc thư mục giống nhau. Hầu hết các bản phân phối chỉ có các tiêu đề không gian người dùng chứ không phải các phần tử không gian hạt nhân.

thường làmake được sử dụng để tạo mô-đun hạt nhân và không phải là số cc. Thực hiện theo từng bước đơn giản được giải thích Hello World mô-đun hạt nhân được đưa ra here

+0

cảm ơn rất nhiều ... Tôi đã tạo tệp và nó hoạt động. Cảm ơn bạn lần nữa –

+0

Chào mừng bạn :) –

+0

@PavanManjunath Tôi đã tạo một makefile giống như được hiển thị trong hướng dẫn nhưng tôi nhận được thông báo này: Không có gì để làm cho 'tất cả'. Tôi đang sử dụng ubuntu và đã cài đặt tiêu đề linux. – user606669

3

Bạn cần kernel header; chúng thường ở số /usr/include/ nếu được cài đặt.

Trừ khi bạn đang sử dụng một distro dựa trên nguồn hoặc xây dựng cơ hội hạt nhân của riêng bạn là tốt họ không được cài đặt theo mặc định; sử dụng trình quản lý gói của distro để cài đặt chúng. Gói thường được gọi là linux-headers.

+0

Nope, ông cần các hạt nhân tiêu đề nội bộ, không những xuất khẩu sang không gian sử dụng. –

+0

Tôi có cần cài đặt tiêu đề hạt nhân không? Tôi có thư mục/usr/include/module.h không có trong đó –

+1

Có, bạn phải làm vậy. – ThiefMaster

2

Hầu hết các bản phân phối Linux không cài đặt tiêu đề hạt nhân làm mặc định. Hãy tìm một gói phần đầu hạt nhân hoặc một cái gì đó tương tự.

3

Bạn cần môi trường xây dựng hạt nhân (lựa chọn tập lệnh, tiêu đề và Makefiles) thường có thể truy cập thông qua/lib/modules/phiên bản/build (một liên kết tượng trưng với nó) nếu đã cài đặt hạt nhân. Nếu không, thư mục là thư mục build (cái mà System.map đang ở). Các nguồn đầy đủ là không phải cần thiết (các bản phân phối thông minh nhận ra điều này) và không phải là/usr/include/bất kỳ điều gì.

Bạn cũng phải sử dụng kbuild; gọi số cc -I là không đủ và chưa được hơn 10 năm. Bạn bắt đầu với một tập tin Kbuild:

obj-m += mymodule.o 

Makefile:

kdir=/lib/modules/$(shell uname -r)/build 
all: 
     make -C ${kdir} M=$$PWD 
modules_install clean: 
     make -C ${kdir} M=$$PWD [email protected] 

và sau đó sử dụng make.

#defining __KERNEL__MODULE cũng là vô nghĩa, bởi vì điều đó đã được thiết lập bởi kbuild nếu cần.

+0

cảm ơn rất nhiều ... Tôi đã sử dụng tệp tạo trong hướng dẫn được chỉ bởi @Pavan Manjunath và nó đã hoạt động –

4

Tên tệp nguồn là cơ bản.c

#include <linux/init.h> 
#include <linux/module.h> 
/*MODULE_LICENSE("Dual BSD/GPL");*/ 
static int hello_init(void) 
{ 
    printk(KERN_ALERT "Hello, world\n"); 
    return 0; 
} 
static void hello_exit(void) 
{ 
    printk(KERN_ALERT "Goodbye, cruel world\n"); 
} 
module_init(hello_init); 
module_exit(hello_exit); 

=====================================

nay làm cho tập tin cho ubuntu

Tại loại đầu tiên trên thiết bị đầu cuối ur rằng $ (uname -r) sau đó u sẽ nhận được phiên bản .. được sử dụng trên hệ thống ur

obj-m +=basic.o 

KDIR =//usr/src/linux-headers-3.13.0-44-generic 

all: 
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules 
clean: 
rm -rf *.o *.ko *.mod.* *.symvers *.order 

======= =========================================

Để chạy mã

$sudo insmod basic.ko 
$dmesg 
u will get the output 
$sudo rmmod basic.ko 
$dmesg 
Các vấn đề liên quan