linux實現 helloworld
一,Hello World程序:
[code]/*file: hello.c*/
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
#include <linux/init.h>;
#include <linux/module.h>;
#include <linux/kernel.h>;
static int hello_init(void)
{
printk(KERN_ALERT "Hello, The fucking crazy world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Bye, The fucking crazy world!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("albcamus <albcamus@163.com>;");[/code]
2.6內核的kbuild子系統跟2.4相比有本質的改變。咱們下面嘗試兩種方式編譯這個程序:
1, 你能夠在本目錄下這樣寫一個Makefile
[code]obj-m := hell.o
clean:
rm -rf *.o .*.cmd *.ko *.mod.c .tmp_versions[/code]
而後用這樣的命令行編譯:
make -C /lib/modules/`uname -r`/build M=`pwd` modules
這時ls一下,就能看到生成了不少文件,其中hello.ko就是咱們須要的內核模塊。
2, 專業點兒,Makefile這樣寫:
[code]obj-m := hello.o
KERNELBUILD := /lib/modules/`uname -r`/build
default:
make -C $(KERNELBUILD) M=$(shell pwd) modules
clean:
rm -rf *.o .*.cmd *.ko *.mod.c .tmp_versions[/code]
而後只要make一下就能夠了。
插入模塊用insmod命令:
insmod ./hello.ko
這時候你們可能會問:爲何個人屏幕上沒有見到輸出?這個是console的日誌記錄級別和你printk消息時指定的級別(本例中指定爲KERN_ALERT,爲次高,僅次於KERN_EMERG)決定的。不管如何,你能夠tail 或者cat看看系統日誌的最後幾行,系統日誌通常爲/var/log/messages,或者直接用dmesg命令,確定能看到輸出了。
二,頭文件問題。
C程序員都知道,要使用某個外部的函數,應當#include某個頭文件,這個頭文件包含了那個函數的原型(prototype)。內核的頭文件在include/下,其中include/asm是個符號連接,指向你所用內核的具體的體系結構目錄,比方說個人系統是i386的,那麼include/asm就指向include/asm-i386 。
內核編程中咱們不能連接libc庫,不能使用libc庫中的函數,因此頗有些麻煩。一些重要的函數,象strcpy/strcmp/snprintf等,kernel也爲咱們實現並導出(export)了,而咱們須要#include相關的頭文件,在include/linux和include/asm中,你須要本身尋找你所要使用的函數在哪一個頭文件中聲明,並將其#include進來。