内核驱动最简demo
hello.c
/**
* 当一个模块设备驱动被加载到内核时,一些通常要做的事情包括:设备复位,初始化RAM,初始化中断,初始化输入输出端口等。
* 这些动作在内核空间进行,通过这两个函数进行:module_init和module_exit,
* 它们和用户空间的用于安装和卸载模块的命令insmod和rmmod对应。
* 也可以说,用户空间的命令insmod和rmmod使用内核空间的函数module_init和module_exit进行。
*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk("<1> Hello world!\n");
return 0;
}
static void hello_exit(void)
{
printk("<1> Bye, hello world!\n");
}
module_init(hello_init);
module_exit(hello_exit);
/**
* 1. module_init(),module_exit():
* 实际上hello_init和hello_exit可以换成任何其他名称。
* 为了使系统能够正确的识别它们时加载和卸载函数,需要把它们作为module_init和module_exit的参数
*
* 2. printk()
* 他和我们熟悉的printf函数很相似,只不过它只在内核空间有效。
*/
Makefile
obj-m = hello.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