2013-03-30 49 views
3

我剛開始學習linux內核模塊並試圖編寫簡單的Hello World程序。創建簡單的內核模塊

所以mymod.c:

#include <linux/module.h> 
#include <linux/kernel.h> 

MODULE_LICENSE("GPL"); 
MODULE_AUTHOR("Author"); 
MODULE_DESCRIPTION("\"Hello, world!\" minimal module"); 
MODULE_VERSION("printk"); 

int init_module(void) 
{ 
    printk("<1>Hello world 1.\n"); 
    return 0; 
} 

void cleanup_module(void) 
{ 
    printk(KERN_ALERT "Goodbye world 1.\n"); 
} 

的Makefile:

obj-m += mymod.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 

使outout:

make -C /lib/modules/3.2.0-23-generic-pae/build M=/root modules 
make[1]: Entering directory `/usr/src/linux-3.2.42' 

    WARNING: Symbol version dump /usr/src/linux-3.2.42/Module.symvers 
      is missing; modules will have no dependencies and modversions. 

    Building modules, stage 2. 
    MODPOST 1 modules 
make[1]: Leaving directory `/usr/src/linux-3.2.42' 

所以我創建所需的文件,但是當我試圖通過安裝此

insmod mymod.ko 

我得到一個輸出:

insmod: error inserting 'mymod.ko': -1 Invalid module format 

所以我想知道是什麼問題?

PS。 OS - Ubuntu Server 12.04。內核 - Linux的3.2.0-23 PAE

UPDATE:

我從kernel.org內核3.2.42下載並把它放在/ usr/src目錄並沒有 '使defconfig & &做準備', 'make modules_prepare'。另外我在/lib/modules/3.2.0-23-generic-pae/build中創建了鏈接。

+0

在'dmesg'中報告的任何錯誤? – Mat

+0

您是否真的在該src樹中編譯了內核? – delicateLatticeworkFever

+0

@Mat,沒有錯誤 –

回答

2

這是運行內核的源代碼樹嗎?如果不是,則應該失敗。

爲您的發行版安裝kernel-devel(或類似名稱)的軟件包,它添加了足夠的機器來構建針對它的模塊。

+0

編譯內核時出現錯誤'Install ncurses(ncurses-devel)and try again'。在一些論壇上,我發現我需要安裝libncurses5。所以我已經安裝它並編譯完成輸出,就像我的問題一樣。 –

+0

kernel-devel是Fedora的軟件包。對於Ubuntu,我已經安裝了模塊助手 –

1

你錯過了module_initmodule_cleanup聲明,

module_init (module_init); 
module_exit (cleanup_module); 

否則就沒有切入點定義的,它不會加載。

0

因爲這個任務需要很多細節和小文件進行協調,所以最好使用UML(用戶模式linux),這樣即使在圖形環境中kprintf(內核printf)也總是輸出到終端。