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