开发环境:ubuntu12.04
功能:ubuntu在实现内核模块加载、编译卸载
一、源码:
/** *hello.c * / #include <linux/module.h> #include <linux/types.h> #include <linux/fs.h> #include <linux/errno.h> #include <linux/mm.h> #include <linux/sched.h> #include <linux/init.h> #include <linux/cdev.h> #include <asm/io.h> #include <asm/system.h> #include <asm/uaccess.h> MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk("<0>""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);
Makefile
ifneq ($(KERNELRELEASE),) obj-m := hello.o else KDIR := /usr/src/linux-headers-3.2.0-40-generic-pae all: make -C $(KDIR) M=$(PWD) modules clean: rm -f *.ko *.o *.mod.o *.mod.c *.symvers modul* endif
实现步骤:
ubuntu下helloworld模块的实现
1.建立hello.cMakefile文件
Makefile文件注意红色部分,linux-headers-3.2.0-40-generic-pae改为本机的
2.进入所在目录执行make命令,运行结果如下:
3.加载模块insmodhello.ko
可以在vim /var/log/syslog最后一行看到加载是输出的字符串,当然也可以用dmesg,看最后一行
4.查看以安装模块lsmod(最上面的就是hello)
这样就算是加载好了
5.卸载模块rmmodhello.ko
我们可以在vim /var/log/syslog最后一行看到加载是输出的字符串,当然也可以用dmesg,看最后一行
6.遇到的问题:
printk无法打印,这是因为printk无法再图形界面下显示在ubuntu里使用printk函数打印的信息被写到/var/log/syslog里,使用dmesg也可查看
7.参考文献:
1)http://blog.chinaunix.net/uid-25811099-id-326899.html
2)http://blog.youkuaiyun.com/liufei_learning/article/details/7016367