《Linux设备驱动程序》——Hello World模块(手把手)
编译这个模块,其实不一定是需要Linux2.6.10,根据当前的虚拟机版本就行,因为你挂载也是挂载到这个虚拟机上而不是2.6.10上
我当前Ubuntu的内核的版本是
把下列源码复制粘贴
Hello.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
//指定license版本
MODULE_LICENSE("GPL");
//设置初始化入口函数
static int __init hello_world_init(void)
{
printk(KERN_DEBUG "Yang Jie!!!!!!!!\n");
return 0;
}
//设置出口函数
static void __exit hello_world_exit(void)
{
printk(KERN_DEBUG "Liu Yu Ting!!!!!!!\n");
}
//将上述定义的init()和exit()函数定义为模块入口/出口函数
module_init(hello_world_init);
module_exit(hello_world_exit);
设置为static,是因为不想让这个函数在此文件之外生效,作用范围局限于本文件。
前面的两道下划线,是告诉内核,仅在初始化和退出的时候调用此函数,其余时间不调用此函数。
退出函数没有返回值,所以定义为void。
module_init(hello_world_init)和module_exit(hello_world_exit)是必须写的,此为调用函数进入内核,不调用即不生效。
Makefile
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KDIR:=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
all:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
endif
clean:
rm -f *.o *.ko *.mod.c .hello*
Makefile里面代码具体代表什么意思,你们请参考这个pdf,网上资源很多。
然后把Hello.c和Makefile一起放到一个文件夹中,将其放到虚拟机文件夹下,比如 /usr/src/hello 文件夹下,在命令行执行make
此时已经编译出 hello.ko
在root权限下,加载模块
因为我是用Xshell连接的虚拟机,所以这里没有即时显示,输入dmesg命令可以看到内核打印log。
并且lsmod可以看到模块挂载成功 hello
卸载模块
输入dmesg
有打印,说明卸载成功。
这就是一个动态往内核加载驱动程序的过程。这里只是一个简单的打印,其余的各种驱动也可以这样动态加载。
还没有评论,来说两句吧...