文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>最简单的内核模块加载与卸载

最简单的内核模块加载与卸载

时间:2010-12-05  来源:ohmytime

1、首先写一个简单的内核模块。并命名为hello.c


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

MODULE_LICENSE("GPL");
MODULE_AUTHOR("RAIN");
MODULE_DESCRIPTION("Hello world module");

static int __init hello_init(void)
{
    printk( "<0>hello world!\n");
    return 0;
}
static void __exit hello_exit(void)
{
    printk(KERN_EMERG "hello exit!\n");
}

module_init(hello_init);
module_exit(hello_exit);


简要说明一下:
有两个很关键的函数:module_init(hello_init); module_exit(hello_exit); 他们必须要有的。

2、编写Makefile


ifneq ($(KERNELRELEASE),)

obj-m :=hello.o

else
KDIR:= /lib/modules/2.6.18-194.el5/build

default:
    make -C $(KDIR) M=$(PWD) modules
install:
    insmod hello.ko
uninstall:
    rmmod hello
 
clean:
    rm -f *.ko *.o *.mod.o *.mod.c .symvers

endif

 
简要说明:
  • obj-m :=hello.o  是说明要根据hello.c生成 hello.o内核模块,一般你的c文件是什么名字这就照着来
  • KDIR:= /lib/modules/2.6.18-194.el5/build  这里是内核的目录。你可以输入 uname -r 查看一下你的内核是什么,要对应起来的,要不然你无法在你的Linux上加载和卸载你要编译的模块。
  • make -C $(KDIR) M=$(PWD) modules   这句是在当前目录编译,不用管它。
  • insmod hello.ko   这句是可选的,意思是你输入 make install 的时候,会加载你的hello.ko内核模块,当然,你也可以在make后,手动做这件事。
  •  rmmod hello  这句参考上条解释。
3、实际运行。
在工程目录下输入

#make
#make install
(或者#insmod hello.ko)


# lsmod | grep hello
上面命令可以查看有没有加载内核hello模块


#make uninstall
(或者#rmmod hello)


4、注意问题:
    注意源代码里的这句话:

printk(KERN_EMERG "hello exit!\n")

你可以输入命令查看你的linux系统下printk的打印等级

[root@localhost 4-1-4]# cat /proc/sys/kernel/printk
6 4 1 7


我的电脑是RHEL5,显示的是 6 4 1 7。 简单来说就是printk的每条信息都是带有优先级的,数字越大,优先级越低。现在是数字小于6的都可以在x-term下打印。例如:

printk("<5>hello world ! \n");
printk("<0>hello world ! \n");


  • 这两个信息都可以在我的终端打印出来,也就是5 和 0 都小于6 。注意<5>一定要在双引号“ ”里面。
  • 还有就是,在我的emacs下面运行终端,printk无法信息,优先级为<0>也不管用,不知道为什么,但是切换到linux自带的终端就行了。有知道的朋友麻烦告诉我一下。
  • 解决的办法是你可以查看log信息

cat /var/log/messages | grep 关键词(比如你加载的内核模块的名字)


应该就可以看到printk的信息了。
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载